Pegjs: * 、 + 和 ? 的非贪婪运算符

创建于 2011-10-07  ·  7评论  ·  资料来源: pegjs/pegjs

我有一种语言,其中有相同模式的重复实例,我只关心第一个符号。 例如:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

这个简单的例子可以通过这个模式匹配(其中 _ 是空格):

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

在这种情况下这不是什么大问题(我已经输入了模式 :-) 但是该语言有一组其他大而复杂的结构,它们不保证完整的解析(我只希望每一行的初始标识符做我想到的工作)。

我想输入这样的模式:

identifier _ "OBJECT IDENTIFIER" .*? "}"

“.*?”在哪里? 是非贪婪的 - 它只消耗到第一次出现的终端。 这会在 PEG.js 的列表中吗? 非常感谢。

最有用的评论

PEG形式主义中,您可以通过将谓词与.元字符一起使用来轻松匹配直到终止符。 就像是:

"OBJECT IDENTIFIER" (!"}" .)* "}"

这对你来说足够了吗?

所有7条评论

更新:这可以通过重复计数(这是我最初想法的概括)来满足,如 Google Groups 中的建议: http :

PEG形式主义中,您可以通过将谓词与.元字符一起使用来轻松匹配直到终止符。 就像是:

"OBJECT IDENTIFIER" (!"}" .)* "}"

这对你来说足够了吗?

是的,这很完美。 谢谢!

@dmajda去除!"}"表达式返回的空字符的推荐做法是什么?

例如:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

我能够通过将!"-suffix" .分解为仅返回.结果的自己的规则来实现这一点,但我很好奇是否有更好的方法。

66 会解决这个问题。

我认为你可以使用:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@islandr请不要将问题用作询问有关 PEG.js 使用的问题的地方。 尤其是当他们关门时,尤其是当你问我身边的其他人可以帮助你的事情时。 正确的渠道是Google Group

对不起大卫。 以为这是个好地方,因为它是
与您给出的示例直接相关。

在 2013 年 1 月 9 日星期三晚上 9:51,David Majda通知@github.com 写道:

@islandr https://github.com/islandr请不要使用问题作为地方
询问有关 PEG.js 使用的问题。 尤其是当他们关闭和
尤其是当你问一些我身边的人可以做到的事情时
帮你。 正确的渠道是 Google Group http://groups.google.com/group/pegjs
.


直接回复本邮件或在 Gi tHub上查看

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ceremcem picture ceremcem  ·  22评论

ceymard picture ceymard  ·  29评论

audinue picture audinue  ·  13评论

krisnye picture krisnye  ·  21评论

dmajda picture dmajda  ·  15评论