自制编译器 青木峰郎 笔记 Ch7 JavaCC的action和AST

7.1 JavaCC中的Action

javacc的规则中可以声明,定义,计算和返回变量。

返回的语义值类型 非终端符号名 参数列表
{
      临时变量声明
} 
{
      规则{action}
}

e.g:

// #@@range/defstruct{
//设置返回类型为StructNode
StructNode defstruct():
{
//声明临时变量
    Token t;
    String n;
    List<Slot> membs;
}
{
    t=<STRUCT> n=name() membs=member_list() ";"
        {
//返回
            return new StructNode(location(t), new StructTypeRef(n), n, membs);
        }
}

要注意写在action之后的token也完全可能因为之前的Lookahead被扫描进来了
这里获取非终端符号语义值的方法就是n=name(),相当于调用name对应的解析并且将返回的值赋给n。
t=则将终端符号对应的Token赋给t。

终端符号-Token

上一篇:Hades:移动端静态分析框架


下一篇:详解AST抽象语法树