私が抱えているのは、他にぶら下がっている問題だと思いますが、よくわかりません。私が書くことを任されている言語は、複数行の 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# アプリで解析するときにこのメッセージを無視する方法があれば、それもうまくいくと思います。