2012-01-13 26 views
5

मेरा लूआ आवेदन का हिस्सा एक खोज बार है, और मैं इसे बूलियन अभिव्यक्तियों को समझने की कोशिश कर रहा हूं। मैं LPeg उपयोग कर रहा हूँ, लेकिन मौजूदा व्याकरण एक अजीब परिणाम देता है:एलपीईजी व्याकरण विषमता

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

यह केवल पहला टोकन पार्स करता है, और मैं समझ नहीं क्यों यह ऐसा करता है। जहां तक ​​मुझे पता है, शुरुआती गैर टर्मिनल के अंत में !. की वजह से आंशिक मिलान असंभव है। मैं इसे कैसे ठीक करूं?

उत्तर

10

मैच पूरी स्ट्रिंग प्राप्त कर रहा है, लेकिन कैप्चर गलत हैं। ध्यान दें कि '->' संयोजन की तुलना में अधिक पूर्वता है, तो आप शायद इस तरह बातें चारों ओर कोष्ठकों की जरूरत है:

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

धन्यवाद! यह वास्तव में मेरी समस्या थी। मुझे कभी एहसास नहीं हुआ कि टेबल कैप्चर वास्तव में उच्च प्राथमिकता थी। – mmirate

संबंधित मुद्दे