以下模式(来自此页面)仅匹配具有平衡括号的字符串:
b = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
Run Code Online (Sandbox Code Playgroud)
是什么1-在1 - lpeg.S"()"意思?
function gsub (s, patt, repl)
patt = lpeg.P(patt)
patt = lpeg.Cs((patt / repl + 1)^0)
return lpeg.match(patt, s)
end
Run Code Online (Sandbox Code Playgroud)
什么是+1中patt / repl + 1意味着什么?
而且我还没有/从本文中很好地得到优先选择算子的功能
任何帮助将不胜感激!
所以我正在玩lpeg来取代一个提升精神语法,我必须说boost :: spirit比lpeg更优雅和自然.然而,由于当前C++编译器技术的限制以及C++中的TMP问题,它是一个麻烦.在这种情况下,类型机制是你的敌人,而不是你的朋友.另一方面,Lpeg虽然丑陋而且基本导致更高的生产力.
无论如何,我很离题,我的lpeg语法的一部分如下所示:
function get_namespace_parser()
local P, R, S, C, V =
lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.V
namespace_parser =
lpeg.P{
"NAMESPACE";
NAMESPACE = V("WS") * P("namespace") * V("SPACE_WS") * V("NAMESPACE_IDENTIFIER")
* V("WS") * V("NAMESPACE_BODY") * V("WS"),
NAMESPACE_IDENTIFIER = V("IDENTIFIER") / print_string ,
NAMESPACE_BODY = "{" * V("WS") *
V("ENTRIES")^0 * V("WS") * "}",
WS = S(" \t\n")^0,
SPACE_WS = P(" ") * V("WS")
}
return namespace_parser
end
Run Code Online (Sandbox Code Playgroud)
这个语法(尽管不完整)与以下内容相符namespace foo {}.我想实现以下语义(这是使用boost精神时的常见用例).
namespace IDENTIFIER {匹配后,将名称空间数据结构添加到此局部变量.NAMESPACE_BODY …在普通的PEG(解析表达式语法)中,这是一个有效的语法:
values <- number (comma values)*
number <- [0-9]+
comma <- ','
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用LPeg编写此规则,则该规则的递归性质将失败:
local lpeg = require'lpeg'
local comma = lpeg.P(',')
local number = lpeg.R('09')^1
local values = number * (comma * values)^-1
--> bad argument #2 to '?' (lpeg-pattern expected, got nil)
Run Code Online (Sandbox Code Playgroud)
虽然在这个简单的例子中我可以重写规则以不使用递归,但我有一些我不想重写的现有语法.
如何在LPeg中编写自引用规则?
我的Lua应用程序的一部分是一个搜索栏,我试图让它理解布尔表达式.我正在使用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 <- ('"' {[^"]*} '"' / "'" {[^']*} "'") -> …Run Code Online (Sandbox Code Playgroud) 正如标题所说,我正在尝试解析例如
term(A, b, c(d, "e", 7))
Run Code Online (Sandbox Code Playgroud)
在Lua表中
{term, {A, b, {c, {d, "e", 7}}}}
Run Code Online (Sandbox Code Playgroud)
这是我建立的语法:
local pattern = re.compile[=[
term <- variable / function
argument <- variable / lowercase /number / string
function <- {|lowercase {|(open argument (separator (argument / function))* close)?|}|}
variable <- uppercase
lowercase <- {[a-z][A-Za-z0-9]*}
uppercase <- {[A-Z][A-Za-z0-9]*}
string <- '"' {~ [^"]* ~} '"'
number <- {[0-9]+}
close <- blank ")"
open <- "(" blank
separator <- blank "," blank
blank <- " "*
]=]
Run Code Online (Sandbox Code Playgroud)
我遇到以下问题: …
我有一些文本文件,多行像块一样
2011/01/01 13:13:13,<AB>, Some Certain Text,=,
[
certain text
[
0: 0 0 0 0 0 0 0 0
8: 0 0 0 0 0 0 0 0
16: 0 0 0 9 343 3938 9433 8756
24: 6270 4472 3182 2503 1768 1140 836 496
32: 326 273 349 269 144 121 94 82
40: 64 80 66 59 56 47 50 46
48: 64 35 42 53 42 40 41 34
56: 35 41 39 39 47 30 …Run Code Online (Sandbox Code Playgroud) 当我尝试通过luarocks安装moonscript时,进程在安装moonscript的依赖项时出错,并说"cl"不是已安装/识别的程序.
C:\Users\Kingdaro>luarocks install moonscript
Installing http://luarocks.org/repositories/rocks/moonscript-0.2.4-1.src.rock...
Missing dependencies for moonscript:
lpeg >= 0.10, ~= 0.11
alt-getopt >= 0.7
7-Zip 9.10 beta Copyright (c) 1999-2009 Igor Pavlov 2009-12-22
Processing archive: lpeg-0.12.tar.gz
Extracting lpeg-0.12.tar
Everything is Ok
Size: 245760
Compressed: 66649
7-Zip 9.10 beta Copyright (c) 1999-2009 Igor Pavlov 2009-12-22
Processing archive: lpeg-0.12.tar
Extracting lpeg-0.12
Extracting lpeg-0.12\makefile
Extracting lpeg-0.12\HISTORY
Extracting lpeg-0.12\test.lua
Extracting lpeg-0.12\re.lua
Extracting lpeg-0.12\lpeg.html
Extracting lpeg-0.12\re.html
Extracting lpeg-0.12\lpeg-128.gif
Extracting lpeg-0.12\lptypes.h
Extracting lpeg-0.12\lpcap.h
Extracting lpeg-0.12\lpcap.c
Extracting lpeg-0.12\lpcode.h
Extracting lpeg-0.12\lpcode.c
Extracting lpeg-0.12\lpprint.h
Extracting …Run Code Online (Sandbox Code Playgroud) 我正在努力让我的头脑围绕着LPEG.我已经设法制作了一个符合我想要的语法,但是我一直在反对这个语法并且没有走远.我们的想法是解析一个简化形式的TeX文档.我想将文档分成:
\begin{cmd}和\end{cmd}成对的.\foo{bar}或者可以是裸的:\foo.\command[color=green,background=blue]{content}.我还想跟踪行号信息以便进行错误处理.这是我到目前为止所拥有的:
lpeg = require("lpeg")
lpeg.locale(lpeg)
-- Assume a lot of "X = lpeg.X" here.
-- Line number handling from http://lua-users.org/lists/lua-l/2011-05/msg00607.html
-- with additional print statements to check they are working.
local newline = P"\r"^-1 * "\n" / function (a) print("New"); end
local incrementline = Cg( Cb"linenum" )/ function ( a ) print("NL"); return a + 1 end , "linenum"
local …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(除其他外)支持纯文本搜索和使用 Lua 模式的搜索。为了方便起见,该应用程序支持不区分大小写的搜索。这是一个图像片段:

将给定 Lua 模式转换为不区分大小写的 Lua 模式的代码不太漂亮。它主要关心字符前面是否有奇数或偶数转义符 (%) 以及它是否位于方括号内。图像中显示的图案变为%a[bB][bB]%%[cC][%abB%%cC]
我还没有机会学习 LPeg,我想这可能是我的动力。
我的问题是,这是否是 LPeg 可以轻松处理的事情?
lpeg ×9
lua ×8
peg ×5
parsing ×3
boost-spirit ×1
logging ×1
lua-patterns ×1
luarocks ×1
moonscript ×1
text-parsing ×1