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。