gpt4 book ai didi

scala - 语法、Scala 解析组合器和无序集

转载 作者:行者123 更新时间:2023-12-04 11:45:43 24 4
gpt4 key购买 nike

我正在编写一个应用程序,它将接受各种“命令”字符串。我一直在查看 Scala 组合器库来标记命令。我发现在很多情况下我想说:“这些 token 是一个无序集合,因此它们可以按任何顺序出现,有些可能不会出现”。

以我目前的语法知识,我必须定义所有序列的组合(伪语法):

command = action~content
action = alphanum
content = (tokenA~tokenB~tokenC | tokenB~tokenC~tokenA | tokenC~tokenB~tokenA ....... )

所以我的问题是,考虑到 tokenA-C 是唯一的,是否有更短的方法来使用语法定义一组任何顺序?

最佳答案

您可以使用“解析器。^?”运算符来检查一组解析元素是否重复。

  def tokens = tokenA | tokenB | tokenC
def uniqueTokens = (tokens*) ^? (
{ case t if (t == t.removeDuplicates) => t },
{ "duplicate tokens found: " + _ })

这是一个示例,它允许您以任何顺序输入四个 stooges 中的任何一个,但如果遇到重复项则无法解析:
package blevins.example

import scala.util.parsing.combinator._

case class Stooge(name: String)

object StoogesParser extends RegexParsers {
def moe = "Moe".r
def larry = "Larry".r
def curly = "Curly".r
def shemp = "Shemp".r
def stooge = ( moe | larry | curly | shemp ) ^^ { case s => Stooge(s) }
def certifiedStooge = stooge | """\w+""".r ^? (
{ case s: Stooge => s },
{ "not a stooge: " + _ })

def stooges = (certifiedStooge*) ^? (
{ case x if (x == x.removeDuplicates) => x.toSet },
{ "duplicate stooge in: " + _ })

def parse(s: String): String = {
parseAll(stooges, new scala.util.parsing.input.CharSequenceReader(s)) match {
case Success(r,_) => r.mkString(" ")
case Failure(r,_) => "failure: " + r
case Error(r,_) => "error: " + r
}
}

}

以及一些示例用法:
package blevins.example

object App extends Application {

def printParse(s: String): Unit = println(StoogesParser.parse(s))

printParse("Moe Shemp Larry")
printParse("Moe Shemp Shemp")
printParse("Curly Beyonce")

/* Output:
Stooge(Moe) Stooge(Shemp) Stooge(Larry)
failure: duplicate stooge in: List(Stooge(Moe), Stooge(Shemp), Stooge(Shemp))
failure: not a stooge: Beyonce
*/
}

关于scala - 语法、Scala 解析组合器和无序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1781701/

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