1

我正在尝试用 a 和 b 的组合捕获一个字符串,但总是以 b 结尾。换句话说:

local patt = S'ab'^0 * P'b'

匹配aaabandbbabb但不匹配aaaor bba。但是,以上内容不匹配任何内容。这是因为S'ab'^0贪心而匹配决赛b吗?lpeg.Cmt我是这么认为的,除了求助于这似乎有点矫枉过正之外,我想不出任何替代方案。但也许不是,有人知道如何匹配这样的模式吗?我看到了这个问题,但是解决方案的问题在于它会停在第一个结束标记处(即那里的“猫”,这里的“b”),就我而言,我需要接受中间的“b”。

PS我实际上想要做的是匹配一个最外层规则是函数调用的表达式。例如

func();
func(x)(y);
func_arr[z]();

全部匹配,但

exp;
func()[1];
4 + 5;

不要。我的语法的其余部分有效,我很确定这归结为同一个问题,但为了完整起见,我正在使用的语法看起来像:

top_expr = V'primary_expr' * V'postfix_op'^0 * V'func_call_op' * P';';
postfix_op = V'func_call_op' + V'index_op';

同样地,我最终会V'postfix_op'^0吃掉func_call_op我所期待的东西。

4

3 回答 3

1

是的,没有回溯,因此您已经正确识别了问题。我认为解决方案是列出有效的postfix_op表达式;我将更V'func_call_op' + V'index_op'改为V'func_call_op'^0 * V'index_op'并更改 finalV'func_call_op'以在最后V'func_call_op'^1允许多个函数调用。

更新:正如评论中所建议的,问题的解决方案a/b(P'b'^0 * P'a')^0 * P'b'^1.

于 2015-07-17T16:04:14.193 回答
0

这个怎么样?

local final = P'b' * P(-1)
local patt =  (S'ab' - final)^0 * final

模式final是我们在字符串末尾需要的。

该模式patt与集合“ab”匹配,除非它后面是最终序列。然后它断言我们有最终的序列。这阻止了最后的'b'被吃掉。

这并不能保证我们得到任何 a(但问题中的模式也没有)。

于 2016-06-20T05:30:26.717 回答
0

抱歉,我的回答来得太晚了,但我认为值得给这个问题一个更正确的答案。

据我了解,您只想要一个非盲目的贪婪匹配。但不幸的是,LPeg 的“官方文档”只告诉我们如何使用 LPeg 进行盲目的贪婪匹配(或重复)。但是这种模式可以用解析表达式语法来描述。对于规则 S,如果你想匹配尽可能多的 E 1,然后是 E 2,你需要写

S <- E 1 S / E 2

问题的解决方案a/b变成

S <- [ab] S / 'b'

您可能希望通过在第一个选项中插入一些 a 来优化规则

S <- [ab] 'a'* S / 'b'

这将大大减少递归。至于你真正的问题,这是我的回答:

top_expr   <- primary_expr p_and_f ';'
p_and_f    <- postfix_op p_and_f / func_call_op
postfix_op <- func_call_op / index_op
于 2021-10-25T13:46:10.710 回答