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