使用バイソンでループを実装だから、私はこのコードを持ってBNF
シンボルcalcsetを定義する最初の二つのルールは、ループを実装する 改行で終了した式を読み込み、その値を出力します。 calclistの定義では、共通の2ルールの再帰的なイディオムを使用して、 はシーケンスまたはリストを実装します。最初のルールは空であり、 とは一致しません。 2番目の項目はリストに項目を追加します。 2番目の ルールのアクションは、expの値を$ 2で表示します。
"Flex and Bison"という本から。誰かがそのような構文がループを暗示する方法を教えてもらえますか?私はexp
の再帰を理解することができます(後で書かれていますが、ここでは無関係なので、私は含めません)。しかし、そのような構文を見て、私は最初のルールが何もマッチしないと考えることができます。したがって、最初のシンボルが標準入力ストリームから与えられ、2番目のルールを開始するまで無限ループを持ちます。しかし、私は第2のルールを理解していません。 exp
の部分にはどうして届きますか? calclist
に遭遇したときに再発することはありませんか?
わかりました。 calclist1 exp EOL => calclist2。私はBisonが入力ストリームを左から右に処理すると考えていました。つまり、 'calclist - > calclist - > calclist'の内部に入り続け、 'exp'セグメントには到達しません。今私は、右のルールはBisonが入力ストリームからパターンをマッチさせることですが、左から右に処理するのではないと思いますか? 'exp:exp exp '+''を定義することができます。これは明らかに一致するパターンですが、実際のコードではありません。通常、 'exp'の例は' exp:exp + exp'の形で書かれているので、実際の実装であると思いました。 – Amumu