我使用 antlr v4 编写了一个 t-sql 解析器。
这个警告有问题吗?
"rule 'sqlCommit' contains an optional block with at least one alternative that can match an empty string"
我的代码:
sqlCommit: COMMIT (TRAN | TRANSACTION | WORK)? id?;
id:
ID | CREATE | PROC | AS | EXEC | OUTPUT| INTTYPE |VARCHARTYPE |NUMERICTYPE |CHARTYPE |DECIMALTYPE | DOUBLETYPE | REALTYPE
|FLOATTYPE|TINYINTTYPE|SMALLINTTYPE|DATETYPE|DATETIMETYPE|TIMETYPE|TIMESTAMPTYPE|BIGINTTYPE|UNSIGNEDBIGINTTYPE..........
;
ID: (LETTER | UNDERSCORE | RAUTE) (LETTER | [0-9]| DOT | UNDERSCORE)*
在我在 sqlCommit 中直接使用词法分析器规则 ID 而不是解析器规则 ID 之前的版本中。但是在将 ID 更改为 id 后会出现警告。
( 提示 如果您对 ID 和 id 感到困惑:我想使用解析器规则 id 而不是 ID,因为标识符可以是可能已经与其他词法分析器规则匹配的文字)
问候
编辑
在“280Z28”的帮助下,我解决了这个问题。在解析器规则中,“id”比需要的多一个斜杠:
位类型|创建|过程|
|AS|EXEC|输出|
所以| |包括解析器规则可以匹配空字符串。
最佳答案
从谷歌搜索:
ErrorType.EPSILON_OPTIONAL
Compiler Warning 154.
rule rule contains an optional block with at least one alternative that can match an empty string
A rule contains an optional block (
(...)?
) around an empty alternative.The following rule produces this warning.
x : ; y : x?; // warning 154 z1 : ('foo' | 'bar'? 'bar2'?)?; // warning 154 z2 : ('foo' | 'bar' 'bar2'? | 'bar2')?; // ok
Since:
4.1
此警告描述的问题主要是性能问题。通过将零长度字符串包装在可选块中,您向语法中添加了一个完全不必要的决定(是否输入可选块),这很有可能迫使预测算法通过其最慢的路径。它类似于将 Java 代码包装在以下内容中:
if (slowMethodThatAlwaysReturnsTrue()) {
...
}
关于antlr 4 - 警告 : rule contains an optional block with at least one alternative that can match an empty string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041293/