Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Antlr:决策可以与多个备选方案匹配(从非法令牌开始?)_Java_Antlr - Fatal编程技术网

Java Antlr:决策可以与多个备选方案匹配(从非法令牌开始?)

Java Antlr:决策可以与多个备选方案匹配(从非法令牌开始?),java,antlr,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>>>(); }

我在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;12;20;--ObjectiveFunction--MAX;x;12;x;16;0,5x;16;x;20;
“--Variables--”之后可以是任意多个变量,每个变量有四个字段,“--ObjectiveFunction--”之后是一个字段,然后是一个或多个字段,或者是任意多个四个字段的“pack”

显然,在使用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
我现在的问题是:

  • 输入怎么可能从OBJECTIVECAPTION开始呢?据我所知,我的语法输入必须从VARIABLESCAPTION开始
  • 要运行此语法,我需要更改什么

  • 错误消息可能有点含糊不清,但问题出在生产
    变量
    ,它定义了零次或多次出现
    变量
    。变量可以以错误消息中显示的输入开头,但是
    变量
    后面也可以跟在调用环境中出现的相同输入后面。因此,在
    变量
    (备选方案1)和完成变量(备选方案2)之间存在一个问题

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

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

    parseFile : VARIABLESCAPTION variables '.' OBJECTIVECAPTION objective ;
    

    按提问者编辑:

    我尝试了这种方法,效果很好,但只有当用作分隔符号的点被添加到必须忽略的字符列表中时,也就是说,必须修改
    字符
    的代码行:

    characters : ( ~(';' | '.') )*;
    
    在那之后,它工作得很好

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