質問

私は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, 、したがって、これはこのルールが解析されたら、追加すると言います expterm 結果を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top