标签: lpeg

需要帮助来了解LPeg和PEGs

以下模式(来自此页面)仅匹配具有平衡括号的字符串:

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)

什么是+1patt / repl + 1意味着什么?

而且我还没有/本文中很好地得到优先选择算子的功能

任何帮助将不胜感激!

lua peg lpeg

7
推荐指数
1
解决办法
470
查看次数

使用LPEG(Lua Parser Expression Grammars),如boost :: spirit

所以我正在玩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精神时的常见用例).

  1. 为命名空间规则创建局部变量.
  2. namespace IDENTIFIER {匹配后,将名称空间数据结构添加到此局部变量.
  3. 将新创建的命名空间数据结构传递NAMESPACE_BODY …

parsing peg boost-spirit lpeg

6
推荐指数
1
解决办法
906
查看次数

创建递归LPeg模式

在普通的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 peg lpeg

6
推荐指数
1
解决办法
601
查看次数

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)

lua parsing boolean-expression peg lpeg

5
推荐指数
1
解决办法
397
查看次数

lpeg解析一阶逻辑项

正如标题所说,我正在尝试解析例如

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)

我遇到以下问题: …

lua peg first-order-logic lpeg

4
推荐指数
1
解决办法
311
查看次数

用Lua中的LPeg解析多行

我有一些文本文件,多行像块一样

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)

logging lua parsing text-parsing lpeg

4
推荐指数
1
解决办法
686
查看次数

在Windows 8上通过luarocks安装moonscript

当我尝试通过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)

lua luarocks lpeg moonscript

3
推荐指数
1
解决办法
1222
查看次数

使用lpeg解析类似TeX的语言

我正在努力让我的头脑围绕着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 lpeg

3
推荐指数
1
解决办法
378
查看次数

使用 LPeg 使 Lua 模式不区分大小写

我有一个应用程序(除其他外)支持纯文本搜索和使用 Lua 模式的搜索。为了方便起见,该应用程序支持不区分大小写的搜索。这是一个图像片段:

(

将给定 Lua 模式转换为不区分大小写的 Lua 模式的代码不太漂亮。它主要关心字符前面是否有奇数或偶数转义符 (%) 以及它是否位于方括号内。图像中显示的图案变为%a[bB][bB]%%[cC][%abB%%cC]

我还没有机会学习 LPeg,我想这可能是我的动力。

我的问题是,这是否是 LPeg 可以轻松处理的事情?

lua case-insensitive pattern-matching lua-patterns lpeg

2
推荐指数
1
解决办法
505
查看次数