Antlr 为什么这个语法给了我一个“;非LL(*)决定“;错误?
我试图在语法中增加对表达式的支持。我遵循的例子是。由于某些原因,添加规则导致错误。它导致一个非LL(*)错误,表示“决策可以使用多个备选方案匹配输入,如“'+'..'-'IDENT” 简单的输入,如:Antlr 为什么这个语法给了我一个“;非LL(*)决定“;错误?,antlr,antlrworks,Antlr,Antlrworks,我试图在语法中增加对表达式的支持。我遵循的例子是。由于某些原因,添加规则导致错误。它导致一个非LL(*)错误,表示“决策可以使用多个备选方案匹配输入,如“'+'..'-'IDENT” 简单的输入,如: a.b.c + 4 导致错误的原因。我正在使用AntlrWorks解释器测试我的语法。如何为一元+/-和add规则构建树似乎存在问题。我不明白为什么有两种可能的解析 语法如下: path : (IDENT)('.'IDENT)* //(NAME | LCSTNAME)('.'(NAME
a.b.c + 4
导致错误的原因。我正在使用AntlrWorks解释器测试我的语法。如何为一元+/-和add规则构建树似乎存在问题。我不明白为什么有两种可能的解析
语法如下:
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'
;
path:(IDENT)('.'IDENT)*/(NAME | LCSTNAME)('..(NAME | LCSTNAME))*
;
术语:路径
|“(“表达式”)”
|数
;
否定
: '!'* 学期
;
一元:(“+”|“-”)*否定
;
多:一元((“*”|“/”|“%”)一元)*
;
加:mult((“+”|“-”)mult)*
;
关系
:添加((“==”|“!=”|“=”|“>=”|“规则multiFunc
中的语法有一个表达式列表。表达式可以以+
或-
开头,代表一元
,因此,由于该列表的原因,它后面还可以跟相同的标记。这与添加
规则相冲突:在两者之间做出决定存在问题n延续和终止。规则multiFunc
中的语法有一个表达式列表。表达式可以以+
或-
开头,代表一元
,因此,由于该列表的原因,它后面还可以跟相同的标记。这与添加规则冲突:决定时有问题在继续和终止之间。让一个或多个表达式匹配的事实:
multiFunc
: IDENT expression+
;
使语法模棱两可。假设您正在尝试匹配“a 1--2”
使用multiFunc
规则。解析器现在有两种可能的解析方法:a
与IDENT
匹配,但两个减号1--2
会给表达式+
带来麻烦。以下两种解析是可能的:
解析1
解析2
允许一个或多个表达式匹配的事实:
multiFunc
: IDENT expression+
;
使语法模棱两可。假设您正在尝试匹配“a 1--2”
使用multiFunc
规则。解析器现在有两种可能的解析方法:a
与IDENT
匹配,但两个减号1--2
会给表达式+
带来麻烦。以下两种解析是可能的:
解析1
解析2
Ahhh!这很有意义。我必须想出一种不同的方法来创建参数列表。谢谢!顺便说一句,您提供的图形帮助了一个捆绑包。Ahhh!这很有意义。我必须想出一种不同的方法来创建参数列表。谢谢!顺便说一句,您提供的图形帮助了一个捆绑包。