我正在尝试在我的语法中添加对表达式的支持。我正在遵循Scott Stanchfield 的 Antlr Tutorial给出的示例。由于某种原因,添加规则导致错误。它导致非 LL(*) 错误说,“决策可以匹配输入,例如“'+'..'-' IDENT”,使用多种替代方案”
简单的输入如:
a.b.c + 4
导致错误。我正在使用 AntlrWorks Interpreter 来测试我的语法。如何为一元 +/- 和添加规则构建树似乎存在问题。我不明白为什么有两种可能的解析。
这是语法:
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'
;
我需要一双额外的眼睛。我错过了什么?