Question

Une partie d'une application Lua de la mine est une barre de recherche, et je suis en train de faire comprendre les expressions booléennes. J'utilise LPEG, mais la grammaire actuelle donne un résultat étrange:

> re, yajl = require're', require'yajl'
> querypattern = re.compile[=[
    QUERY       <- ( EXPR / TERM )? S? !. -> {}
    EXPR        <- S? TERM ( (S OPERATOR)? S TERM )+ -> {}
    TERM        <- KEYWORD / ( "(" S? EXPR S? ")" ) -> {}
    KEYWORD     <- ( WORD {":"} )? ( WORD / STRING )
    WORD        <- {[A-Za-z][A-Za-z0-9]*}
    OPERATOR    <- {("AND" / "XOR" / "NOR" / "OR")}
    STRING      <- ('"' {[^"]*} '"' / "'" {[^']*} "'") -> {}
    S           <- %s+
]=]
> = yajl.to_string(lpeg.match(querypattern, "bar foo"))
"bar"
> = yajl.to_string(lpeg.match(querypattern, "name:bar AND foo"))
> = yajl.to_string(lpeg.match(querypattern, "name:bar AND foo"))
"name"
> = yajl.to_string(lpeg.match(querypattern, "name:'bar' AND foo"))
"name"
> = yajl.to_string(lpeg.match(querypattern, "bar AND (name:foo OR place:here)"))
"bar"

Il ne fait qu'analyser le premier jeton, et je ne peux pas comprendre pourquoi il le fait. Pour autant que je sache, une correspondance partielle est impossible en raison de la !. à la fin du départ non terminal. Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

Le match devient la chaîne entière, mais les captures sont fausses. Notez que « -> » a une priorité plus élevée que la concaténation, de sorte que vous parenthèses probablement besoin autour des choses comme ceci:

  EXPR        <- S? ( TERM ( (S OPERATOR)? S TERM )+ ) -> {}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top