0

ANTLR を使用して文法を書こうとしていますが、antlr が再帰的選択でどのように機能するかを理解できません。

たくさんの記事やフォーラムを読みましたが、問題を解決できません...

ここに私の文法の小さな部分があります:

grammar MyGrammar;

ComponentRef :
    IDENT ('[' Expression (',' Expression)* ']')?
;

Expression:
    ComponentRef ('(' FunctionArguments ')')?
;

FunctionArguments:
    Expression (',' Expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

なぜうまくいかないのか、いまだにわかりません… あいまいさはありません!ではない?

私の文法が動作するはずのコードの例を次に示します。

a
a[b,c]
a[b[c], d]
func(a)
func(a,b,c)
func[a](b,c)
func(a[b], c[d])
func[a](b[c])

よろしくお願いします!

4

2 に答える 2

6

まず、レクサーとパーサーのルールを理解してください。ANTLR メガ チュートリアルもお読みください。

このコードはレクサー規則のみを使用しているため、機能しません。lexer ルールでさえ(ANTLR 文法では) 再帰的である可能性がありますが、避けるのが最善です。むしろ、ほとんどのルールはパーサー ルールにする必要があります。

componentRef :
    IDENT ('[' expression (',' expression)* ']')?
;

expression:
    componentRef ('(' functionArguments ')')?
;

functionArguments:
   expression (',' expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

上記の文法は投稿した入力を認識しませんが、エラーはなくなりました。投稿した入力を認識する文法は、次のようになります (テストされていません!) 文法:

parse
 : expr* EOF
 ;

expr
 : IDENT (index | call)*
 ;

index
 : '[' expr_list ']'
 ;

call
 : '(' expr_list ')'
 ;

expr_list
 : expr (',' expr)*
 ;

IDENT
 : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
 ;

SPACE
 : (' ' | '\t' | '\r' | '\n')+ {skip();}
 ;
于 2012-06-12T11:10:05.930 に答える
-1

あなたのキャピトル式はエラーだと思います。おそらく小文字で入力するつもりでした。

曖昧さがないとどうして言い切れるの?式は functionArguments を呼び出し、functionArguments は式を呼び出します。-1

于 2018-02-14T19:34:26.507 に答える