以下JAVA谓词的语法

以下JAVA谓词的语法,java,antlr,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 ...

我正在尝试为以下代码编写产品(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可以处理左递归,但只能处理直接左递归规则:

(伪语法!)

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

我很确定,您可以让ANTLR创建AST,就像Eclipse使用一些奇特的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();};
在AntlR中调试解析器时,使用输入
a[I].b[a[p].x].id.xyz.a[c].o=I,正在生成以下AST:

编辑 规则:

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
IND
不会在最后一个AST中,因为它们不在
数组索引和
字段访问规则中,但如果你把它们放在那里,它就会有那个结构)。

@问题,这就像你学到的任何其他(新)东西一样:实践、实践和实践。:)@问题特伦斯(ANTLR的创作者)的书很棒,斯科特·斯坦菲尔德有一些非常好的视频教程,所有这些都在本问答中提到:谢谢!我不想在评论中进行更深入的讨论,但请您在回答中添加一点关于
查找
生产的内容。
$lookup
在两个
|
案例中意味着什么?@问题,我刚刚看到你最后的评论:今天晚些时候将编辑我的答案,并解释
$lookup
。在你可以解析这些之后,你打算做什么?@irabxter-静态分析要做到这一点,你需要的不仅仅是解析。请参阅我关于解析后的生活的文章:
lookup
 : NAME ( array_index^
        | field_access^
        )*
 ;
        FA
       /  \
     IND   B
     / \
    A   I
        FA
       /  \
      B   IND
          / \
         I   A