【问题标题】:How to parse this structure: "name[arg,arg]" with scala combinator parsers?如何使用 scala 组合器解析器解析这个结构:“name[arg,arg]”?
【发布时间】:2012-09-05 23:17:48
【问题描述】:

我有几个这样的字符串:

name[arg,arg,arg]
name[arg,arg]
name[arg]
name

我想用 scala 组合解析器解析它,这是我设法得到的最好的:

object TaskDepParser extends JavaTokenParsers {
  def name: Parser[String] = "[^\\[\\],]+".r
  def expr: Parser[(String, Option[List[String]])] = 
    name ^^ { a => (a, None) } |
    name ~ "[" ~ repsep(name, ",") ~ "]" ^^ { case name~_~args~_ => (name, Some(args)) }
}

它适用于name,但无法在name[arg] 上运行 - 表示string matching regex\z' 预期但[' found。有办法解决吗?

【问题讨论】:

  • 我认为如果你翻转它可能会起作用...我认为 name 被第一条规则所吸引,然后你输入失败?
  • @TonyK。 - 哇,愚蠢的我。你是对的,翻转它有效。您可以将其发布为答案,我会接受。

标签: parsing scala parser-combinators


【解决方案1】:

@TonyK 已经在他的评论中给出了答案。但我想建议 Scala 解析器组合器已经可以解析可选值:

object TaskDepParser extends JavaTokenParsers {
  def name: Parser[String] = """[^\[\],]+""".r
  def expr: Parser[(String, Option[List[String]])] =
    name ~ opt("[" ~> repsep(name, ",") <~ "]") ^^ { case name ~ args => (name, args) }
}

使用~&gt;&lt;~ 可以只保留左或右结果以避免^^ 中不必要的模式匹配。此外,我会为字符串使用三引号以避免大量转义。

【讨论】:

    【解决方案2】:

    我认为如果你翻转它可能会起作用...名称被第一条规则所吸引,然后你输入失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      相关资源
      最近更新 更多