1

我正在尝试在我的语法中添加对表达式的支持。我正在遵循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'
    ;

我需要一双额外的眼睛。我错过了什么?

4

2 回答 2

1

您让一个或多个表达式匹配的事实:

multiFunc   
 : IDENT expression+
 ;

使你的语法模棱两可。假设您正在尝试"a 1 - - 2"使用multiFunc规则进行匹配。解析器现在有 2 种可能的方式来解析它:a被 匹配IDENT,但是 2 个减号1 - - 2会导致expression+. 以下 2 种解析是可能的:

解析 1

在此处输入图像描述

解析 2

在此处输入图像描述

于 2012-07-16T19:38:18.790 回答
0

你的语法规则multiFunc有一个表达式列表。表达式可以以 开头+-代表unary,因此由于列表的原因,它也可以后跟相同的标记。这与add规则相冲突:在继续和终止之间做出决定存在问题。

于 2012-07-16T19:18:14.313 回答