【问题标题】:antlr C grammar to create ASTantlr C 语法创建 AST
【发布时间】:2015-01-28 06:45:40
【问题描述】:

是否有任何可用的 C 语法生成 AST,其中包括使用“^”和“!”的所有解析器规则符号?

我浏览了 Terence Parr 写的书,写了这样一个语法,但似乎为 C 语言编写一个这样的语法是一个耗时的过程,所以想知道它是否已经可用,我可以节省很多时间!

(对于较小的 C 语言子集的语法也可以..)

谢谢:)

【问题讨论】:

  • @bart ,我想你搞错了,这不是 Vinod,对不起 :)
  • @bart,哈哈,我不知道你有这个疑问,反正看到你提到的其他个人资料,至少我已经包含了更多关于我的信息,我不能仅仅为了在这个中有一个差异身份而做网站:)
  • 好的,在这种情况下我会移除我的 cmets。祝你好运。
  • 您查看过 ANTLR.org 网站吗?我发誓我看过 C 语法。怀疑它是否处理预处理器指令。我知道我看过 C++ 语法,但它并不完全正确。
  • 有趣的是,Terrence Parr 写了一个 Antrl C 语法。 antlr.org/grammar/1153358328744/C.g 是你要找的吗?

标签: c antlr grammar abstract-syntax-tree


【解决方案1】:

this。它直接来自 ANTLR 4 源代码库:C11 语法。它看起来非常合规。

当然,它不附带预处理器,但首先将文件交给 cpp 或 mcpp 就很容易了。

它也没有附带 AST 规则,但看起来做起来并不难(尽管很耗时)。

【讨论】:

  • 嗯。语法似乎接受 X*Y 作为表达式和声明;没有什么可以明显区分这两种情况。我不认为 ANTLR4 处理(捕获)歧义,所以这是不对的。这是解析 C 和 C++ 的一个老问题:请参阅 stackoverflow.com/questions/243383/… 可以通过添加 C 的 LALR 解析器中常见的 hack 来修复此语法。
  • @IraBaxter 不应该先拿分支吗?
  • @vines:假设 ANTLR “走第一个分支”,那么无论 X * Y 的语法规则采用哪​​种方式编写,实际的语义解释可能是相反的(仔细阅读我引用的答案)。这意味着它不可能一直得到正确的解释......因此它有时会错误地解析程序。唯一的出路是接受 both 解析为有效,或者在提议时消除“错误”解析。我不相信 ANTLR 可以做到第一个,或者第二个可以在不实施与旧 C 解析器相同的可怕黑客攻击的情况下完成。
【解决方案2】:

两周后没有答案。

您是对的,构建了一个完整的解析器来构建完整的 AST 并处理 C 的所有细节(包括预处理器) 涵盖 C 的各种方言(例如,ANSI、GNU C 2/3/4/、Miscrosoft Visual C、Green Hills C)……实际上是很多工作。除非你投资这项工作,否则它不会处理任何真正的 C 程序。

考虑到 ANTLR 的年代久远,我希望 C 有一个完整的 ANTLR 语法。令人惊讶的是,这里似乎没有人能认出一个人。当然你会希望在 ANTLR 网站上找到它。

我们已经投入了构建此类 C 解析器(涵盖上述所有方言)所需的精力,并在 DMS Software Reengineering Toolkit 中添加了计算符号表、提取控制和数据流、构建调用图、启用分析器和树转换用它的C front end。此前端已应用于由 18,000 个编译单元组成的 C 应用程序,以构建自定义分析工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多