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"
それが唯一の最初のトークンを解析し、それがこれを行い、なぜ私が理解することはできません。私が知る限り、始まりの非終端の終わりに!.
の部分一致が不可能です。これをどうすれば解決できますか?
をありがとう: - 「>」連結よりも優先順位が高いので、あなたは、おそらくこのようなものを括弧で囲む必要 があることに注意してください!これは正確に私が持っていた問題でした。私はテーブルキャプチャが実際に優先順位が高いことに気付かなかった。 – mmirate