【发布时间】:2015-11-21 02:32:57
【问题描述】:
当遇到某个关键字时,编译器是否使用 if 语句?编写编译器的人在检查代码时是否应该将它们用于大多数操作?或者有没有更有效的方法?例如,当我根据符号表测试一个符号并且它作为一个有效的“令牌”返回时,我是否必须使用 if 语句来确定对每个关键字执行什么操作,因为它看起来相当低效,例如伪代码:
/*Each keyword/token in my compiler has a numerical representation which is what the symbol table returns back for example #define IF 0 and so on*/
if(Token == IF){
//This will be done to generate the AST representation for IF statements
}else if(Token == ELSE){
//This will be done to generate the AST representation of an if statement
}else if(Token == INT){
//This will be done to generate the AST represnetation of an integer
}
【问题讨论】:
-
注意:“符号表”有所不同,您在此处的使用具有误导性。你的意思是令牌。而且通常没有“令牌表”。您可能想了解编译器构造,例如经典的 Niklaus Wirth 同名书籍(免费下载,入门非常简单)..
-
不,我相信我的用法是完全可以接受的这里。但我确实同意你的观点,我应该澄清一下。
-
但这在编译器中不称为符号表!请正确理解条款。无论如何,这不是编译器(或解释器)的工作方式。不要为成熟的短语发明新的解释。当您提出问题时,这将导致您无处可去。
-
最终澄清。好的,所以看起来我只是感到困惑。 IDK 为什么我应该知道它的含义,因为我有时会在汇编程序中遇到重复符号错误。符号是特定类型的特定用户定义事物,而不是类型本身
-
简单地说:符号表是编译器在解析代码中查找名称定义以查找类型和其他属性(例如结构、联合、成员、变量/constant,可能是值等)如果遇到名称。没错。这些是解析器中的符号。对于扫描仪/词法分析器,符号是像
,、%、+这样的字符。这就是你在这里使用的。但是对于编译器上下文,它们并不那么相关,因为它们通常只是从输入中读取并由词法分析器形成标记。您通常没有要查找的表,但使用例如状态机。
标签: c compiler-construction lexical-analysis