1

(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# (標準ライブラリ) が提供する機能は何ですか?

4

1 に答える 1