【问题标题】:Not able to understand ANTLR parser rule无法理解 ANTLR 解析器规则
【发布时间】:2015-02-27 14:06:09
【问题描述】:

我是 ANTLR 的新手,并且正在浏览现有的语法(在 Internet 上获得)。看到给定的规则,我无法理解它的全部内容?

特别是在 Tree 构造和初始 (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))?
;

谢谢

【问题讨论】:

  • 您可能会阅读本书The Definitive ANTLR Reference: Building Domain-Specific Languages。还有一本 antlr4 书名非常相似。您可以在其中找到很好的示例以及对基本术语、概念等的很好解释。
  • 感谢您提供图书链接。我有些时间来阅读它。如果有人在寻找相同的问题,我正在回答我自己的问题。

标签: antlr antlr3


【解决方案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)*;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多