Java 可以在运行时更改令牌流吗?

Java 可以在运行时更改令牌流吗?,java,sql,antlr3,Java,Sql,Antlr3,我需要解析ANTLR 3中的SQL Server if语句。SQL Server if语句如下所示: IF expression BEGIN? statements END? 因为开始和结束是可选的。如果在令牌流中没有指定开始和结束令牌,我只需要在运行时在ANTLR令牌流中添加它们。通过添加谓词解决了这个问题,如下所示: 如果表达式{input.LA(1)==BEGIN}?=>开始语句\u列表结束 |报表清单 为什么不在语法中将标记标记标记为可选?我将这些标记标记为可选标记,但我得到警告,该标

我需要解析ANTLR 3中的SQL Server if语句。SQL Server if语句如下所示:

IF expression BEGIN? statements END?

因为开始和结束是可选的。如果在令牌流中没有指定开始和结束令牌,我只需要在运行时在ANTLR令牌流中添加它们。

通过添加谓词解决了这个问题,如下所示:

如果表达式{input.LA(1)==BEGIN}?=>开始语句\u列表结束 |报表清单


为什么不在语法中将标记标记标记为可选?我将这些标记标记为可选标记,但我得到警告,该标记可以匹配多个可选标记。。。事实上,我有一个语法,它导入了另一个语法,如果语句解析与导入语法中的规则相冲突。我试图通过ANTLR works找出警告,但它在不运行测试用例的情况下显示了大量NoviableAllt错误,并且没有生成语法图或树。SQL语法解析起来并不简单,您是否查看了中的现有语法?是的,我看到了它们,发现它们非常有用。我正在研究DB2SQL和SQLServerT-SQL解释器,antlr3的语法无法达到我们想要达到的目的。