gpt4 book ai didi

python - 具有相同标签的多个备选方案,只有最后一个获得分配给它的任何东西

转载 作者:太空宇宙 更新时间:2023-11-04 06:27:09 25 4
gpt4 key购买 nike

我有一些非保留关键字,我正在使用以下规则进行匹配:

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 的 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']
;

虽然未经测试。

关于python - 具有相同标签的多个备选方案,只有最后一个获得分配给它的任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7062031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com