2012-01-11 19 views
1

使用バイソンでループを実装だから、私はこのコードを持ってBNF

シンボルcalcsetを定義する最初の二つのルールは、ループを実装する 改行で終了した式を読み込み、その値を出力します。 calclistの定義では、共通の2ルールの再帰的なイディオムを使用して、 はシーケンスまたはリストを実装します。最初のルールは空であり、 とは一致しません。 2番目の項目はリストに項目を追加します。 2番目の ルールのアクションは、expの値を$ 2で表示します。

"Flex and Bison"という本から。誰かがそのような構文がループを暗示する方法を教えてもらえますか?私はexpの再帰を理解することができます(後で書かれていますが、ここでは無関係なので、私は含めません)。しかし、そのような構文を見て、私は最初のルールが何もマッチしないと考えることができます。したがって、最初のシンボルが標準入力ストリームから与えられ、2番目のルールを開始するまで無限ループを持ちます。しかし、私は第2のルールを理解していません。 expの部分にはどうして届きますか? calclistに遭遇したときに再発することはありませんか?

答えて

4

二番目のルールは、あなたのようなラインを持っていたかのようにループを意味します

exp EOL exp EOL exp EOL exp EOL 

それらの「EXP EOL」Sのそれぞれは、それが別のcalclist内部に含まれます、calclistです。 したがって、ルールは以下のようなその行を減少させるであろう。

exp EOL exp EOL exp EOL exp EOL 
calclist1 exp EOL exp EOL exp EOL exp EOL < - Rule 1. calclist1 is [ ], the empty string. 
calclist2 exp EOL exp EOL exp EOL < - Rule 2. calclist2 is calclist1 exp EOL 
calclist3 exp EOL exp EOL < - Rule 2. calclist3 is calclist2 exp EOL 
calclist4 exp EOL < - Rule 2. calclist4 is calclist3 exp EOL 
calclist5 < - Rule 2. calclist5 is calclist4 exp EOL 

これは、それがループを作成することによって、意味です。引用した部分と同様に、これは、任意の長さの式のリストを作成するために文法を定義する際の共通の "イディオム"です。

あなたの質問にお答えしたいと思います。

ありがとうございます!

+0

わかりました。 calclist1 exp EOL => calclist2。私はBisonが入力ストリームを左から右に処理すると考えていました。つまり、 'calclist - > calclist - > calclist'の内部に入り続け、 'exp'セグメントには到達しません。今私は、右のルールはBisonが入力ストリームからパターンをマッチさせることですが、左から右に処理するのではないと思いますか? 'exp:exp exp '+''を定義することができます。これは明らかに一致するパターンですが、実際のコードではありません。通常、 'exp'の例は' exp:exp + exp'の形で書かれているので、実際の実装であると思いました。 – Amumu

1

もしこれが再帰的な降下パーサーであれば、私はそれがそうではないということを推測します。

関連する問題