(LA)LRパーサーの欠点は、reduce がルールの最後でのみ処理されることです。これは、 のようなスコープ変数を持つプログラミング言語の問題ですjavascript
。
例:
var a = 2;
function (a) {
a = 4;
}
上記のコード例を参照してください。パーサーは次のようになります。
program : instruction program {}
| {}
;
instruction : command {}
| function {}
;
command : "var" identifier "=" literal ";" {}
;
function : "function" "(" arguments ")" "{" program "}" {/*1*/}
;
arguments : identifier {}
| identifier "," arguments {}
| {}
;
これで、識別子がパーサーによって消費されるたびに明らかになりました。識別子をレジスタに登録できます。ただし、問題は、関数 (行/*1*/
) が関数の最後でのみ考慮されることです。したがって、関数内で識別子 (; など) を使用する命令はa = 4
、パーサー時にローカル/グローバル識別子にバインドできません。
この問題に取り組むための良い方法は何ですか?そのような状況を処理するために C# (標準ライブラリ) が提供する機能は何ですか?