Antlr 为什么这个语法给了我一个“;非LL(*)决定“;错误?

Antlr 为什么这个语法给了我一个“;非LL(*)决定“;错误?,antlr,antlrworks,Antlr,Antlrworks,我试图在语法中增加对表达式的支持。我遵循的例子是。由于某些原因,添加规则导致错误。它导致一个非LL(*)错误,表示“决策可以使用多个备选方案匹配输入,如“'+'..'-'IDENT” 简单的输入,如: a.b.c + 4 导致错误的原因。我正在使用AntlrWorks解释器测试我的语法。如何为一元+/-和add规则构建树似乎存在问题。我不明白为什么有两种可能的解析 语法如下: path : (IDENT)('.'IDENT)* //(NAME | LCSTNAME)('.'(NAME

我试图在语法中增加对表达式的支持。我遵循的例子是。由于某些原因,添加规则导致错误。它导致一个非LL(*)错误,表示“决策可以使用多个备选方案匹配输入,如“'+'..'-'IDENT”

简单的输入,如:

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!这很有意义。我必须想出一种不同的方法来创建参数列表。谢谢!顺便说一句,您提供的图形帮助了一个捆绑包。