3

BNFで困っています。物事を行う標準的な方法(ある場合)と思われるものと、charやintなどの型、またはすでに組み込まれているものがあるかどうかはわかりません。

ただし、私の主な問題は、中括弧内の BNF の部分がどのように機能するかを理解していないことです。
次のようなものが与えられます:

exp    : term                           {$$ = $1;}  
| exp '+' term                   {$$ = $1 + $3;}  
| exp '-' term                   {$$ = $1 - $3;}  
;  

(これはどこかから簡単に盗まれたもので、yacc / C 用です)

中括弧内は実際に何を言っているのでしょうか? ハッピーパーサージェネレーターについても同様のことを調べましたが、同様に混乱しました。

4

2 に答える 2

2

中括弧内のものは、実際には、対応するルールが解析されるときに実行されるCコードです。$シンボルは、yaccによって解析された実際の値に置き換えられるプレースホルダーです。これは、ルールの右側にあるシンボルの値を表す$$一方で、計算したい結果です。$1$n

たとえば、ルールexp '+' term { $$ = $1 + $3; }は、$1を参照し、exp$3であるtermため、このルールを解析するときに、を追加exptermて結果を取得することを意味します。

于 2010-10-27T21:40:43.933 に答える
2

一般的な BNF (および EBNF) と Yacc 構文を区別する必要があります。BNF での中括弧の意味は方言によって異なります。多くの場合、「選択肢の 1 つを選択する」ことを意味するか、繰り返しに関連付けることができます。EBNF (ISO 14977:1996) では、'{ ... }' は 0 回以上繰り返すことを意味し、'{ ... }-' は 1 回以上繰り返すことを意味します (なぜそれが「+」は謎です)。IETF はRFC-5234を使用し、BNF の方言は「{}」をまったく使用しません。

ただし、Yacc 文法では、中括弧は、ルールが一致した場合に実行されるアクションを囲みます (専門用語では簡略化されています)。したがって、' {$$ = $1;}' アクションは、'term' に一致する値を、'exp ::= term' (BNF の別のバリアントを使用) を縮小した結果に代入することを意味します。

于 2010-10-27T21:45:24.027 に答える