我有一些非保留关键字我与以下规则相匹配:
kFOO = {self.input.LT(1).text.lower() == 'foo'}? ID;
ID
令牌是标准的字母数字字符串。这些规则很有效,除非我尝试做这样的事情:
some_rule
@after { do_something_with($t.text) }
: t=kWORD1
| t=kWORD2
| t=kWORD3
;
在生成的解析器中,kWORD1
和kWORD2
规则函数不会返回任何内容,但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项目,所以更有可能是我不理解的事情。
我想在这里做什么是最好的方法?
答案 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']
;
未经测试。