0

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;

'--Variables--' の後は、それぞれ 4 つのフィールドを持つ任意の多くの変数になり、'--ObjectiveFunction--' の後は 1 つのフィールドになり、さらに 1 つのフィールドまたは 4 つのフィールドの任意の多くの「パック」になります。

どうやら、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. この文法を実行するには、何を変更する必要がありますか?
4

1 に答える 1

1

エラーメッセージは少しわかりにくいかもしれませんが、問題は本番環境にあり、variables0個以上の発生を定義していますvariable。変数は、エラーメッセージに示されている入力で開始できますがvariables、呼び出し環境で発生する同じ入力が後に続くこともあります。variablesしたがって、 (代替案1)で継続するか、それを完了する(代替案2)かを決定する際に問題があります。

したがって、エラーメッセージは完全な入力を参照するのではなく、によって照合される入力フラグメントを参照しますvariables。表示されている行番号は、問題が発生している製品を示しているはずです。

それを修正するために、リストに区切り文字を導入してvariable、たとえば、より多くのオカレンスの収集をいつ停止するかが明確になるようにすることができます。

parseFile : VARIABLESCAPTION variables '.' OBJECTIVECAPTION objective ;

アスカーによる編集:

私はこのアプローチを試しましたが、うまく機能しますが、分離記号として使用されるドットが無視する必要のある文字のリストに追加された場合、つまりのコード行をcharacters変更する必要がある場合に限ります。

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

その後、それはうまく機能します。

于 2012-08-07T17:42:25.427 に答える