gpt4 book ai didi

Scala:如何组合来自不同对象的解析器组合器

转载 作者:行者123 更新时间:2023-12-03 03:38:12 25 4
gpt4 key购买 nike

给定一系列实现解析器组合器的对象,如何组合解析器?自 Parsers.Parser是一个内部类,在 Scala 中 inner classes are bound to the outer object ,故事变得稍微复杂了。

这是一个尝试组合来自不同对象的两个解析器的示例。

import scala.util.parsing.combinator._

class BinaryParser extends JavaTokenParsers {
def anyrep: Parser[Any] = rep(any)
def any: Parser[Any] = zero | one
def zero: Parser[Any] = "0"
def one: Parser[Any] = "1"
}

object LongChainParser extends BinaryParser {
def parser1: Parser[Any] = zero~zero~one~one
}

object ShortChainParser extends BinaryParser {
def parser2: Parser[Any] = zero~zero
}

object ExampleParser extends BinaryParser {
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep

def main(args: Array[String]) {
println(parseAll(parser, args(0) ))
}
}

这会导致以下错误:

<console>:11: error: type mismatch;
found : ShortChainParser.Parser[Any]
required: LongChainParser.Parser[?]
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep

我已经找到了这个问题的解决方案,但是既然它被提出来了最近在 scala-user ML ( Problem injecting one parser into another ) 上,可能也值得将其放在这里。

最佳答案

快速的答案是使用 trait 而不是将解析器托管在 object 中:

import scala.util.parsing.combinator._

trait BinaryParser extends JavaTokenParsers {
def anyrep: Parser[Any] = rep(any)
def any: Parser[Any] = zero | one
def zero: Parser[Any] = "0"
def one: Parser[Any] = "1"
}

trait LongChainParser extends BinaryParser {
def parser1: Parser[Any] = zero~zero~one~one
}

trait ShortChainParser extends BinaryParser {
def parser2: Parser[Any] = zero~zero
}

object ExampleParser extends LongChainParser with ShortChainParser {
def parser: Parser[Any] = (parser1 ||| parser2) ~ anyrep

def main(args: Array[String]) {
println(parseAll(parser, args(0) ))
}
}

因为 ~| 等组合运算符是针对内部类编写的,因此可以通过 BinaryParser#Parser[_ 将解析器引用升级到类级别] 对你没有任何好处。使用特征可以解决所有内部类问题,因为 LongChainParserShortChainParser 中的 Parser[Any] 现在都引用 的内部类ExampleParser 对象。

关于Scala:如何组合来自不同对象的解析器组合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650254/

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