【问题标题】:NullPointerException with ANTLR text attribute具有 ANTLR 文本属性的 NullPointerException
【发布时间】:2011-04-14 15:00:18
【问题描述】:

我有一个问题困扰了一段时间,如果可能的话,我将不胜感激。

我在 ANTLR tree 语法中有几条规则:

block
  :  compoundstatement
  |  ^(VAR declarations) compoundstatement
  ;

declarations
  :  (^(t=type idlist))+
  ;

idlist
  :  IDENTIFIER+
  ;

type
  :  REAL
  |  i=INTEGER
  ;

我编写了一个 Java 类 VarTable,我将在源文件开头声明的所有变量插入到该类中。该表还将保存它们的变量类型(即实数或整数)。我还可以使用这个变量表来检查未声明的变量或重复声明等。

所以基本上我希望能够将变量类型从“声明”规则发送到“idlist”规则,然后遍历 idlist 规则中的每个标识符,将它们一一添加到我的变量表中。

我遇到的主要问题是,如果“声明”规则中的 $t 变量(这是一个引用类型的变量),当我尝试访问“文本”属性时,我得到了 NullPointerException。

然而,如果我尝试在“类型”规则中访问 $i 变量的“文本”属性,则没有问题。

我查看了 Java 文件中生成 NullPointerException 的位置,但对我来说仍然没有意义。

是否存在多种类型的问题,因为规则是

(^(typeidlist))+

??

当我开始使用 idlist 规则时,我遇到了同样的问题,因为我不确定如何编写一个操作来让我遍历找到的所有 IDENTIFIER 令牌。

感谢任何帮助或 cmets。

干杯

【问题讨论】:

  • 我认为这是树语法,而不是解析器语法。对吗?
  • 没错。这是一个树语法。很抱歉有歧义。
  • 没问题,乔,我也这么想,但想在回答之前先确认一下。

标签: antlr


【解决方案1】:

您不能像在树语法中尝试的那样从生产规则中引用属性,只能在解析器(或组合)语法中(它们是不同的对象!)。请注意,INTEGER 不是生产规则,只是一个“简单”令牌(终端)。这就是您可以调用其.text 属性的原因。

因此,如果您想在树语法中保留 type 规则的文本并在您的 declarations 规则中打印它,您可以执行以下操作:

tree grammar T;

...

declarations
  :  (^(t=type idlist {System.out.println($t.returnValue);}))+ 
  ;

...

type returns [String returnValue]
  :  i=INTEGER {returnValue = "[" + $i.text + "]";}
  ;

...

但如果你真的想在不指定返回对象的情况下这样做,你可以这样做:

declarations
  :  (^(t=type idlist {System.out.println($t.start.getText());}))+ 
  ;

注意type 返回一个TreeRuleReturnScope 的实例,它有一个名为start 的属性,而CommonTree 又是一个CommonTree 实例。然后,您可以在该 CommonTree 实例上调用 getText()

【讨论】:

  • 太棒了。谢谢回复。我已经看到在生成的 java 代码中返回 TreeRuleReturnScope 对象,但我必须检查 CommonTree 类的 api。再次感谢。五、有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2013-10-08
  • 1970-01-01
  • 2012-02-08
  • 2010-12-16
  • 2015-10-07
  • 1970-01-01
相关资源
最近更新 更多