【问题标题】:Parse TSQL/Sybase *= conditional operator used to express outer join using ANTLR4解析 TSQL/Sybase *= 用于使用 ANTLR4 表示外连接的条件运算符
【发布时间】:2020-10-05 12:16:10
【问题描述】:

Sybase 具有用于表示外连接的非 ANSI SQL 条件运算符:*=。

它已被弃用 (http://dcx.sybase.com/1200/en/dbusage/apxa-transactsqlouter-joins-aspen.html)。

当我们从 Sybase ASE 迁移到 MySQL 时,我开始使用 ANTLR4 来解析 Sybase SQL 代码以尝试将其转换为 MySQL 代码等价物。

我已尝试将其添加到此处提供的 TSqlParser.g4 语法:https://github.com/antlr/grammars-v4/tree/master/sql/tsql。请参阅下面行尾的 '*' '=' 但它不起作用

// https://msdn.microsoft.com/en-us/library/ms188074.aspx
// Spaces are allowed for comparison operators.
comparison_operator
    : '=' | '>' | '<' | '<' '=' | '>' '=' | '<' '>' | '!' '=' | '!' '>' | '!' '<' | '*' '='
    ;

我尝试了一些方法来使其工作,例如转义 \* 和删除 *= assignment_operator,但没有任何效果。这可能是一个愚蠢的问题,因为我是 ANTLR 的新手。 :-(

请帮忙。

【问题讨论】:

    标签: tsql antlr sybase antlr4 sap-ase


    【解决方案1】:

    输入*= 被词法分析器标记为MULT_ASSIGN。您将其定义为两个单独的标记:'*' '=',与 '*=' 不同。

    如果你用你的语法来解析输入:

    SELECT Q
    FROM T
    WHERE ID * = 42;
    

    一切正常,但要正确解析:

    SELECT Q
    FROM T
    WHERE ID *= 42;
    

    你需要这样做:

    comparison_operator
        : ... | '*='
        ;
    

    要同时支持两者,请执行以下操作:

    comparison_operator
        : ... | '*' '=' | '*='
        ;
    

    【讨论】:

    • 谢谢,巴特!那成功了。我不明白的是其余的 compare_operators 将其分开(比如'>''='),但是当我在我的查询中使用'>=' 时:compare_operator : '=' | '>' | '' '=' | '' | '!' '=' | '!' '>' | '!' '
    • 那是因为只为&lt;=分别定义了标记:没有标记&lt;=。如果是这样的话,事情就会像*=一样出错
    猜你喜欢
    • 2018-10-07
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多