我试图捕获a和b的组合,但总是以b结束的字符串。换句话说:
local patt = S'ab'^0 * P'b'
匹配aaab
和bbabb
,但不匹配aaa
和bba
。然而,上述内容并不匹配任何内容。这是因为S'ab'^0
是贪婪的,匹配最终的b
吗?我是这么认为的,除了求助于lpeg.Cmt
之外,我想不出任何其他选择,这似乎有点过头了。但也许不是,有人知道如何匹配这种模式吗?我看到了这个问题,但解决方案的问题是,它会停止在第一个结束标记(即。'cat'在那里,'b'在这里),在我的例子中,我需要接受中间的'b'。
注:我实际上要做的是匹配一个表达式,它的最外层规则是一个函数调用。例如
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
。
是的,没有回溯,所以您已经正确地识别了问题。我认为解决方案是列出有效的postfix_op
表达式;我将V'func_call_op' + V'index_op'
更改为V'func_call_op'^0 * V'index_op'
,并将最终V'func_call_op'
更改为V'func_call_op'^1
,以允许在结束时进行几个函数调用。
更新:正如评论中建议的那样,a/b
问题的解决方案将是(P'b'^0 * P'a')^0 * P'b'^1
。
这个怎么样?
local final = P'b' * P(-1)
local patt = (S'ab' - final)^0 * final
模式final
是我们在字符串末尾需要的。
模式patt
匹配集合'ab' ,除非后面跟着最终序列。然后它断言我们得到了最终序列。这样可以防止最后一个"b"被吃掉。
这并不能保证我们得到任何a(但问题中的模式也不会)。
对不起,我的回答来得太晚了,但我认为这个问题值得给出一个更正确的答案。
在我的理解中,您只是想要一个非盲贪婪匹配。但不幸的是,"官方文件"of LPeg只告诉我们如何使用LPeg进行盲贪婪匹配(或重复)。但是这种模式可以通过解析表达式语法来描述。对于规则S,如果你想匹配尽可能多的E1后面跟着E2,你需要写
S <- E1 S/E2
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