1

我在 TreeWalker 中不断收到 NullPoiterException,但我似乎无法找出原因。

我无法发布整个语法,因为它太长了。

这是 treeWalker 中的规则,antlrWorks 说问题是:

collection_name returns [MyType value]
    : ID { $value = (MyType) database.get($collection_name.text); }
    ;

请注意,数据库是一个 HashMap。

谢谢!

4

1 回答 1

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的,并且知道 a.start.end属性。在解析器语法和树语法中都可以访问相同的标记。所以$ID.text工作正常。

于 2012-08-22T16:12:33.613 回答