无法理解ANTLR解析器规则

时间:2015-02-27 14:06:10

标签: antlr antlr3

我是ANTLR的新手,并且通过现有的语法(上网)。看到给定的规则,我无法理解它的全部内容?

Tree construct和initial(unary_expr - > unary_expr)中特别是$ model_expr。请帮我理解一下。

model_expr
:    (unary_expr -> unary_expr)
    (LEFT_BRACKET model_expr_element RIGHT_BRACKET
        -> ^(MODEL_EXPR[$LEFT_BRACKET] $model_expr model_expr_element))?
;

由于

1 个答案:

答案 0 :(得分:1)

使用示例(从书中复制)查看上述语法的详细说明

在重写规则中引用先前规则AST

有时你无法以纯粹的声明方式构建正确的AST。换句话说,在解析器匹配规则中的所有内容后执行单个重写是不够的。有时你需要迭代地建立AST。要迭代地构建AST,您需要能够引用当前规则的AST的先前值。您可以在重写规则中使用 $ r 来引用之前的值 r 是封闭规则。例如,以下规则匹配单个整数或一系列整数:

    expr : (INT -> INT) ( '+' i=INT -> ^( '+' $expr $i) ) * ;

(INT-> INT)子规则看似奇怪但有意义。它说匹配INT 然后使其AST节点成为expr的结果。这设置了结果AST 如果后面的(...)*子规则没有匹配。添加另一个 对于现有AST的整数,您需要创建一个新的“+”根节点 将前一个表达式作为左子项,将新整数作为 对的孩子。 具有嵌入式重写规则的语法识别相同的输入,并生成与使用构造运算符的以下版本相同的树:

    expr : INT ('+'^ INT)*;