gpt4 book ai didi

c - 如何在 ANTLR 中为 C 解析器实现词法分析器 hack

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:09 27 4
gpt4 key购买 nike

是否可以实现经典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 到解析器,现在它不能使用解析器的符号表;你必须回到如上所述的词法分析器本地符号表。

( If you switch to a GLR parser, you can avoid the hack .)

关于c - 如何在 ANTLR 中为 C 解析器实现词法分析器 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com