antlr 4 - 警告 : rule contains an optional block with at least one alternative that can match an empty string

标签 antlr antlr4

我使用 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/

相关文章:

c# - ANTLR 语法给出了意想不到的结果

Python 2.7 和 ANTLR4 : Make ANTLR throw exceptions on invalid input

javascript - Antlr4 Javascript 访客

java - 如何检查字符串在 ANTLR 上下文中是否匹配?

java - 如何使用antlr4 plsql语法(java和org.antlr.v4.gui.TestRig)

java - 有没有办法将Antlr包含在Java编译过程中?

header - 在ANTLR中使用@header

java - Java 中使用空格引发 Antlr NoViableAltException

antlr - 在范围和语法错误中使用 float ?

java - 在 Scala 插件中控制错误的 IntelliJ 代码编辑器错误