ルールのANTLRv3文法を作成することはできません。
FieldAccess -> Exp NAME
Exp -> FieldAccess
ANTLR v4は左再帰を処理できますが、直接左再帰ルールのみを処理できます。
Exp -> Exp '*' Exp
| Exp '/' Exp
| Exp '+' Exp
...
| Name
...
(疑似文法構文!)
しかし、v4は、直接左再帰ルールに対処することもできません。
FieldAccess -> Exp NAME
Exp -> FieldAccess
Eclipseがいくつかの凝ったAST書き換えルールを使用するのと同じように、ANTLRにASTを作成させることができると確信していますが、質問を編集して、入力a[i].b[a[p].x].id.xyz.a[c].o = i;
に必要なASTを「描画」(または画像を投稿)する必要があります。そして、私はそれに刺すかもしれません。
編集
これは、投稿したのと同様の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^
)*
;
最初の意志を除いて、入力に対して、次の"a[i].b"
ようなASTを作成します。
FA
/ \
IND B
/ \
A I
後者が「逆」ASTを作成する場合:
FA
/ \
B IND
/ \
I A
(もちろん、FA
andはandルールにIND
含まれていないため、最後のASTには含まれませんが、そこに配置すると、その構造になります)。array_index
field_access