代码之家  ›  专栏  ›  技术社区  ›  Eugene Yokota

scala:我能把组合分析器推到本地贪婪吗?

  •  9
  • Eugene Yokota  · 技术社区  · 14 年前

    假设我有一个用组合分析器表示的模糊语言。有没有办法使某些表达式局部贪婪?这是我的意思的一个例子。

    import scala.util.parsing.combinator._
    
    object Example extends JavaTokenParsers {
      def obj: Parser[Any] = (shortchain | longchain) ~ anyrep
    
      def longchain: Parser[Any] = zero~zero~one~one
      def shortchain: Parser[Any] = zero~zero
    
      def anyrep: Parser[Any] = rep(any)
      def any: Parser[Any] = zero | one
      def zero: Parser[Any] = "0"
      def one: Parser[Any] = "1"
      def main(args: Array[String]) {
        println(parseAll(obj, args(0) ))
      }
    }
    

    编译之后,我可以如下运行它:

    $ scala Example 001111
    [1.7] parsed: ((0~0)~List(1, 1, 1, 1))
    

    我想以某种方式指导 obj 局部贪婪与 longchain . 如果我调换顺序,它会匹配 长链 ,但那不是因为贪婪。

    def obj: Parser[Any] = (longchain | shortchain) ~ anyrep
    
    1 回复  |  直到 14 年前
        1
  •  14
  •   Daniel C. Sobral    14 年前

    使用 ||| :

    object Example extends JavaTokenParsers {
      def obj: Parser[Any] = (shortchain ||| longchain) ~ anyrep
    
      def longchain: Parser[Any] = zero~zero~one~one
      def shortchain: Parser[Any] = zero~zero
    
      def anyrep: Parser[Any] = rep(any)
      def any: Parser[Any] = zero | one
      def zero: Parser[Any] = "0"
      def one: Parser[Any] = "1"
      def main(args: Array[String]) {
        println(parseAll(obj, args(0) ))
      }
    }
    
    scala> Example.main(Array("001111"))
    [1.7] parsed: ((((0~0)~1)~1)~List(1, 1))