Antlr:决策可以与多种替代方案匹配(从非法令牌开始?)

时间:2012-08-07 12:10:03

标签: java antlr

我在Antlr中有一个语法来解析我保存的文件的格式。我将语法分解为不起作用的部分,我希望有人可以澄清。这是语法:

grammar OptFile;

parseFile returns [java.util.List<java.util.List<java.util.List<String>>> list] :
{ list = new java.util.ArrayList<List<List<String>>>(); }
vc=VARIABLESCAPTION v=variables oc=OBJECTIVECAPTION o=objective
{ list.add($v.list); list.add($o.list); }
;

variables returns [java.util.List<java.util.List<String>> list] : 
{ list = new java.util.ArrayList<List<String>>(); }
(v=variable { list.add($v.list); } )*
;

variable returns [java.util.List<String> list] : 
{ list = new java.util.ArrayList<String>(); }
n=characters ';' t=characters ';' lb=characters ';' ub=characters ';' 
{ list = new java.util.ArrayList(); list.add($n.string); list.add($t.string); list.add($lb.string); list.add($ub.string); }
;

objective returns [java.util.List<String> list] :
{ list = new java.util.ArrayList<String>(); }
t=characters ';' { list.add($t.string); }
( 
      'PIECEWISE;' pw=piecewisefunction { list.add($pw.string); }
    | 'REGULAR;' rf=characters ';' { list.add($rf.string); } 
);  

piecewisefunction returns [String string] :
( characters ';' characters ';' characters ';' characters ';' )* 
{ string = getText(); }
;   

characters returns [String string] :
( ~(';') )* { string = getText(); }
;

VARIABLESCAPTION : '--Variables:--' ;

OBJECTIVECAPTION : '--ObjectiveFunction:--' ;

有效输入应如下所示:

--Variables--x;INTEGER;0;INFTY;y;CONTINUOUS;-12;13;--ObjectiveFunction--MAX;13x^27+SIN(y);

或者像这样

--Variables--x;INTEGER;12;20;--ObjectiveFunction--MAX;x;12;x;16;0,5x;16;x;20;

在' - 变量 - '之后可以是任意多个变量,每个变量有四个字段,在'--ObjectiveFunction--'之后是一个字段,然后是另外一个字段或任意多个“包”四个字段。

显然,在使用Antlr进行编译时,我收到以下错误:

warning(200): OptFile.g:26:37:
Decision can match input such as "OBJECTIVECAPTION {OBJECTIVECAPTION..VARIABLESCAPTION, 'PIECEWISE;'..'REGULAR;'} ';' 'PIECEWISE;' {OBJECTIVECAPTION..VARIABLESCAPTION, 'PIECEWISE;'..'REGULAR;'} ';' {OBJECTIVECAPTION..VARIABLESCAPTION, 'PIECEWISE;'..'REGULAR;'} ';' {OBJECTIVECAPTION..VARIABLESCAPTION, 'PIECEWISE;'..'REGULAR;'} ';' OBJECTIVECAPTION ';' 'PIECEWISE;'" using multiple alternatives: 1,2
As a result, alternative(s) 2 were disabled for that input

我现在的问题是:

  1. 如果输入甚至以OBJECTIVECAPTION开头,据我所知,我的语法输入必须从VARIABLESCAPTION开始。
  2. 我需要更改什么才能运行此语法?

1 个答案:

答案 0 :(得分:1)

错误消息可能有点神秘,但问题出在生产variables,它定义了variable的零次或多次出现。变量可以从错误消息中显示的输入开始,但variables也可以跟随在其调用环境中发生的相同输入。因此,在variables(替代方案1)和完成方案(替代方案2)之间的延续决定是否存在问题。

因此,错误消息不是指完整输入,而是指将由variables匹配的输入片段。显示的行号应指向显示问题的产品。

为了修复它,你可以为列表引入一个分隔符,这样就可以清楚地知道何时停止收集更多的variable,例如

parseFile : VARIABLESCAPTION variables '.' OBJECTIVECAPTION objective ;

Asker编辑:

我尝试了这种方法并且效果很好,但前提是将用作分隔符号的点添加到必须忽略的字符列表中,即必须修改characters的代码行:

characters : ( ~(';' | '.') )*;

之后,它运作得很好。