java - 以下 JAVA 谓词的语法

标签 java antlr

我正在尝试为以下代码编写作品 ( LL )

a[i].b[a[p]].id.xyz.a[c].o = i;

在Eclipse中使用ASTView,产生式是这样的

FieldAccess -> Exp NAME
Exp -> FieldAccess
FieldAccess -> ArrayAccess NAME
ArrayAccess -> ArrayAccess Exp
ArrayAccess -> FieldAccess 
Exp -> FieldAccess
.....

如何在 Antlr 中定义上述内容?它们是递归的,据我所知,JAVA 是 LL。

最佳答案

不可能为规则创建 ANTLR v3 语法:

FieldAccess -> Exp NAME
Exp         -> FieldAccess

ANTLR v4 可以处理左递归,但只能直接左递归规则:

Exp -> Exp '*' Exp
     | Exp '/' Exp
     | Exp '+' Exp
     ...
     | Name
     ...

(伪语法语法!)

但是 v4 也无法处理您的in直接左递归规则:

FieldAccess -> Exp NAME
Exp         -> FieldAccess

我很确定您可以让 ANTLR 创建一个 AST,就像 Eclipse 使用一些奇特的 AST 重写规则所做的那样,但是您将编辑您的问题并“绘制”(或发布图片)所需的 AST输入 a[i].b[a[p].x].id.xyz.a[c].o = i;,我可能会尝试一下。

编辑

这是一个小演示,说明如何在与您发布的内容类似的 AST 中解析您的示例输入:

grammar T;

options {
  output=AST;
}

tokens {
  ASSIGN;
  IND;
  FA;
}

parse
 : assign EOF -> assign
 ;

assign
 : lookup '=' expr ';' -> ^(ASSIGN lookup expr)
 ;

expr
 : lookup
 ;

lookup
 : (NAME -> NAME) ( array_index  -> ^(IND $lookup array_index)
                  | field_access -> ^(FA $lookup field_access)
                  )*
 ;

array_index
 : '[' expr ']' -> expr
 ;

field_access
 : '.' NAME -> NAME
 ;

NAME  : 'a'..'z'+;
SPACE : ' ' {skip();};

当我使用输入 a[i].b[a[p].x].id.xyz.a[c].o = i; 在 ANTLRWorks 中调试解析器时,正在生成以下 AST:

enter image description here

编辑

规则:

lookup
 : (NAME -> NAME) ( array_index  -> ^(IND $lookup array_index)
                  | field_access -> ^(FA $lookup field_access)
                  )*
 ;

无非就是这样:

lookup
 : NAME ( array_index^
        | field_access^
        )*
 ;

除了第一个,对于输入 "a[i].b",创建一个像这样的 AST:

        FA
       /  \
     IND   B
     / \
    A   I

后者会创建一个“反向”AST:

        FA
       /  \
      B   IND
          / \
         I   A

(当然,FAIND 不会在最后一个 AST 中,因为它们不在 array_indexfield_access 规则,但如果你把它们放在那里,它就会有那个结构)。

关于java - 以下 JAVA 谓词的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12718899/

相关文章:

java - 从广播接收器更新后显示 map

ANTLR 不明确的引用 - 如何获取输出?

parsing - 如何为规则中可以匹配多个项目的每一项执行 ANTLR 解析器操作?

java - 在验证日期方面需要帮助

java - 即使在类路径中包含 jar 文件后也无法在运行时找到类

java - 如何计算RESTful Web服务的响应时间

java - Scala中的迭代器删除

java - 神秘的 ANTLR 错误

c# - 我的 ANTLR 解析器(不是词法分析器)如何触发词法 "include"(不是 AST 拼接)?

antlr - 向 ANTLR 语法添加异常处理