2009-10-06 7 views
3

J'essaie de comprendre comment terminer une répétition de mots en utilisant un mot-clé. Un exemple:combinateur analyseur: comment terminer la répétition sur mot-clé

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 
} 

Lorsque j'exécute

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

Il imprime words: List(one, two, END), ce qui indique que l'analyseur words a consommé le mot-clé END dans mon entrée, laissant l'analyseur d'expression incapable de faire correspondre. Je voudrais END pour ne pas correspondre par words, ce qui permettra expression analyser avec succès.

+1

JavaTokenParsers ne distingue pas entre les identifiants et mots-clés. Je pense que la réponse d'agilefall est ce dont vous avez besoin. –

Répondre

4

Est-ce ce que vous cherchez?

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) 

Si vous désirez plus de détails, vous pouvez consulter this blog post

+0

Merci. Vous avez utilisé les intertubes à bon escient. –

Questions connexes