我正在ANTLR4
中构建一个语法,我收到了这个警告
TL4.g4:224:12: greedy block ()* contains wildcard; the non-greedy syntax ()*? may be preferred
以下是它所指的代码行
block
: ( statement | functionDecl )* (Return expression ';')?
;
警告意味着什么,我该如何纠正?
答案 0 :(得分:5)
警告告诉您阻止()*
是贪婪的,这意味着它会尝试匹配statement
或functionDec1
的最大出现次数,这取决于具体情况,可能不是你期待什么。
根据警告的建议,将其更改为()*?
会使其变得非贪婪。这意味着它将匹配statement
或functionDec1
的最低出现次数。
带字符串的表达式示例:
样品:
foofoobar
foobarbar
foofoobarbarbar
表达式:
(foo|bar)*bar
会给出结果:
foofoobar
foobarbar
foofoobarbarbar
表达式:
(foo|bar)*?bar
会给出结果:
foofoobar
foobar
foofoobar
对于最后一个,结果将在第一个bar