2016-07-06 1 views
1

ラスカルでは、プロダクションのオプション部分の位置にレイアウトがあると、あいまいさが生じるのはなぜですか?例えば。 "{ }"Start1としてあいまいですが、次の文法からはStart2というように正確に解析されますが、これはまったく同じであると予想されます。またプロダクションのオプション部分のレイアウトがあいまいになるのはなぜですか?

layout Layout        = " "?; 
start syntax Start1       = "{" "c"? "}"; 
start syntax Start2       = "{" "c" "}" 
              | "{" "}"; 

、私は同じ曖昧さを生じさせないStart1よりも重複せずにStart2を表現する別の方法があるかどうかを知りたいと思います。

明らかにこのコードには重複はありません。ここではStart2が良いオプションですが、これは単なる例です。私は3つまたは4つのオプション部分を含む多くのプロダクションで文法を扱っています。最後のケースでは、Start2に表示されている表記は、プロダクション2〜4 = 16回の非オプション部分を複製する必要があります。意見。

パーサがこれに似たものに生成される前に、あなたの文法が最初に拡張され

答えて

1

:だから

layout Layout       = " "?; 
syntax " "?       = | " "; 
syntax Start1       = "{" Layout "c"? Layout "}"; 
syntax "c"?       = | "c"; 
lexical " "       = [\ ]; 
lexical "c"       = [c]; 
lexical "{"       = [{]; 
lexical "}"       = [}]; 
syntax Start2       = "{" Layout "c" Layout "}" 
             | "{" Layout "}"; 
syntax start[Start1] = Layout Start1 Layout; 
syntax start[Start2] = Layout Start2 Layout; 

入力用{ }(カーリーとの間のスペース)のように、スペースが最初のインスタンスによって導出することができますStart1ルールの右側にあるレイアウト、またはLayoutの2番目のインスタンスでレイアウトします。パーサーはすべての派生ツリーを生成するので、この場合は両方とも、構文解析はであいまいです。そうです。

layout Layout = " "? !>> " " 

又は(同等に)ようなので:

layout Layout = " "? !>> [\ ] 

制限の制約として作用

典型的曖昧さはそうのようなフォロー制限を使用貪欲を導入することによって解決されますレイアウトルール:それに続くスペースがある場合、空の文字列でさえも何も派生しません。これにより、最初の派生のみが有効になり、スペースはStart1の最初のLayoutインスタンス内に入ります。この後、制約を満たす}があり、解析はあいまいではありません。

+0

詳細な回答ありがとうございます。文法がどのように拡張され、解が分かりやすいかを見たとき、私は本当にはるかに意味がありました。これは必要だと思うけど、まだ少し奇妙だと思う。 レイアウトの場所を気にしないときに疑問符(およびアスタリスク)のバリアントを使用すると便利ではないでしょうか?私はこれがかなり使用されるだろうと想像することができます。 –

+0

はい、私たちもそれについて考えました。しかし熱望している?または*は、非常に予想外でデバッグが難しい解析エラーに簡単につながる可能性があります。その点では、解析エラーよりもあいまいさを修正する方が簡単です。宣言的な曖昧さ除去は、解析エラーを導入することもできますが、少なくとも明示的に可視です。それにもかかわらず、文脈自由な部分を一般的に保ちながら、規則的なトークンのサブ言語のために語彙レベルに熱心なセマンティクスを導入することを考えている。今後の仕事! – jurgenv

関連する問題