以下JAVA谓词的语法
我正在尝试为以下代码编写产品(LL)以下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 ...
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