1

我正在使用 ANTRL,这是我的一些语法,它给我带来了错误。

statement
:     (name)(
    | BECOMES expression
    | LPAREN (expression (COMMA expression)*)? RPAREN
    | SHIFTLEFT name LPAREN (expression ( COMMA expression )*)? RPAREN
    )
    | OUTPUT LPAREN expression ( COMMA expression)* RPAREN
    | IF expression  THEN statement (ELSE statement)?
    | FOR name BECOMES expression TO expression DO statement
    | REPEAT statement UNTIL expression
    | WHILE expression DO statement
    | body
    | 
;

这是错误“Decision can match input such as "ELSE" using multiple alternatives ”。

我该如何解决?

4

1 回答 1

0

尝试使用回溯选项

options {
    backtrack = true;
}

描述

新功能(一个大功能)是语法、规则和块的 backtrack=true 选项,可让您输入任何旧的废话,如果 ANTLR 无法弄清楚您的意思,它将回溯。antlr 在分析过程中没有报告错误。它在每个产生式前隐式添加一个 syn pred,仅在静态语法 LL* 分析失败时使用它们。如果 pred 未在决策中使用,则不会生成 Syn pred 代码。这本质上是一种快速原型制作模式。这是我在 java.g 上使用的。哦,它现在不会在回溯期间自动记住部分解析(即规则解析结果)。您还必须说 memoize=true。打开可以产生巨大的差异。

于 2010-07-29T18:38:08.587 回答