1

文法に表現のサポートを追加しようとしています。私はScottStanchfieldのAntlrチュートリアルによって与えられた例に従っています。何らかの理由で、追加ルールがエラーを引き起こしています。これは、「決定は複数の選択肢を使用して「'+' ..'-'IDENT」などの入力と一致する可能性があります」という非LL(*)エラーを引き起こしています。

次のような単純な入力:

a.b.c + 4

エラーが発生します。私はAntlrWorksインタープリターを使用して、文法をテストしています。単項+/-と追加ルールのツリーの構築方法に問題があるようです。解析の可能性が2つある理由がわかりません。

文法は次のとおりです。

path    :   (IDENT)('.'IDENT)* //(NAME | LCSTNAME)('.'(NAME | LCSTNAME))*
    ;

term    :   path
    |   '(' expression ')'
    |   NUMBER
    ;

negation 
    :   '!'* term
    ;

unary   :   ('+' | '-')* negation

    ;

mult    :   unary (('*' | '/' | '%') unary)*
    ;

add     :   mult (( '+' | '-' ) mult)*
    ;

relation 
    :   add (('==' | '!=' | '<' | '>' | '>=' | '<=') add)*
    ;

expression
    :   relation (('&&' | '||') relation)*
    ;

multiFunc   
    :   IDENT expression+
    ;

NUMBER  :   DIGIT+ ('.'DIGIT+)?
    ;

IDENT   :   (LCLETTER|UCLETTER)(LCLETTER|UCLETTER|DIGIT|'_')*
    ;

COMMENT
        :       '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |       '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
        ;

WS  :   (' ' | '\t' | '\r' | '\n' | '\f')+ {$channel = HIDDEN;}
    ;

fragment
LCLETTER 
    :   'a'..'z'
    ;

fragment
UCLETTER:   'A'..'Z'
    ;   

fragment
DIGIT   :   '0'..'9'
    ;

余分な目が必要です。私は何が欠けていますか?

4

2 に答える 2

1

1つ以上の式を一致させるという事実:

multiFunc   
 : IDENT expression+
 ;

文法が曖昧になります。ルール"a 1 - - 2"を使用して一致させようとしているとしましょう。multiFuncパーサーには、これを解析するための2つの可能な方法があります。aはによって一致しますIDENTが、2つのマイナス記号は。1 - - 2の問題を引き起こしexpression+ます。次の2つの解析が可能です。

解析1

ここに画像の説明を入力してください

解析2

ここに画像の説明を入力してください

于 2012-07-16T19:38:18.790 に答える
0

ルールの文法にmultiFuncは式のリストがあります。式は、で開始すること+も、-に代わって開始することもできますunary。したがって、リストにより、同じトークンを後に続けることもできます。これはルールと矛盾していaddます。継続と終了のどちらを決定するかという問題があります。

于 2012-07-16T19:18:14.313 に答える