使用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
相关产品推荐
相关产品推荐

