我不知道如何处理ANTLR语法的错误:
****************error message*********
Decision can match input such as "{'+', '-'} IDENT" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
|---> add: mult (('+'|'-') mult)*;
***************************************
这主要是从斯科特的例子中复制过的,但是我不明白为什么他的作品很好但我的卡住以及如何摆脱它?
---------------以下Sample.g ----------------
grammar Sample;
options {
language = Java;
}
program
: 'program' IDENT '='
(constant| variable)*
'begin'
(statement)*
'end' IDENT '.'
;
constant:
'constant' IDENT ':' type ':=' expression ';'
;
type: 'integer';
variable: 'var' IDENT (',' IDENT)* ':' type ';';
statement: 'var' IDENT ':=' INTEGER ';' ;
//expression
term: IDENT |'(' expression ')'|INTEGER;
negation: 'not'* term;
unary: ('+'|'-')* negation;
mult: unary (('*'|'/'|'mod') unary)*;
[以下行的XXX错误]
add: mult (('+'|'-') mult)*;
relation: add (('='|'/='|'<'|'<=') add)*;
expression: (relation ('and'|'or') relation)*;
END : 'end';
CONSTANT : 'constant';
INTEGER: '0'| (('1'..'9') ('0'..'9')*);
IDENT: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;
WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};
答案 0 :(得分:2)
您错放了一个括号:
expression: (relation ('and'|'or') relation)*;
使你的语法含糊不清:解析器无法决定何时看到- IDENT
它是否应该是add
- 或unary
- 规则的一部分。
例如,您的规则expression
现在符合以下条件:
relation ('and'|'or') relation relation ('and'|'or') relation
即,两个relation
规则直接放在彼此之后。如果解析器现在偶然发现这样的输入:
- A - B
解析器“看到”两种解析此输入的可能性:
应该是:
expression: relation (('and'|'or') relation)*;
相反,所以永远不会有2个连续的表达式(并且没有歧义!)。
答案 1 :(得分:2)
这主要是从斯科特的例子中复制过的,但我不明白为什么 他的作品很好但是我的卡住以及如何摆脱它?
这是因为您复制错误。
而不是如下所述的正确代码:
expression
: relation (('and' | 'or') relation)*
;
您已复制:
expression: (relation ('and'|'or') relation)*;
你能发现错误吗?例如,在关系之前放置'('
。因此,您收到错误 Decision can match input such as "{'+', '-'} IDENT" using multiple alternatives
:
<强> Solution
强>
将表达式规则替换为scotts样本中的内容。