无法为规则创建 ANTLR v3 语法:
FieldAccess -> Exp NAME
Exp -> FieldAccess
ANTLR v4可以处理左递归,但只能处理左递归规则:
Exp -> Exp '*' Exp
| Exp '/' Exp
| Exp '+' Exp
...
| Name
...
(伪语法语法!)
但是 v4 也无法处理您的直接左递归规则:
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();};
当我使用输入调试 ANTLRWorks 中的解析器时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^
)*
;
除了第一个将为 input"a[i].b"
创建一个这样的 AST:
FA
/ \
IND B
/ \
A I
后者将创建一个“反向”AST:
FA
/ \
B IND
/ \
I A
(当然,FA
andIND
不会在最后一个 AST 中,因为它们不在array_index
andfield_access
规则中,但如果你把它们放在那里,它就会有那个结构)。