私はC#に似た言語のパーサーを作成しており、トップダウンとボトムアップの組み合わせが最適であると判断しました。基本的に、個々のステートメントを除くすべての場所でトップダウン構文解析を使用したいと思います。この理由は、操作の順序です。ボトムアップで実装する方がはるかに簡単であり、トップダウンパーサーで他のすべてを実装する方がはるかに簡単です。
これの実際の実装は次のとおりです。通常のように一致するトップダウン解析から始めます。次に、ルールの1つに、「ボトムアップ」としてマークされたルールがあります。X
トークンは入力lex配列から取り出され、ボトムアップ(別名shift-reduce)で「クランチ」されて単一のトークンになり、そのトークンはトップダウンの一致に配置されます。トップダウンは残りの試合で続きます。
私の問題/質問は、この番号を取得する方法X
です。シフトリデュースするために、入力トークンストリームからいくつのトークンを取り出しますか?私の最初の解決策は単純でした-セミコロンに達するまでそれらを取ります。しかし、ifステートメントのようなものはどうですか?これらの式の最後にはセミコロンはありません。
私の元の計画の例を挙げましょう。それはおそらくぎこちないように聞こえるからです。文法セットが次のようになっているとします。
(top-down) statement ::= <expression> ";"
(bottom-up) expression =
multiplication ::= <number> "*" <number>
addition ::= <number> "+" <number>
それからそれはそのように減少するでしょう:
3 + 4 * 2 ;
((bottom-up) 3 + 4 * 2) ;
3 + 4 * 2
3 + multiplication
addition
addition ;
statement
繰り返しになりますが、私の問題は、shift-reduceするトークンの数を取得する方法です。「3+4 * 2」のすべてをシフトリデューサーに配置したいことをどうやって知ることができますか?