【问题标题】:Not ordered parsers in Scala parser combinatorsScala 解析器组合器中的无序解析器
【发布时间】:2017-06-04 23:11:33
【问题描述】:

我需要以无序的方式解析单词。现在我可以看到以下内容

def first: Parser[String] = ???    
def second: Parser[String] = ???
def unordered = (first ~ second) | (second ~ first)

但我想知道是否有任何本地解决方案?

【问题讨论】:

    标签: scala parsing parser-combinators


    【解决方案1】:

    我通过将 ~| 解析器组合成名为 $ 的自定义解析器来实现这一点

    看起来类似于~

    trait ExtParsers extends JavaTokenParsers {
      def unordered[T,U](tp: Parser[T], tu: Parser[U]): Parser[$[T, U]] =
        tp ~ tu ^^ { case (x ~ y) => $(x, y) } | tu ~ tp ^^
          { case (x ~ y) => $(y, x) }
    
      case class $[+a, +b](_1: a, _2: b)
    
      implicit class ExtParser[+T](val parser: Parser[T]) {
        def $[U](tu: Parser[U]): Parser[$[T, U]] = unordered(parser, tu)
      }
    }
    
    object MyParser extends ExtParsers {
      def unord: Parser[String] =
        (ident $ stringLiteral $ wholeNumber $ floatingPointNumber) ^^ {
          case (id $ sl $ wn $ fpn) =>
          s"ident=$id string=$sl int=$wn float=$fpn"
        }
    }
    

    并通过测试:

      @Test def test() {
        val expected = "ident=value string=\"test\" int=10 float=10.99"
    
        assertEquals(expected,
          MyParser.parseAll(MyParser.unord, "value \"test\" 10 10.99").get)
    
        assertEquals(expected,
          MyParser.parseAll(MyParser.unord,"\"test\" value  10 10.99").get)
    
        assertEquals(expected,
          MyParser.parseAll(MyParser.unord,"10 value \"test\" 10.99").get)
      }
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 是的,看起来是这样:(至于目前的解决方案,当这些条件的数量增加时可能会变得复杂。
      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2014-05-24
      • 2010-10-06
      • 1970-01-01
      • 2011-07-01
      相关资源
      最近更新 更多