文法に表現のサポートを追加しようとしています。私は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'
;
余分な目が必要です。私は何が欠けていますか?