如何取消在antlr4中生成的语法警告

时间:2019-12-20 08:48:04

标签: antlr4

以下警告:

  

规则包含一个可选块,其中至少有一个可以匹配空字符串的可选块。示例:Oracle中的row_limiting_clause,其中offset_clause和fetch_clause都是可选的

row_limiting_clause : offset_clause? fetch_clause? ;

2 个答案:

答案 0 :(得分:0)

您不能禁止此类警告,应该将其视为严重警告。即使ANTLR4可以从此语法中生成有效的ATN,它也可能会根据输入内容做出意外的决定。

相反,请尝试修复语法部分。该警告与以下内容有关:

2019-12-18T08:18:39.126Z

您在这里看到的是规则a: b?; b: c? d?; c: 'C'; d:'D'; 不仅在整体上是可选的,而且其所有部分都是可选的。这有点重复了可选性。您可以改写b,而无需更改此语法所解析的语言。

答案 1 :(得分:0)

我建议对您的语法进行以下更改:

row_limiting_clause : offset_clause? | offset_clause fetch_clause? ;

如果row_limitic_clause确实是可选的,请在使用row_limitic_clause?的任何地方使用。

这将意味着row_limiting_clause仅在存在offset_clause和/或fetch_clause时才匹配。