在LPeg中匹配具有特定结尾的字符串

  • 本文关键字:结尾 字符串 LPeg lua lpeg
  • 更新时间 :
  • 英文 :


我试图捕获a和b的组合,但总是以b结束的字符串。换句话说:

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

匹配aaabbbabb,但不匹配aaabba。然而,上述内容并不匹配任何内容。这是因为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

相关内容

  • 没有找到相关文章

最新更新