2012-01-13 27 views
5

Benim bir Lua uygulamasının bir kısmı bir arama çubuğu ve ben bunu boolean ifadelerini anlamaya çalışıyorum. Ben LPeg kullanıyorum, ancak mevcut dilbilgisi garip bir sonuç verir:LPeg dilbilgisi oddity

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

Sadece ilk belirteci ayrıştırır ve bunu neden yaptığını ben çözemiyorum. Bildiğim kadarıyla, terminali olmayan terminalin sonundaki !. yüzünden kısmi bir eşleşme imkansız. Bunu nasıl düzeltebilirim?

cevap

10

Bu eşleşme tüm dizeyi alıyor, ancak yakalamalar yanlış.

EXPR  <- S? (TERM ((S OPERATOR)? S TERM)+) -> {} 
+0

teşekkür ederiz: - '>' birleştirme daha yüksek önceliğe sahiptir, bu nedenle muhtemelen bu gibi şeyler parantez ihtiyaç unutmayın! Bu tam olarak benim sahip olduğum problemdi. Tablo tutmanın aslında yüksek önceliğe sahip olduğunu hiç fark etmemiştim. – mmirate