编程简单的编译器

时间:2011-03-27 10:22:33

标签: compiler-construction linked-list tokenize lexer

我正在编写一个简单语言的编译器。

我制作了一个lexer / tokenizer,它接收一个文件并在stdout打印令牌。

现在我想进行语法分析,但我不知道如何修改我的词法分析器以将标记作为输入。

  • 对于大型文件,链接列表效率极低(80MB左右的源文件占用大约1.3GB内存)
  • 我可以修改我的词法分析器,每次调用它时给出下一个标记(从龙书中获取的想法),但我不知道如果在这个过程的某个地方,我必须回去读一个以前的标记。

做这些事情的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

在词法分析器中实现nextToken()方法是标准方法。解析器(或语法分析器)调用此方法,直到整个输入都被使用。

  

但我不知道如果在这个过程的某个地方,我必须回去读一个先前的标记

通常情况并非如此。但是,解析器可能需要做的是“推回”已经看过的令牌(或许多令牌,取决于解析器的前瞻)。在这种情况下,词法分析器提供pushBack(Token),确保下一次调用nextToken()将返回提供的令牌,而不是输入中出现的下一个令牌。

答案 1 :(得分:0)

  

但我不知道如果在这个过程的某个地方,我必须回去读一个先前的标记

听起来你的比赛太贪心了。

您可以look into Backtracking