以下是我的语法规则:
Stmts: (stmts += Stmt ';')* ;
Stmt: Stmt1 | Stmt2 | Stmt3 ... ;
我想知道每个Stmt#是stmts中的#th stmt及其确切位置(原始文档中的#th行)。这样我可以在用户犯错时指出位置。
我覆盖验证器构造函数并存储HashMap <Stmt, Integer>
以使每个Stmt#是stmts中的#th stmt(不确定这是否是正确的方法......)。但是我不知道如何获得他们的行号。
任何帮助?
答案 0 :(得分:5)
给定一个EObject,您可以使用org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode(EObject)
轻松获取源文件中的位置。
例如:
INode node = NodeModelUtils.getNode(o);
System.out.println(String.format("Node goes from line %s to line %s",node.getStartLine(), node.getEndLine()));
答案 1 :(得分:0)
为了指出错误,只需编写一个声明性验证器就更合适了 - 在这种情况下,你只需要给出Xtext有问题的EObject,并设法将其追溯到源代码。此外,在您的语言项目中生成验证器存根。
但是,如果您需要手动追溯节点,可以使用Injectable ILocationInFileProvider来帮助您。