问题标签 [lpeg]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1044 浏览

parsing - 使用 LPEG(Lua 解析器表达式语法),如 boost::spirit

所以我在玩lpeg来代替boost Spirit语法,我必须说boost::spirit比lpeg优雅自然得多。然而,由于当前 C++ 编译器技术的限制和 C++ 中的 TMP 问题,它是一个婊子。在这种情况下,类型机制是你的敌人而不是你的朋友。另一方面,Lpeg 虽然丑陋和基本导致更高的生产力。

无论如何,我离题了,我的 lpeg 语法的一部分如下所示:

此语法(虽然不完整)与以下内容匹配namespace foo {}。我想实现以下语义(这是使用 boost spirit 时的常见用例)。

  1. 为命名空间规则创建一个局部变量。
  2. namespace IDENTIFIER {当已匹配时,将命名空间数据结构添加到此局部变量。
  3. 将新创建的命名空间数据结构传递给NAMESPACE_BODYAST,以进一步构建 AST... 以此类推。

我确信这个用例是可以实现的。没有例子表明它。我对语言或库的了解不足以弄清楚如何去做。有人可以显示它的语法。

编辑:在尝试了几天与 lpeg 共舞并开始踩脚之后,我决定回归精神 :D 很明显 lpeg 是用 lua 函数编织的,而且这种编织是非常自由的-form(而精神有明确的非常有据可查的语义)。我只是还没有正确的 lua 心智模型。

0 投票
1 回答
428 浏览

parsing - LPeg 语法怪异

我的 Lua 应用程序的一部分是搜索栏,我试图让它理解布尔表达式。我正在使用 LPeg,但当前的语法给出了一个奇怪的结果:

它只解析第一个令牌,我无法弄清楚它为什么这样做。据我所知,由于!.起始非终端的末尾,部分匹配是不可能的。我怎样才能解决这个问题?

0 投票
2 回答
294 浏览

lua - 使用 lpeg 将 (cond ? then : else) 转换为 ifthenelse(cond,then,else)

我正在尝试使用lpeg lua 解析器将一个字符串转换'a?(b?c:d):e'为另一个字符串。我正在慢慢学习如何使用 lpeg,但我仍然找不到合适的解决方案来执行此操作。有任何想法吗?'ifthenelse(a,ifthenelse(b,c,d),e)'

这是我到目前为止所做的。

0 投票
1 回答
205 浏览

lpeg - lpeg 语法来解析可能有内部组的逗号分隔组

我需要解析可能在组内具有内部组的逗号分隔组(括在括号中)。它应该只分隔外部组。

我有一个功能可以做到这一点:

但问题是删除可能包含该组的额外括号。

这是一个测试字符串:

应该解析为

请注意,内部组是单独的。简单地删除末尾多余的括号是行不通的,因为你最终会得到一个像a,b,[c,d]],[e,[f,g].

任何想法如何修改 lpeg 语法以允许外部组?

0 投票
1 回答
416 浏览

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

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

(

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

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

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

0 投票
2 回答
111 浏览

lua - lua 模式匹配:分隔捕获

我正在尝试解析一个字符串,例如:&1 first &2 second &4 fourth \\,并从中构建一个表

一般来说,我对正则表达式不是很有经验,所以我的天真尝试(\\暂时忽略和表格部分)是

当我期望看到两个捕获的对时,它只给出了第一个捕获的对。我做了一些阅读并找到了lpeg图书馆,但它对我来说非常陌生。这里需要吗lpeg?谁能解释我的错误?

0 投票
2 回答
345 浏览

lua - lpeg 解析一阶逻辑项

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

在 Lua 表中

这是我建立的语法:

我有以下问题:

  • 它无法解析嵌套术语。对于上面的示例,它仅返回{term, {} }(虽然可以使用term(A, b, c))。
  • 要从我使用的字符串中去除引号{~ ~},但正因为如此,我必须从下面的行中移动所有argument捕获term。有没有办法避免这种情况?
  • 我想有一个与每个元素关联的键来指定它的类型,例如,而不是A{value = "A", type = "variable"}. 我找到了一种方法来做到这一点,{:name: :}但是,表中元素的顺序丢失了(因为它不会创建一个新表,而只是添加一个键,在这种情况下variable="A",这个元素的顺序是不固定的)。如何标记维持订单的物品?
0 投票
1 回答
1123 浏览

lua - 如何使用/包含 lpeg luapeg re 模块

ATM 我正在​​尝试从我的应用程序执行 lua 文件,这适用于基本 lua。我正在使用 borland 编译器(构建器 3,只是不要问 >.<)

现在我正在尝试通过 re 模块使用 lpeg。我已将 lpeg 目录添加到 LUA_PATH 环境变量中。该目录包括重新。lua、来自 LuaForWindows 的 lpeg.dll 和 *.c 文件。

现在,当我尝试启动我的脚本时,我 从文件“lpeg.dll”中得到错误错误加载模块“lpeg”:lpeg.dll:1:char(144) 附近的语法错误

相同的脚本在 LuaForWindows 的 IExecutor 中完美运行。

我想我已经完全错误地设置了我的 lua 环境。我把dll放在哪里?我必须用我的编译器自己构建它吗?(尝试过,但失败了)

提前致谢。

0 投票
3 回答
162 浏览

lua - 如何使 LPeg.match 返回 nil

我目前正在熟悉 LPeg 解析器模块。为此,我想将版本字符串(例如11.4)与list匹配。

这样的列表是一个具有严格语法的字符串,也可以包含范围。这是一个类似 EBNF,但在任何情况下都非常简单的语法(我把它写下来是因为下面的 LPeg 代码可能有点难以阅读):

一个示例字符串是1-9,10.1-11,12. 这是我的巨大代码:

所以你会这样称呼它checkversion("1-7,8.1,8.3,9"),如果当前版本与你应该得到的列表不匹配nil

现在,问题是,如果所有调用check都不返回任何内容(意思是,如果版本不匹配),grammar:match(...)实际上将没有捕获,因此返回字符串的当前位置。但这正是我想要的,我想checkversion返回nil,或者false如果没有匹配并且评估结果为 true 的东西,实际上就像string:match会做的那样。

另一方面,如果我在不匹配的情况下返回或false返回,我最终会得到来自匹配的返回值,这基本上是无法处理的。nilchecknil, "1", nil, nil

有任何想法吗?

0 投票
5 回答
886 浏览

parsing - 在 Lua 中使用 LPeg 解析多行

我有一些带有多行块的文本文件,例如

这些变长块存在于文本之间。我想在 : 之后读出所有数字并将它们保存在单独的数组中。在这种情况下,将有两个数组:

array1 = { 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 343 3938 9433 8756 6270 4472 3182 2503 1768 1140 836 496 326 273 349 269 144 121 94 82 64 80 66 59 56 47 50 46 64 35 42 53 42 40 41 34 35 41 39 39 47 30 30 39 12345 }

array2 = { 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 212 3079 8890 8941 6177 4359 3625 2420 1639 974 594 438 323 286 318 296 206 132 96 85 65 73 62 53 47 55 49 52 29 44 44 41 41 43 36 50 30 30 30 29 40 35 30 25 31 47 31 47 31 25 29 24 31 35 31 28 31 17 37 35 30 20 33 28 20 37 25 21 25 21 23 25 36 25 36 25 36 27 35 36 27 35 22 23 15 23 15 234 34 34 34 34 34 34 34 34 34 34 28 123456 }

我发现 lpeg 可能是实现它的一种轻量级方式。但我对 PEG 和 LPeg 完全陌生。请帮忙!