Scala解析器组合器:使用可选的初始字符来解析术语

萨拉索斯

我正在研究一种解析器,该解析器解析一些术语,这些术语的可选初始字符对于所有术语都是相同的。我的问题是,某些术语“第一个字符”与初始字符相同。我试图避免使用和不使用初始字符来重写每个术语。我发现一个packrat解析器听起来像是解决方案,但是我还没有按照我想要的方式使它工作。以下是我要完成的最小示例。

import scala.util.parsing.combinator._
import scala.util.parsing.input._

object test extends App {
  object MyParser extends RegexParsers with PackratParsers {
    lazy val p1:Parser[String] = "ab"
    lazy val p2:Parser[String] = "cd"
    lazy val parser:PackratParser[String] = ("a".?) ~> ( p2 | p1 )
  }

    def parsing[T](s: String)(implicit p: MyParser.Parser[T]): T = {
      import MyParser._
      val phraseParser = phrase(p)
      val input = new PackratReader(new CharSequenceReader(s))
      phraseParser(input) match {
        case Success(t, _) => t
        case NoSuccess(msg, _) => throw new IllegalArgumentException(
          "Could not parse '"+s+"': "+msg)
      }
    }                                 //> parsing: [T](s: String)(implicit p: test.MyParser.Parser[T])T

  implicit val parser = MyParser.log(MyParser.parser)("parser")
  println(parsing("cd"))  /* works */
  println(parsing("acd")) /* works */
  println(parsing("aab")) /* works */

  // Should work but doesn't.
  println(parsing("ab"))  /* expected "ab" but found "b" */
}
萨拉索斯

在查看@ishaaq的答案后,我想出了一个我认为更优雅的解决方案。

implicit class ParserExtension[T](val p: Parser[T]) extends AnyVal {
  def ?~[U](q: => Parser[U]): Parser[Option[T] ~ U] = {
    ((p ^^ Some.apply) ~ q) | (success(None) ~ q)
  }
}

这个隐式类为我的所有解析器添加了一个方法,因此我可以有一个可选的解析器,它具有反向跟踪功能。您可以这样使用它:

val a:Parser[String] = "a"
val parser:Parser[Option[String] ~ String] = a ?~ ( p2 | p1 )

这是本示例的全部要点

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Scala解析器组合器解析句子

来自分类Dev

使用Scala解析器组合器解析句子

来自分类Dev

Scala解析器组合器:使用packratparsers获得stackoverflow

来自分类Dev

Scala解析器组合器:在流中解析

来自分类Dev

Scala解析器组合器:按行解析

来自分类Dev

Scala解析器组合器:与“ into”组合时,如何返回中间解析器的内容?

来自分类Dev

Scala解析器组合器:与“ into”组合时,如何返回中间解析器的内容?

来自分类Dev

使用解析器组合器解析带有转义字符的字符串?

来自分类Dev

Scala JS中的Scala解析器组合器(json)

来自分类Dev

Scala JS中的Scala解析器组合器(json)

来自分类Dev

Scala解析器组合器将字符列表转换为字符串

来自分类Dev

使用Scala的解析器repsep拆分字符串

来自分类Dev

Scala解析器组合器-消耗直至匹配

来自分类Dev

Scala解析器组合器-消耗直至匹配

来自分类Dev

Scala模式匹配多个组合器解析器结果

来自分类Dev

Scala解析器组合器:失败-预期eol(行尾)

来自分类Dev

Scala:自定义语法/解析器组合器

来自分类Dev

树而不是字符串的解析器组合器

来自分类Dev

使用Scala的解析器组合器匹配带有值的令牌

来自分类Dev

使用解析器组合器时堆栈溢出

来自分类Dev

了解解析器组合器〜输出

来自分类Dev

在解析器组合器中了解`not`

来自分类Dev

Haskell解析器组合器

来自分类Dev

解析器组合器的类型

来自分类Dev

Idris解析器组合器GADT

来自分类Dev

Idris解析器组合器GADT

来自分类Dev

使用Scala Packrat解析器解析简单的字符串

来自分类Dev

使用scala packrat解析器解析一个简单的字符串

来自分类Dev

使用可选的解析器从joda-time DateTimeFormatter打印

Related 相关文章

热门标签

归档