我有一个基于 Antlr 的脚本语言:一个解析器和一个构建运行时对象(例如语句)的树语法。当我在运行时处理语句时,我想知道原始源位置(例如,当我抛出错误时,我想在脚本源中声明行和位置。)
将源位置附加到我的运行时对象的最佳策略是什么?如果我没有要求太多,我希望对我的语法文件的影响尽可能小。
我试图将尽可能少的代码放入语法中以提高质量,例如我的(许多)表达式之一如下所示:
multiplyExpression returns [Expression value]
: ^('*' l=expression r=expression)
{
$value = sb.newBinaryExpression(CorIdentifier.MULTIPLY, $l.value, $r.value);
}
;
sb
我在哪里ScriptBuilder
充当生成的代码和我的运行时之间的适配器。我知道我可以将源位置作为附加参数添加到,newBinaryExpression
但我也必须触摸所有其他表达式。我希望我可以只将令牌流放入 sb 一次并从流中获取源位置而完全不影响语法源。
我希望,由于许多脚本语言都使用 Antlr,因此有一种标准方法来处理这个问题,因为源位置处理是一个方面,我不想让它在整个语法文件中杂乱无章,而不是非常干燥。