Compiler construction 使用bison进行范围限定的语言编译器 我试图为一个定制的C语言编写编译器,它支持C++和Flex + BISON的变量范围。我已经做了一个lexer和parser,但是我在解决范围问题时遇到了困难。我已经在bison解析器文件中实现了语义操作,例如 while_stmt : WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); } ;

Compiler construction 使用bison进行范围限定的语言编译器 我试图为一个定制的C语言编写编译器,它支持C++和Flex + BISON的变量范围。我已经做了一个lexer和parser,但是我在解决范围问题时遇到了困难。我已经在bison解析器文件中实现了语义操作,例如 while_stmt : WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); } ;,compiler-construction,bison,lalr,Compiler Construction,Bison,Lalr,我遇到的问题是找到将新符号表放入上下文符号表堆栈的时机。由于它是一个自底向上的解析器,我不知道新块何时开始,何时结束,在执行缩减之后,对我来说已经太晚了。我放在规则后面的代码在缩减后被删除 如何用野牛解决这个问题?我正在头脑风暴一段时间,没有解决办法。谢谢。在编译器中,作用域是一种语义操作,通常不会在解析级别处理,而是在语义树漫游的后期处理 如果您在解析时尝试这样做,您就会陷入您已经解释的问题中。 解析仅用于检查标记序列是否与语法匹配。其他所有操作都应该从解析时创建的解析树中执行 这不是野牛特有

我遇到的问题是找到将新符号表放入上下文符号表堆栈的时机。由于它是一个自底向上的解析器,我不知道新块何时开始,何时结束,在执行缩减之后,对我来说已经太晚了。我放在规则后面的代码在缩减后被删除


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

在编译器中,作用域是一种语义操作,通常不会在解析级别处理,而是在语义树漫游的后期处理

如果您在解析时尝试这样做,您就会陷入您已经解释的问题中。 解析仅用于检查标记序列是否与语法匹配。其他所有操作都应该从解析时创建的解析树中执行


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

几分钟前,我发现什么似乎解决了我试图实现的问题。我已经实现了作用域符号表,如果我能够将操作放入mid规则中,那么我可以在出现LEFT_CBRACE时放入新的符号表,并在RIGHT_CBRACE终止块时将其从堆栈中弹出。我目前正在实施它,并让您知道它是如何结束的。