greedy block()*包含通配符

时间:2013-05-14 17:18:45

标签: regex antlr grammar greedy antlr4

我正在ANTLR4中构建一个语法,我收到了这个警告

TL4.g4:224:12: greedy block ()* contains wildcard; the non-greedy syntax ()*? may be preferred

以下是它所指的代码行

block
    : ( statement | functionDecl )* (Return expression ';')?
    ;

警告意味着什么,我该如何纠正?

1 个答案:

答案 0 :(得分:5)

警告告诉您阻止()*是贪婪的,这意味着它会尝试匹配statementfunctionDec1的最大出现次数,这取决于具体情况,可能不是你期待什么。

根据警告的建议,将其更改为()*?会使其变得非贪婪。这意味着它将匹配statementfunctionDec1的最低出现次数。

带字符串的表达式示例:

样品:

foofoobar
foobarbar
foofoobarbarbar

表达式:

(foo|bar)*bar

会给出结果:

foofoobar
foobarbar
foofoobarbarbar

表达式:

(foo|bar)*?bar

会给出结果:

foofoobar
foobar
foofoobar

对于最后一个,结果将在第一个bar

处停止