2012-01-13 7 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