BNFを書くときに{および}の間に何が入りますか?
-
27-09-2019 - |
質問
私はBNFにいくつかの問題を抱えています。物事を行う標準的な方法(ある場合)と思われるもの、そしてcharやintなどのタイプがあるかどうか、またはすでに組み込まれたものがあるかどうかはわかりません。
しかし、私の主な問題は、Curly BracesのBNFの一部がどのように機能するかを理解していないことです。
次のようなものを与えられました:
exp : term {$$ = $1;}
| exp '+' term {$$ = $1 + $3;}
| exp '-' term {$$ = $1 - $3;}
;
(これはどこかから手入れされ、YACC / Cのためです)
巻き毛の装具のことは実際に言っていることは何ですか?私はHappy Parserジェネレーターのために同様のことを見てきましたが、同様に混乱しています。
解決
一般的なBNF(およびEBNF)とYACC構文を区別する必要があります。 BNFでブレースが意味することは、方言によって異なります。多くの場合、「選択肢のいずれかを選択する」、または繰り返しに関連付けられるか、その両方を意味します。 EBNF(ISO 14977:1996)では、 '{...}'はゼロ以上を繰り返すことを意味し、 '{...} - 'は1回以上繰り返すことを意味します(そしてそれが「 - 」であり、 '+'は神秘的です)。 IETFは使用します RFC-5234 そして、BNFの方言は「{}」をまったく使用しません。
ただし、YACCの文法では、ブレースは、ルールが一致するときに実行されるアクションを囲みます(専門用語で削減)。だから、 '{$$ = $1;}
「アクションは、「用語」と一致する値を「exp :: =ターム」を削減した結果に割り当てることを意味します(BNFの別のバリアントを使用)。
他のヒント
Curly Braces内のものは、実際には、対応するルールが解析されたときに実行されるCコードです。 $
シンボルは、YACCによって解析された実際の値に置き換えられたプレースホルダーです。 $$
しばしば計算したい結果です $1
に $n
ルールの右側のシンボルの値を表します。
たとえば、ルール exp '+' term { $$ = $1 + $3; }
, $1
を参照 exp
と $3
それは term
, 、したがって、これはこのルールが解析されたら、追加すると言います exp
と term
結果を取得します。