具有相同标签的多个替代品,只有最后一个获得分配给它的任何东西

时间:2011-08-15 05:48:52

标签: python antlr antlr3

我有一些非保留关键字我与以下规则相匹配:

kFOO = {self.input.LT(1).text.lower() == 'foo'}? ID;

ID令牌是标准的字母数字字符串。这些规则很有效,除非我尝试做这样的事情:

some_rule
@after { do_something_with($t.text) }
  : t=kWORD1
  | t=kWORD2
  | t=kWORD3
  ;

在生成的解析器中,kWORD1kWORD2规则函数不会返回任何内容,但kWORD3函数会返回。同样,在some_rule函数中,只有尝试匹配kWORD3的块才会将返回值分配给t。其他两个调用不以任何方式引用t

(另外,我希望以下工作有效,但事实并非如此,我怀疑是有同样的根本原因。

some_rule
@after { do_something_with($t.text) }
  : t=( kWORD1
  | kWORD2
  | kWORD3)
  ; 

在任何情况下都不会将任何内容分配给t。)

但是,以下DOES按预期工作:

some_rule
@after { do_something_with($t1.text or $t2.text or $t3.text) }
  : t1=kWORD1
  | t2=kWORD2
  | t3=kWORD3
  ;

生成每个匹配函数以返回值,并且与some_rule中的关键字规则匹配的每个块将返回值分配给其标签。这个解决方案的问题是,当有更多的替代方案时,它会有点过分。

我有一半喊“BUG!”但这是我做过的第一个antlr项目,所以更有可能是我不理解的事情。

我想在这里做什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

除了.toLower()永远不匹配FOO这一事实外, 我相信这是因为kWORD1是另一种类型的kWORD2等,但可能有用的是:

kWORD [String pre]
: {self.input.LT(1).text.lower() == $pre}? ID;

some_rule
@after { do_something_with($t.text) }
  : t=kWORD['word1']
  | t=kWORD['word2']
  | t=kWORD['word3']
  ;

未经测试。