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