如果某个关键字被激励,编译器在决定做什么时会使用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
}
答案 0 :(得分:2)
你的意思是什么样的编译器? 如果性能很重要,你可能需要像回调这样的方式,使用关键字作为键和回调函数作为值,所以伪代码看起来像这样:
func *fp = funcTbl.get(Token);
if (fp) { fp(); }
您也可以尝试递归下降。与关键字相关的函数在预期的位置被调用。
最后但并非最不重要的是,你写的也是好的。
答案 1 :(得分:1)
假设您已将源语言从字符串表示拆分为一系列词法标记,则下一步是使用 parser 从您的标记构建AST。
编译的解析阶段实现了两个主要目标:
编译器在决定如何处理时使用if语句 遇到某些关键字?
不,你的解析器应该分析一系列词汇标记,并根据你语言的语法结构检查它们。
解析是计算机科学中一个很好理解的主题,可以用不同的方式来解决。它不能在上面提供的示例代码片段中轻松实现。在现实的编程语言中,您需要考虑语法可能不明确,并且简单的预测解析器适用于所有语法,并且需要某种回溯。如果您不理解这个概念,我建议您使用Parser生成器,例如Bison。
此图显示了编译最重要阶段的简单概述,可帮助您了解其管道结构。
这个过程已经被许多学者提炼了几十年,关于如何最好地“分而治之”这样一项庞大的任务。我强烈建议你遵循它。
如需进一步阅读,请查看Modern Compiler Implementation in Java by Andrew Appel。