Compiler construction Antlr 3.2。语法中的符号表(小C)

Compiler construction Antlr 3.2。语法中的符号表(小C),compiler-construction,code-generation,grammar,antlr3,symbol-table,Compiler Construction,Code Generation,Grammar,Antlr3,Symbol Table,我需要在几周内完成我的small-c到p代码编译器,但我真的很难理解如何制作符号表和后续代码生成阶段。我可以从哪里开始,我已经看到了几个例子,但我对整个概念理解得不太清楚 正如您在中所看到的,许多重写规则正在被使用,语法实际上相当长,不幸的是,从YACC语法派生出我们不需要的部分花了相当长的时间,但在这一点上,我不知道这是否会影响到我们以后尝试编写code-gen的过程 欢迎提供任何建议/提示,谢谢。这是一个相当广泛的问题,很难从整体上回答。你应该把更大的任务分解成更小的子任务,并在这里提问 总

我需要在几周内完成我的small-c到p代码编译器,但我真的很难理解如何制作符号表和后续代码生成阶段。我可以从哪里开始,我已经看到了几个例子,但我对整个概念理解得不太清楚

正如您在中所看到的,许多重写规则正在被使用,语法实际上相当长,不幸的是,从YACC语法派生出我们不需要的部分花了相当长的时间,但在这一点上,我不知道这是否会影响到我们以后尝试编写code-gen的过程


欢迎提供任何建议/提示,谢谢。

这是一个相当广泛的问题,很难从整体上回答。你应该把更大的任务分解成更小的子任务,并在这里提问

总的来说:在您的语言中,有一些规则可以为标识符(LHS)赋值,还有一些规则可以为表达式指定标识符,包括简单赋值(RHS)。这些是您必须在符号表中收集的符号。可能有更多符号,如类型或变量定义中的符号。所有这些都在语法树中。您可以通过定义语法规则来简化您的生活,使每个标识符类型都有自己的规则(具有自己的标记类型),如:

通过这种方式,您可以轻松识别符号表的相关标记。然后,您只需遍历语法树并从特殊标记中提取文本,这是一种直接的深度优先搜索

variable_name:
    identifier -> ^(VARIABLE_NAME identifier)
;

typedef_name:
    identifier -> ^(TYPEDEF_NAME identifier)
;