综合百科

derivation编译原理

首先把变量声明语句的规则,用形式化的方法表达一下。它的左边是一个非终结符(Non-terminal)。右边是它的产生式(Production Rule)。在语法解析的过程中,左边会被右边替代。如果替代之后还有非终结符,那么继续这个替代过程,直到最后全部都是终结符(Terminal),也就是 Token。只有终结符才可以成为 AST 的叶子节点。这个过程,也叫做推导(Derivation)过程。

intDeclaration : Int Identifier (’=’ additiveExpression)?;

上面的文法翻译成程序语句,代码如下

SimpleASTNode node = null;

Token token = tokens.peek(); // 预读

if (token != null && token.getType() == TokenType.Int) { // 匹配 Int

token = tokens.read(); // 消耗掉 int

if (tokens.peek().getType() == TokenType.Identifier) { // 匹配标识符

token = tokens.read(); // 消耗掉标识符

// 创建当前节点,并把变量名记到 AST 节点的文本值中,

// 这里新建一个变量子节点也是可以的

node = new SimpleASTNode(ASTNodeType.IntDeclaration, token.getText());

token = tokens.peek(); // 预读

if (token != null && token.getType() == TokenType.Assignment) {

tokens.read(); // 消耗掉等号

SimpleASTNode child = additive(tokens); // 匹配一个表达式

if (child == null) {

throw new Exception("inval。