代码之家  ›  专栏  ›  技术社区  ›  Landon Kuhn

解析器组合器:如何终止关键字的重复

  •  3
  • Landon Kuhn  · 技术社区  · 15 年前

    我想知道如何使用关键字终止重复的单词。一个例子:

    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 关键字,使表达式分析器无法匹配。我想 结束 不匹配 ,这将允许 expression 以成功分析。

    1 回复  |  直到 15 年前
        1
  •  4
  •   agilefall    15 年前

    这就是你要找的吗?

    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)
    

    如果您想了解更多详细信息,可以查看 this blog post

    推荐文章