2011-01-13 74 views
4

我想在C语言中构建一个编译器。我现在写了一个词法分析器,它可以读取输入文件并输出一个令牌流。 现在,我理解语法背后的理论,并且我知道如何为不同的表达式手工编写解析树。 但我有点失落,将其与实际的代码相关联! 我得到令牌后应该如何开始解析过程? 首先,我的解析器程序在接收到第一个标记时应该做些什么?我知道它必须以树的形式排列。但我该如何开始? 任何帮助都会很棒,我只是一个初学者。一旦词法分析器返回一个标记,如何开始分析? (建立一个编译器)

非常感谢!


它处理当前令牌后的下一个令牌。现在,我打算假设我的语言完全由赋值语句组成。
所以,BNF形式是一样的东西:

<assignment_statement> ::= <destination> := <factor> 
<destination> ::= <identifier> 
<identifier> ::= [a-zA-Z][a-zA-Z0-9]* 
<factor > ::= <name>|<number>|<string> 
<name> ::= <identifier> 
<number> ::= [0-9]+ 
<string> ::="[a-zA-Z0-9]*" 

现在,当我看到这样的声明:var := 9,词法分析器将返回的第一个标记为“无功”,会出现什么父规则是和子规则是? 另外,我该如何去构建这个语句的解析树?

非常感谢!

回答

4

一种常见模式是让解析器请求令牌。解析器循环的形式通常是“读取下一个标记,确定如何处理它,更新部分解析的树,重复”,如果解析器本身调用词法分析器(而不是从第三个代码读取词法分析器并将令牌提供给解析器)。

当然,解析器的核心依赖于你正在使用的算法(递归下降,LR ...),但它通常包括确定新的标记是否符合你当前解析的规则(如查找一个-当阅读EXPR = '-' EXPR | ...),符合一个子规则(如找到class,当读DEF = CLASS | ...,如CLASS = 'class' ...)或根本不适合(在这一点上,你应该终止当前的规则,构建相应的AST节点,并重复父规则上的过程)。

递归下降解析器做到这一点与子调用(分则)和返回值(可以追溯到父规则),而RL解析器往往会压缩一些规则和分则成一个,要么转变留在当前的一组规则或减少终止规则并建立一个或多个AST节点。

+3

或者您可能想要使用YACC,或者更确切地说,它的盛大的孩子Bison。 – 2011-01-13 14:18:02