Parte di una mia applicazione Lua è una barra di ricerca, e sto cercando di far capire le espressioni booleane. Sto utilizzando LPeg, ma la grammatica corrente dà un risultato strano:Grammatica grammatica dispari
> 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"
analizza solo il primo token, e io non riesco a capire il motivo per cui lo fa. Per quanto ne so, una corrispondenza parziale è impossibile a causa dello !.
alla fine dell'avvio non terminale. Come posso risolvere questo?
Grazie! Questo era esattamente il problema che avevo. Non ho mai realizzato che la cattura del tavolo avesse effettivamente un'alta priorità. – mmirate