我正在尝试为基于C语言的自定义语言编译,该语言支持使用C ++和flex + bison对变量进行范围设定。我已经制作了词法分析器和解析器,但是我在使用作用域解决问题时遇到了问题。我在野牛解析器文件中实现了语义动作,例如。
while_stmt : WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); }
;
我遇到的问题是找到将新符号表放到上下文符号表堆栈上的时刻。由于它是一个自下而上的解析器,我不知道新块何时开始,就在它结束时,在执行缩减之后,对我来说为时已晚。我放在规则后面的代码在缩减后被扩展。
如何使用野牛解决这个问题?我现在头脑风暴一段时间没有解决方案。感谢。
答案 0 :(得分:1)
在编译器中,作用域是一种语义操作,通常不在解析级别处理,而是在语义树步行期间的后期处理。
如果您尝试在解析时执行此操作,则会遇到您已解释的问题。 解析仅用于检查令牌序列是否与语法匹配。其他所有内容都应该从解析时创建的解析树中执行。
这不是一个特定于野牛的问题。它适用于任何编译器和解析器(使用无上下文语法)。