我在 TreeWalker 中不断收到 NullPoiterException,但我似乎无法找出原因。
我无法发布整个语法,因为它太长了。
这是 treeWalker 中的规则,antlrWorks 说问题是:
collection_name returns [MyType value]
: ID { $value = (MyType) database.get($collection_name.text); }
;
请注意,数据库是一个 HashMap。
谢谢!
我在 TreeWalker 中不断收到 NullPoiterException,但我似乎无法找出原因。
我无法发布整个语法,因为它太长了。
这是 treeWalker 中的规则,antlrWorks 说问题是:
collection_name returns [MyType value]
: ID { $value = (MyType) database.get($collection_name.text); }
;
请注意,数据库是一个 HashMap。
谢谢!
我无法发布整个语法,因为它太长了。
以下内容更具“可读性”,并且与您的原始规则完全相同:
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的,并且知道 a.start和.end属性。在解析器语法和树语法中都可以访问相同的标记。所以$ID.text工作正常。