我在TreeWalker中不断收到NullPoiterException,但我似乎无法找到原因。
我无法发布整个语法,因为它太长了。
这是treeWalker中的规则,其中antlrWorks说问题是:
collection_name returns [MyType value]
: ID { $value = (MyType) database.get($collection_name.text); }
;
请注意,数据库是HashMap。
谢谢!
答案 0 :(得分:2)
我无法发布整个语法,因为它太长了。
以下是更多"可读"并且与原始规则完全相同:
collection_name returns [MyType value]
: ID { $value = (MyType) database.get($ID.text); }
;
或许做一些健全性检查:
collection_name returns [MyType value]
: ID
{
Object v = database.get($ID.text);
if(v == null) {
throw new RuntimeException($ID.text + " unknown in database!");
}
$value = (MyType) v;
}
;
正如您已经发现的那样,在树语法中无法访问规则的.text
属性(仅在解析器语法中)。在树语法中,每个规则都是Tree
类型,而是知道.start
和.end
属性。可以在解析器和树语法中访问相同的标记。所以$ID.text
可以正常工作。