- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否可以实现经典Yacc lexer hack在 ANTLR4 生成的 C 解析器中区分标识符名称和类型名称,使用标准 C 语法(就像在官方 ANTLR4 GitHub 存储库中找到的那样)?
似乎可以插入 ANTLR4 词法分析器的临时代码非常有限。在“The Definitive ANTLR4 Reference”一书中,Terrence Parr 说:
"A common practice that s been around forever involves sending feedback from the parser to the lexer so that the lexer can send precise tokens to the parser. [...] Unfortunately, this is not possible with ANTLR grammars because ANTLR-generated parsers often look very far ahead in the token stream to make parsing decisions. [...]"
有什么方法可以规避上述情况并实现反馈循环?或者在访问解析树时不借助疯狂的 hack 就不可能在 ANTLR4 中实现 C 解析器?
最佳答案
谁说您必须向解析器询问任何内容才能实现词法分析器 hack?黑客在词法分析器中。
C lexer hack 的关键是让 lexer 本身记录哪些标识符是类型名。您可以通过跟踪发出的词法标记在词法分析器中执行此操作。有了足够多的广告曲棍球(这就是它被称为 hack 的原因),您的词法分析器可以识别“typedef .... x;”随着它的进行,并将“x”记录为词法分析器局部符号表中的类型。
然后当词法分析器遇到标识符时,根据其本地符号表恰好是类型名,词法分析器可以发出“type_identifier”而不是“identifier”。
如果 typedef 是作用域本地的,您的词法分析器也必须跟踪作用域结构,并在跨作用域边界扫描时相应地调整实时 typedef 表。
当然,只有当您知道自己使用的是 C 语言之类的语言时,此 hack 才有效,在这种语言中,解析器不会回溯标记,因为它们可能有不同的解析。 AFAIK,ANTLR 不会回溯。
(是的,如果解析器将提供对符号表的访问,它将其作为解析的某种副作用进行跟踪,您可以简单地让词法分析器查询该表,再次提供解析器't backtrack。使这个“安全”的原因大概是在执行词法分析器时,解析子系统没有在解析器中执行,因此符号表访问是安全的。如果你的词法分析器在解析器之前生成词素管道使用,然后它异步运行 WRT 到解析器,现在它不能使用解析器的符号表;你必须回到如上所述的词法分析器本地符号表。
关于c - 如何在 ANTLR 中为 C 解析器实现词法分析器 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927206/
我是一名优秀的程序员,十分优秀!