首页 > 解决方案 > 解析 TSQL/Sybase *= 用于使用 ANTLR4 表示外连接的条件运算符

问题描述

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 的新手。:-(

请帮忙。

标签: tsqlantlrsybaseantlr4sap-ase

解决方案


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

如果您使用语法解析输入:

SELECT Q
FROM T
WHERE ID * = 42;

它会很好,但要正确解析:

SELECT Q
FROM T
WHERE ID *= 42;

你需要这样做:

comparison_operator
    : ... | '*='
    ;

并支持两者,请执行以下操作:

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

推荐阅读