解析 TSQL/Sybase *= 用于使用 ANTLR4 表达外连接的条件运算符
Parse TSQL/Sybase *= conditional operator used to express outer join using 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 的新手。 :-(
请帮忙。
输入 *=
被词法分析器标记为 MULT_ASSIGN
。您将其定义为两个单独的标记:'*' '='
,这与 '*='
.
不同
如果你按照你的语法解析输入:
SELECT Q
FROM T
WHERE ID * = 42;
一切正常,但要正确解析:
SELECT Q
FROM T
WHERE ID *= 42;
你需要这样做:
comparison_operator
: ... | '*='
;
要同时支持两者,请执行以下操作:
comparison_operator
: ... | '*' '=' | '*='
;
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 的新手。 :-(
请帮忙。
输入 *=
被词法分析器标记为 MULT_ASSIGN
。您将其定义为两个单独的标记:'*' '='
,这与 '*='
.
如果你按照你的语法解析输入:
SELECT Q
FROM T
WHERE ID * = 42;
一切正常,但要正确解析:
SELECT Q
FROM T
WHERE ID *= 42;
你需要这样做:
comparison_operator
: ... | '*='
;
要同时支持两者,请执行以下操作:
comparison_operator
: ... | '*' '=' | '*='
;