Skip to main content
 首页 » 编程设计

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

2025年05月04日11jackei

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

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

虽然未经测试。