【问题标题】:Can token stream be changed at runtime?可以在运行时更改令牌流吗?
【发布时间】:2015-04-21 06:26:37
【问题描述】:

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

IF expression BEGIN? statements END?

因为 BEGINEND 是可选的。如果令牌流中没有指定这些,我只需要在运行时在 ANTLR 令牌流中添加 BEGINEND 令牌。

【问题讨论】:

  • 为什么不在语法中将标记标记为可选?
  • 我将这些设置为可选,但我收到警告决策可以匹配多个替代方案...实际上我有一个语法,它导入另一个语法,并且不知何故,如果语句解析与用导入的语法编写的规则冲突。我试图通过 ANTLR 作品找出警告,但它显示了大量 NoViableAlt 错误,但没有运行测试用例,也没有生成语法图或树。
  • SQL 语法解析起来并不简单,您是否查看过antlr3.org/grammar/list.html 中的现有语法?
  • 是的,我看过它们,发现它们真的很有帮助。我正在处理 antlr3 的 DB2 SQL 和 SQL Server t-sql 解释器和语法无法达到我们想要达到的目的。

标签: java sql antlr3


【解决方案1】:

通过添加谓词解决了这个问题:

IF 表达式 {input.LA(1) == BEGIN}? => BEGIN statements_list END | statements_list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2017-01-22
    • 2022-01-07
    • 2013-12-27
    相关资源
    最近更新 更多