1

私が抱えているのは、他にぶら下がっている問題だと思いますが、よくわかりません。私が書くことを任されている言語は、複数行の if ステートメントと単一行をサポートする必要があります。

if(conditions){
   print "multi";
   print "line";
}

if(conditions)
  print "single line"

私の言語で対応するもの

if conditions then begin
end

if conditions then

また、else-if と else のサポートも追加する必要があります。どちらも上記と同じ構文を begin と end で使用します。これを機能させるためにしばらく時間を費やし、近づいてきましたが、現在使用している文法では、「この入力には複数の有効な解釈があります...」というエラーが発生します。私が使用しているMGramarコードは次のとおりです。

syntax sIf = tIf conditions:Common.List(sBooleanExpression) tThen sBegin statements:sStatements2 (tEnd | tEnd2) next:Common.List(sElseIf)?
              => If{Conditions{conditions}, Body{statements}, Next{next}}
              | tIf conditions:Common.List(sBooleanExpression) tThen statement:sSingleStatement next:Common.List(sElseIf)?
              => SingleIf{Conditions{conditions}, Body{statement}, Next{next}}
              ;

syntax sElseIf = tElseIf conditions:Common.List(sBooleanExpression) tThen sBegin statements:sStatements2 (tEnd | tEnd2) next:Common.List(sElseIf)?
                => ElseIf{Conditions{conditions}, Body{statements}, Next{next}}
                | tElseIf conditions:Common.List(sBooleanExpression) tThen statement:sSingleStatement next:Common.List(sElseIf)?
                => ElseIf{Conditions{conditions}, Body{statement}, Next{next}}
                | e:sElse => e;


syntax sElse         = tElse tThen sBegin es:sStatements2 (tEnd | tEnd2) => Else{Body{es}}
                     | tElse statement:sSingleStatement => Else{Body{statement}}
                     ;

if/else if/else 構造を機能させるためにさまざまなことを試したので、これはおそらくこれの 10 番目のバージョンです。

基本的に、私の Main はステートメントの StatementList を取得します。sIf はその 1 つです。sIf は、複数行または単一行の if ステートメントの後に、オプションの sElseIf が続きます (else を持つ必要はありません)。

問題は、正規表現コンパイラが、sElseIf ステートメントではなく、sElse の後に sIf ステートメントが続く場合に、else if を認識している可能性があることだと思います。プレビュー モードでは、実際に希望どおりにツリーが描画されるため、C# アプリで解析するときにこのメッセージを無視する方法があれば、それもうまくいくと思います。

4

0 に答える 0