gpt4 book ai didi

parsing - LPeg 语法怪异

转载 作者:行者123 更新时间:2023-12-02 16:36:52 27 4
gpt4 key购买 nike

我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com