gpt4 book ai didi

解析嵌套括号内包含的值

转载 作者:行者123 更新时间:2023-12-02 12:00:00 24 4
gpt4 key购买 nike

我只是在开玩笑,奇怪地发现在简单的递归函数中解析嵌套括号有点棘手。

例如,如果程序的目的是查找用户详细信息,它可能会从 {{name surname} Age}{Bob Builder Age},然后到鲍勃· builder 20

这是一个小程序,用于在大括号中求和,演示了这一概念。

  // Parses string recursively by eliminating brackets
def parse(s: String): String = {
if (!s.contains("{")) s
else {
parse(resolvePair(s))
}
}

// Sums one pair and returns the string, starting at deepest nested pair
// e.g.
// {2+10} lollies and {3+{4+5}} peanuts
// should return:
// {2+10} lollies and {3+9} peanuts
def resolvePair(s: String): String = {
??? // Replace the deepest nested pair with it's sumString result
}

// Sums values in a string, returning the result as a string
// e.g. sumString("3+8") returns "11"
def sumString(s: String): String = {
val v = s.split("\\+")
v.foldLeft(0)(_.toInt + _.toInt).toString
}

// Should return "12 lollies and 12 peanuts"
parse("{2+10} lollies and {3+{4+5}} peanuts")

任何可以替换 ??? 的干净代码的想法都会很棒。主要是出于好奇,我正在寻找解决此问题的优雅解决方案。

最佳答案

解析器组合器可以处理这种情况:

import scala.util.parsing.combinator.RegexParsers
object BraceParser extends RegexParsers {
override def skipWhitespace = false
def number = """\d+""".r ^^ { _.toInt }
def sum: Parser[Int] = "{" ~> (number | sum) ~ "+" ~ (number | sum) <~ "}" ^^ {
case x ~ "+" ~ y => x + y
}
def text = """[^{}]+""".r
def chunk = sum ^^ {_.toString } | text
def chunks = rep1(chunk) ^^ {_.mkString} | ""
def apply(input: String): String = parseAll(chunks, input) match {
case Success(result, _) => result
case failure: NoSuccess => scala.sys.error(failure.msg)
}
}

然后:

BraceParser("{2+10} lollies and {3+{4+5}} peanuts")
//> res0: String = 12 lollies and 12 peanuts

在熟悉解析器组合器之前需要进行一些投资,但我认为这确实值得。

帮助您破译上面的语法:

  • 正则表达式和字符串具有隐式转换,可以使用字符串结果创建原始解析器,它们的类型为 Parser[String] .
  • ^^运算符允许将函数应用于解析的元素
    • 它可以转换 Parser[String]进入Parser[Int]通过这样做^^ {_.toInt}
    • 解析器是一个 monad 且 Parser[T].^^(f)相当于 Parser[T].map(f)
  • ~ , ~><~要求一些输入按一定顺序排列
    • ~><~从结果中删除输入的一侧
    • case a ~ b允许对结果进行模式匹配
    • 解析器是一个 monad 且 (p ~ q) ^^ { case a ~ b => f(a, b) }相当于 for (a <- p; b <- q) yield (f(a, b))
    • (p <~ q) ^^ f相当于 for (a <- p; _ <- q) yield f(a)
  • rep1是 1 个或多个元素的重复
  • |尝试将输入与其左侧的解析器进行匹配,如果失败,它将尝试右侧的解析器

关于解析嵌套括号内包含的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075677/

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