Domanda

Sto cercando di capire come per terminare una ripetizione di parole usando una parola chiave. Un esempio:

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
}

Quando eseguo

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

Esso stampa words: List(one, two, END), indicando il parser words ha consumato la parola chiave END nel mio ingresso, lasciando il parser espressione in grado di eguagliare. Vorrei END di non essere accompagnata da words, che permetterà expression per analizzare con successo.

È stato utile?

Soluzione

E 'questo quello che stai cercando?

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)

Se volete maggiori dettagli, è possibile controllare questo post del blog

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top