我有一些非保留关键字,我正在使用以下规则进行匹配:
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 的 block 将返回值分配给 t。其他两个调用不以任何方式引用 t。
(此外,我预计以下内容会起作用,但我怀疑出于相同的根本原因,它并没有起作用。
some_rule
@after { do_something_with($t.text) }
: t=( kWORD1
| kWORD2
| kWORD3)
;
在任何情况下都不会为 t 赋值。)
但是,以下确实按预期工作:
some_rule
@after { do_something_with($t1.text or $t2.text or $t3.text) }
: t1=kWORD1
| t2=kWORD2
| t3=kWORD3
;
生成每个匹配函数以返回一个值,并且每个匹配 some_rule 中的关键字规则的 block 将返回值分配给它们的标签。这个解决方案的问题是当有更多的选择时它会变得有点过分。
我的一半都在喊“BUG!”但这是我完成的第一个 antlr 项目,所以更有可能是我不明白的地方。
做我想做的事情的最佳方法是什么?
请您参考如下方法:
除了 .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']
;
虽然未经测试。
