4

私は Jison を使用して、変数を含む単純な電卓言語を構築しています。これらの変数を JavaScript と同様に機能させたいと考えています。つまりvar、最初にキーワードで初期化する必要があります。私の言語では、変数が再初期化された場合にエラーを表示したいと考えています。

var myVar = 4
var myVar = 3
// Error, cannot reinitialise variable myVar on line 2

私の質問は、AST ノードの行番号を取得するにはどうすればよいですか? 私の文法ファイルでは、パーサーからAssignVariableオブジェクトに行番号を渡すことができますが、これを行うためのより良い方法があるかどうか疑問に思っています。

stmt
    : 'PRINT' expr
        { $$ = new yy.Print($2) }
    | 'VAR' 'IDENTIFIER' 'ASSIGN' expr
        { $$ = new yy.AssignVariable($2, $4, $3); $$.lineNo = yylineno }
    | 'IDENTIFIER' 'ASSIGN' expr
        { $$ = new yy.SetVariable($1, $3, $2) }
    ;

他のタイプのエラー チェックのために、コンパイラの他のノードの行番号も必要になります。

この質問からのより高レベルのポイントは次のようになります: Jison (または同様のもの) を使用してコンパイル時エラーを検出して処理する最良の方法は何ですか?

4

1 に答える 1

5

コンパイラで生成されたパーサーにモンキー パッチを適用することで、AST ノードに行番号を挿入することができました。これはザックによって提案されました。手のひら

// load in your generated parser
var parser = require('./parser');

// store the current performAction function
parser._performAction = parser.performAction;

// override performAction
parser.performAction = function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
    // invoke the original performAction
    var ret = parser._performAction.call(this, yytext, yyleng, yylineno, yy, yystate, $$, _$);
    // Do your own stuff
    if (this.$._type) {
        this.$.lineNo = yylineno;
    }
    return ret;
}
于 2012-05-03T02:30:28.570 に答える