Frage

Ein Teil einer Lua -Anwendung von mir ist eine Suchleiste, und ich versuche, es booleschen Ausdrücke zu verstehen. Ich benutze LPEG, aber die aktuelle Grammatik liefert ein seltsames Ergebnis:

> 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"

Es analysiert nur das erste Token, und ich kann nicht herausfinden, warum es dies tut. Soweit ich weiß, ist eine teilweise Übereinstimmung aufgrund der unmöglich !. Am Ende des Startnotionsfestens. Wie kann ich das beheben?

War es hilfreich?

Lösung

Das Match erhält die gesamte Saite, aber die Aufnahmen sind falsch. Beachten Sie, dass '->' einen höheren Vorrang als eine Verkettung hat, also brauchen Sie wahrscheinlich Klammern um solche Dinge:

  EXPR        <- S? ( TERM ( (S OPERATOR)? S TERM )+ ) -> {}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top