gpt4 book ai didi

programming-languages - 如何从 AST 节点获取行号(Jison)

转载 作者:行者123 更新时间:2023-12-04 08:24:33 25 4
gpt4 key购买 nike

我正在使用 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(或类似的)检测和处理编译时错误的最佳方法是什么?

最佳答案

通过在我的编译器中对生成的解析器进行猴子修补,我能够将行号注入(inject)到我的 AST 节点中。这是 Zach 提出的。掌心

// 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;
}

关于programming-languages - 如何从 AST 节点获取行号(Jison),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10070047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com