あなたの文法は曖昧なので、あなたはシフト/削減の対立に耐えなければなりません。トークンは、括弧のペアのように、ステートメントが常に適切に閉じられるようENDにすることで、あいまいさを排除します。IF
ここでは、括弧がよく似ています。次のような文法があるとします。
maybe_closed_parens : '(' stuff
| '(' stuff ')'
;
stuffそれ自体がいくつかの文法記号を生成し、そのうちの1つはですmaybe_closed_parens。
したがって、のような入力がある場合((((((whatever、それは正しいです。括弧を閉じる必要はありません。しかし、追加するとどうなります)か?どちら(が閉まりますか?
IFこれは、どれがに一致するかがわからないのと非常によく似ていELSEます。
(の有無にかかわらず)ENDの構文に追加すると、閉じ括弧を付けるようなものになります。とのようなものです。IFELSEIFEND()
もちろん、あなたはEND自分の言語でその単語を望まないのはスタイル的に正しいです。なぜなら、あなたはすでに中括弧で囲まれたブロックを持っているからです。これは基本的にパスカルBEGINとの代替スペルですEND。あなた}はすでにENDキーワードです。
したがって、できることは、IF複合ステートメントのみを受け入れる(つまり、完全にブレースされている)というルールを課すことです。
if_statement : IF condition compound_statement
| IF condition compound_statement ELSE compound_statement
現在、中括弧が存在する必要があるため、if x if ywelsezのようなあいまいさを持つことは不可能ですif x { if y { w } else { z } } or if x { if y { w } } else { z }。
Perlがこの選択をした言語の一例であることを思い出しているようです。それはあなたの曖昧さを取り除くだけでなく、もっと重要なことにそれはプログラムから曖昧さを取り除くので、それは悪い考えではありません。
ステートメントが直接囲まれcompound_statementたフレーズを生成するため、文法にフレーズ構造規則がないことがわかります。このアプローチを取る場合は、それをハックする必要があります。{}