ラスカルでは、プロダクションのオプション部分の位置にレイアウトがあると、あいまいさが生じるのはなぜですか?例えば。 "{ }"
はStart1
としてあいまいですが、次の文法からはStart2
というように正確に解析されますが、これはまったく同じであると予想されます。またプロダクションのオプション部分のレイアウトがあいまいになるのはなぜですか?
layout Layout = " "?;
start syntax Start1 = "{" "c"? "}";
start syntax Start2 = "{" "c" "}"
| "{" "}";
、私は同じ曖昧さを生じさせないStart1
よりも重複せずにStart2
を表現する別の方法があるかどうかを知りたいと思います。
明らかにこのコードには重複はありません。ここではStart2
が良いオプションですが、これは単なる例です。私は3つまたは4つのオプション部分を含む多くのプロダクションで文法を扱っています。最後のケースでは、Start2
に表示されている表記は、プロダクション2〜4 = 16回の非オプション部分を複製する必要があります。意見。
詳細な回答ありがとうございます。文法がどのように拡張され、解が分かりやすいかを見たとき、私は本当にはるかに意味がありました。これは必要だと思うけど、まだ少し奇妙だと思う。 レイアウトの場所を気にしないときに疑問符(およびアスタリスク)のバリアントを使用すると便利ではないでしょうか?私はこれがかなり使用されるだろうと想像することができます。 –
はい、私たちもそれについて考えました。しかし熱望している?または*は、非常に予想外でデバッグが難しい解析エラーに簡単につながる可能性があります。その点では、解析エラーよりもあいまいさを修正する方が簡単です。宣言的な曖昧さ除去は、解析エラーを導入することもできますが、少なくとも明示的に可視です。それにもかかわらず、文脈自由な部分を一般的に保ちながら、規則的なトークンのサブ言語のために語彙レベルに熱心なセマンティクスを導入することを考えている。今後の仕事! – jurgenv