问题标签 [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 回答
139 浏览

lua - 匹配没有连续连字符的字符串的 LPeg 模式

我正在尝试编写一个 LPeg 模式来匹配以下字符串:

  • 以字母开头
  • 此后包含字母数字字符
  • 不包含两个或多个连续连字符(例如 disallows test--string

作为参考,正则表达式[a-zA-Z](-?[a-zA-Z0-9])*匹配我正在寻找的内容。

这是我正在使用的代码,供参考:

然而,令我沮丧的是,我得到以下输出:

不管代码输出什么,t-t--t, t--t-t, 和t--t不应该匹配。

0 投票
2 回答
373 浏览

lua - 如何有效地匹配Lua表中的键?

在我的 Lua 5.1 环境中可用的显然是默认的 Lua 模式匹配,但也是相当新的 PCRE 和 LPEG 版本。老实说,我不在乎使用哪一个。只要我的问题得到有效解决,我就很高兴。(我个人对 LPEG 的了解几乎不存在,但我听说它有一些非常好的品质。)

我有一个表,其中包含某些字符串模式作为键,一旦键匹配,将使用随附的值......这意味着它们对于这个问题并不重要。

假设你有:

现在我的目标是找出其中哪一个首先在特定字符串中匹配,例如"accaccaacaadacaabacdaaba".

实际上,键更多,匹配字符串更长。这意味着简单地逐一匹配所有键并比较匹配开始的列是一种非常低效的解决方案,对我来说不可行。

部分匹配字符串也可以有相当多的重叠。从理论上讲,我知道每个键模式一个状态机在这方面是理想的;只需完成每个模式的动作,当你完全匹配其中一个模式时,你就完成了。

但是当我的环境中有这么多模式匹配库时,我自己去编写类似的代码会很疯狂。我知道唯一有技术能力的是PCRE。只需附加诸如之类的键"aaa|aab|aba",您将获得第一个可行的匹配项。

但也有问题。一方面,我不确定在编译这样的匹配时它有多智能。(我认为它首先尝试'aaa',一旦失败就完全放松,然后完全尝试aab,但我没有测试过)与匹配它相比,它不会太有效,"a(a[ab]|ba)"因为相似性得到更快解决。

此外,我希望能够提供一些灵活性(“a.ad”,其中第二个字符无关紧要,或者匹配一个数字......类似的基本内容)。在这种加法方法中使用这样的模式,我看不到有办法重新获得匹配的原始模式,因此我可以使用它附带的值。

(最坏的情况,我可以在表中生成很多条目来匹配每个可能的通配符变化并取消模式要求,但老实说我不想这样做。)

哪个库是完成这项工作的正确工具,以及如何在不重新发明轮子的情况下最好地使用所述库来实现上述目标?

0 投票
1 回答
98 浏览

lua - 如何编写一个从不匹配任何东西的 LPeg 模式?

有没有办法创建一个总是无法匹配任何东西的 LPeg 模式?我不是在谈论匹配空字符串,我在谈论一个总是失败的模式,所以如果你把它放在一个有序的选择中,它总是会退回到第二个选项。

这样做的原因是我正在用 LPEG 编写一个小型解析器,我希望我能写

代替

0 投票
0 回答
105 浏览

preprocessor - LPEG - 尽管是可终止的语法,但“规则可能是左递归”错误

我正在尝试使用 LPEG 为 GLSL 构建预处理器。我已经设法让#define 和#undef 语句正常工作,但我的问题是在尝试使用#ifdef 语句时出现。

我的想法是我可以构建一个规则来封装着色器,并以#ifdef 和#endif 语句为边界,如下所示:

显然,该语法是可终止的,因为 ifdef 规则需要在递归调用之前捕获 #ifdef 和宏名称。然而,LPEG 不同意,声称这条规则“可能是递归的”。

有谁知道我能做些什么吗?

谢谢。

0 投票
2 回答
288 浏览

regex - Match repeatable string as a "whole word" in Lua 5.1

My environment:

  • Lua 5.1
  • Absolutely no libraries with a native component (like a C .so/.dll) can be used
  • I can run any arbitrary pure Lua 5.1 code, but I can't access os and several other packages that would allow access to the native filesystem, shell commands or anything like that, so all functionality must be implemented in Lua itself (only).
  • I've already managed to pull in LuLpeg. I can probably pull in other pure Lua libraries.

I need to write a function that returns true if the input string matches an arbitrary sequence of letters and numbers as a whole word that repeats one or more times, and may have punctuation at the beginning or end of the entire matching substring. I use "whole word" in the same sense as the PCRE word boundary \b.

To demonstrate the idea, here's an incorrect attempt using the re module of LuLpeg; it seems to work with negative lookaheads but not negative lookbehinds:

Here are example strings and the expected return value (the quotes are syntactical as if typed into the Lua interpreter, not literal parts of the string; this is done to make trailing/leading spaces obvious):

  • input: " one !tvtvtv! two", word: tv, return value: true
  • input: "I'd", word: d, return value: false
  • input: "tv", word: tv, return value: true
  • input: " tvtv! ", word: tv, return value: true
  • input: " epon ", word: nope, return value: false
  • input: " eponnope ", word: nope, return value: false
  • input: "atv", word: tv, return value: false

If I had a full PCRE regex library I could do this quickly, but I don't because I can't link to C, and I haven't found any pure Lua implementations of PCRE or similar.

I'm not certain if LPEG is flexible enough (using LPEG directly or through its re module) to do what I want, but I'm pretty sure the built-in Lua functions can't do what I want, because it can't handle repeating sequences of characters. (tv)+ does not work with Lua's builtin string:match function and similar.

Interesting resources I've been scouring to try to figure out how to do this, to no avail:

0 投票
0 回答
91 浏览

lua - lua 5.3 lpeg:Cmt、Cb 和 / 运算符

这是在终端中运行的 lua 代码示例。它创建一个包含常量“FOO”的命名捕获

它打印“FOO”,这意味着命名的捕获已正确定义

然后可以通过以下两种方式之一使用反向捕获:使用“lpeg.Cmt”或“/”运算符:

它打印“带有 Cmt 的 FOO”。

接下来要简单得多,并且类似地打印“FOO with /”

但是,当取消注释两者中的最后一个返回捕获时p2p3后者抱怨“未找到反向引用'foo'”,而前者仍然有效。

似乎 lpeg/运算符将命名捕获清除为副作用。

有人可以给出一些解释或指出一些解释这一事实的文件吗?

0 投票
1 回答
59 浏览

lua - 如何开始在 Lua 中使用 LPEG 编写表达式评估器?

例如,我传递了一个表达式字符串和一个上下文表,它返回一个布尔值,无论它是真还是假。我可以使用 LPEG 做到这一点吗?

与此类似的东西:

0 投票
2 回答
55 浏览

regex - lua lpeg 表达式不在分隔符之间

lpeg如果字符串不在某个开始和结束分隔符之间,我想了解如何替换字符串。下面是一个示例,我想在其中使用SKIPstartSKIPstop表示不应替换文本的位置。

这是另一个带有多个分隔符的示例:

并嵌套

0 投票
0 回答
80 浏览

lua - 用于 Pandoc Reader 的 LPEG 中的打开和关闭元素

我正在开发一个简单的 Pandoc 阅读器,它可以处理论坛中使用的一些基本的类似 html 的语法(例如[b]bold[/b][h1]Header[/h1])。

我设法让一个基本的读者使用 LPEG(如 pandoc 文档中所述),但我找到的解决方案感觉很笨拙。有没有更好的方法来定义围绕开始和结束标签的语法(使用诸如优先级或负前瞻或 LPEG 分组之类的东西)?

这是我能够得到的工作:

这是我想转换的那种文本:

0 投票
1 回答
42 浏览

lua - lpeg中的非贪婪搜索而不消耗结束匹配

这是从关于这个问题的评论中分离出来的。

据我了解,在 PEG 语法中,可以通过编写来实现非贪婪搜索S <- E2 / E1 S(或 S = 模式 E2,如果可能,或模式 E1 和继续 S)。

但是,我不想在最终模式中捕获 E2 - 我想最多捕获E2。当尝试在 LPEG 中实现这一点时,我遇到了几个问题,包括将其构建到语法中时出现“规则中的空循环”错误。

我们将如何在 LPEG 语法中实现以下搜索:[tag] foo [/tag]我们想在捕获表中捕获标记的内容(示例中为“foo”),但我们想在结束标记之前终止?正如我从对另一个问题的评论中了解到的那样,这应该是可能的,但我在 LPEG 中找不到示例。

这是测试语法的一个片段