我是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))?
;
由于
答案 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)*;