1

Python のような言語には、同時 (または「マルチウェイ」) 割り当てがあることを知っています。今日の試験で、私は次のような問題に出くわしました

a,b = 1, 1+0;が渡された場合、問題なく解析されますがエラーが返されるように、同時割り当て用の文法の生成を記述a,b,c = 1, 1+0します (つまり、id の数は式と同じである必要があります)。エラーは構文エラーである必要があります。

私はこれで理解しました:

文法の属性を記述する必要はありません (構文のみだったため)。

私は助けになるかもしれないヒントをあちこち探してみましたが、文法の書き方を教えられた方法でそれを解決する方法はまだありません. これは私がこれまでに持っているものです:

P -> id Id_Tail = exp exp_Tail
Id_Tail -> , id Id_Tail
Id_Tail -> ε
exp_Tail -> , exp exp_Tail
exp_Tail -> ε
exp -> //assume this is is defined well enough to allow for all type of expressions that will generate/have a num (value) that is allowed to be assigned to the respective id

ただし、これにより、必要な構文エラーが生成されることはありません (id よりも多くの式が生成され続ける可能性があります)。

4

1 に答える 1

1

これは、単純な通常の文法では処理できないが、文脈自由文法では処理できる文法の例です。識別子リストは通常​​、に似たいくつかのプロダクションによって処理されますが、

ids = id
    | id ',' ids

この場合、句読点のバランスをとる際に与えられたものに似たアプローチを取る必要があります。

expr = ... 
     | '(' expr ')'

ルールが展開されるたびに左右の括弧が追加されるため、適切なバランスが達成されます。複数代入式についても同様のことができます。

multiway-assignment = lvalue '=' rvalue                         
                    | lvalue ',' multiway-assignment ',' rvalue

ここで、基本的な多方向代入では、代入演算子の両側に左辺値と右辺値があります。中央再帰により、左側の左辺値のすべての値が右側の右辺値と一致する必要があるため、左辺値の数は常に右辺値の数と等しくなります。

于 2013-08-27T18:44:47.943 に答える