-->

解析器组合:如何终止关键字重复(parser combinator: how to terminat

2019-07-21 04:20发布

我想弄清楚如何终止使用关键字词的重复。 一个例子:

class CAQueryLanguage extends JavaTokenParsers {
    def expression = ("START" ~ words ~ "END") ^^ { x =>
        println("expression: " + x);
        x
    }
    def words = rep(word) ^^ { x =>
        println("words: " + x)
        x
    }
    def word = """\w+""".r
}

当我执行

val caql = new CAQueryLanguage
caql.parseAll(caql.expression, "START one two END")

它打印words: List(one, two, END)指示words解析器消耗了END在我输入的关键字,留下表达式解析器无法匹配。 我想END不被匹配words ,这将允许expression成功解析。

Answer 1:

这是你想要的?

import scala.util.parsing.combinator.syntactical._

object CAQuery extends StandardTokenParsers {
    lexical.reserved += ("START", "END")
    lexical.delimiters += (" ")

    def query:Parser[Any]= "START" ~> rep1(ident) <~ "END"

    def parse(s:String) = {
       val tokens = new lexical.Scanner(s)
       phrase(query)(tokens)
   }   
}

println(CAQuery.parse("""START a END"""))       //List(a)
println(CAQuery.parse("""START a b c END"""))   //List(a, b, c)

如果您想了解更多的细节,你可以看看这篇博客



文章来源: parser combinator: how to terminate repetition on keyword