parsing - LPeg 语法怪异

标签 parsing lua boolean-expression peg lpeg

我的 Lua 应用程序的一部分是一个搜索栏,我试图让它理解 bool 表达式。我正在使用 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"

它只解析第一个标记,我不明白它为什么这样做。据我所知,由于起始非终端末尾的 !. ,部分匹配是不可能的。我该如何解决这个问题?

最佳答案

匹配正在获取整个字符串,但捕获是错误的。注意 '->' 的优先级高于串联,因此您可能需要用括号括起来,如下所示:

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

关于parsing - LPeg 语法怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844862/

相关文章:

boolean - 使用 boolean 代数简化表达式

c - '-' 作为 bool 表达式有什么作用

c - 在C中进行输入解析并确定要转发到的位置

c++ - 用于单行多变量声明的 clang ast visitor

android - 如何在Android中解析JSON数据

lua - 在 torch 中组合张量的最惯用的方法是什么?

string - Lua - 通过 string.match 匹配 HTTP GET

objective-c - 如何确定C或Objective-C中的URL、URI和Path?

rss - 如何从 RSS 中获取最后一个标题?

java - int 作为 boolean 表达式 Eclipse-Java