2012-01-13 111 views
5

我的一個Lua應用程序的一部分是一個搜索欄,我試圖讓它理解布爾表達式。我使用LPEG,但目前的語法給出了一個奇怪的結果: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 2012-01-13 20:35:05