编写编译器时,如何检查令牌?

时间:2015-11-21 02:32:58

标签: c compiler-construction lexical-analysis

如果某个关键字被激励,编译器在决定做什么时会使用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
}

2 个答案:

答案 0 :(得分:2)

你的意思是什么样的编译器? 如果性能很重要,你可能需要像回调这样的方式,使用关键字作为键和回调函数作为值,所以伪代码看起来像这样:

func *fp = funcTbl.get(Token);
if (fp) { fp(); }

您也可以尝试递归下降。与关键字相关的函数在预期的位置被调用。

最后但并非最不重要的是,你写的也是好的。

答案 1 :(得分:1)

假设您已将源语言从字符串表示拆分为一系列词法标记,则下一步是使用 parser 从您的标记构建AST。

编译的解析阶段实现了两个主要目标:

  • 它检查你的语言是否有语法正确性,如果根据你的语法结构无法解析你的输入,就会抛出错误。
  • 它生成源代码的AST表示
  

编译器在决定如何处理时使用if语句   遇到某些关键字?

不,你的解析器应该分析一系列词汇标记,并根据你语言的语法结构检查它们。

解析是计算机科学中一个很好理解的主题,可以用不同的方式来解决。它不能在上面提供的示例代码片段中轻松实现。在现实的编程语言中,您需要考虑语法可能不明确,并且简单的预测解析器适用于所有语法,并且需要某种回溯。如果您不理解这个概念,我建议您使用Parser生成器,例如Bison

此图显示了编译最重要阶段的简单概述,可帮助您了解其管道结构。

enter image description here 这个过程已经被许多学者提炼了几十年,关于如何最好地“分而治之”这样一项庞大的任务。我强烈建议你遵循它。

如需进一步阅读,请查看Modern Compiler Implementation in Java by Andrew Appel