3

次のコードのプロダクション ( 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 です。

4

1 に答える 1

3

ルールの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

(もちろん、FAandはandルールにIND含まれていないため、最後のASTには含まれませんが、そこに配置すると、その構造になります)。array_indexfield_access

于 2012-10-05T07:12:41.710 に答える