You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scala.util.parsing.combinator时重复组无法正确捕获如何解决

问题根因

refArgDot规则的映射逻辑没有返回匹配结果:^^后的代码块仅执行了println打印操作,Scala代码块默认返回最后一行表达式的返回值,而println返回的是Unit类型的(),因此refArgDot.*收集到的重复匹配结果都是(),最终ref的解析结果列表就呈现为List((), ()),丢失了实际的ZDOT和ZVAR组合结构。

修复方案

修改refArgDot的映射逻辑,打印完成后显式返回匹配到的结构即可。如果需要上层define规则能获取到完整的解析结果,也建议同步修改ref的映射逻辑,打印后返回完整匹配结果:

def varToken: Parser[ZVAR] = """[A-Za-z_][A-Za-z_0-9]*""".r ^^ { str => println("varToken: "+str);ZVAR(str) }
def number: Parser[ZNUMBER] = """-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d*)?""".r ^^ { str => ZNUMBER(str) }
def dot: Parser[ZDOT] = """\.""".r ^^ { _ => ZDOT() }

def ref: Parser[_] = varToken ~ refArgDot.* ^^ {r => println("ref: "+r); r} 
def refArgDot = dot ~ varToken ^^ { a => println("Dot: "+a); a}
val define = ref ~ number.*

修改后再次运行测试,ref的输出就会符合你的预期,列表中会保留所有ZDOT()~ZVAR(xxx)的匹配结构。

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:15:03