2

我正在尝试为基于 C 的自定义语言制作一个编译器,该编译器支持使用 C++ 和 flex + bison 对变量进行范围界定。我已经制作了一个词法分析器和解析器,但我在解决范围界定问题时遇到了麻烦。我在野牛解析器文件中实现了语义动作,例如

while_stmt  :   WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); }
            ;

我遇到的问题是找到将新符号表放入上下文符号表堆栈的时刻。由于它是一个自下而上的解析器,我不知道新块何时开始,就在它结束时,在执行归约之后,对我来说为时已晚。我放在规则后面的代码在减少后被执行。

如何使用野牛解决这个问题?我现在正在头脑风暴一段时间,没有解决方案。谢谢。

4

1 回答 1

2

在编译器中,作用域是一种语义动作,通常不在解析级别处理,而是在语义树遍历的后期处理。

如果您尝试在解析时执行此操作,则会遇到您已解释的问题。解析仅用于检查标记序列是否与语法匹配。其他一切都应该从解析时创建的解析树中执行。

这不是野牛特定的问题。它适用于任何编译器和解析器(使用上下文无关语法)。

于 2015-07-12T19:11:57.800 回答