如何在 ANTLR4 中解析嵌入 sql
How to parse embed sql in ANTLR4
考虑以下示例输入:
namespace Client
{
sql FindByQuery
{
SELECT * FROM client_Profile
WHERE 1 = 1
#ifNotEmpty(City, sql{ AND `City` = @City })
#ifNotEmpty(Zipcode, sql{ AND `Zipcode` = @Zipcode })
#ifNotEqual(State, "NY", sql{ AND `State` = @State })
#ifEqual(IsReactive, 1 , sql{ AND `WONum` LIKE CONCAT('B%', @WONum) })
#include(CommonOrderBy)
}
}
代码中有两种不同的语言:
- 任何原始文本,包括空格,前提是不是以“#”开头并以“}”结尾(SQL 语句)
- 我的控制块(namespace/sql)和宏('#....')。
如何将内部 SQL 语句解析为原始文本并正确处理以“#”开头的宏?
或者有什么例子吗?
ANTLR4 词法分析器模式可以做到这一点,这意味着创建一个单独的词法分析器 g4 文件,定义两种模式:DEFAULT 模式和 SQL 模式。
"sql FindByQuery" 语句推送到 SQL 模式,"}" 返回默认模式。
在这两种独立的 ANTLR4 模式中,词法分析器可以完全不同。
考虑以下示例输入:
namespace Client
{
sql FindByQuery
{
SELECT * FROM client_Profile
WHERE 1 = 1
#ifNotEmpty(City, sql{ AND `City` = @City })
#ifNotEmpty(Zipcode, sql{ AND `Zipcode` = @Zipcode })
#ifNotEqual(State, "NY", sql{ AND `State` = @State })
#ifEqual(IsReactive, 1 , sql{ AND `WONum` LIKE CONCAT('B%', @WONum) })
#include(CommonOrderBy)
}
}
代码中有两种不同的语言:
- 任何原始文本,包括空格,前提是不是以“#”开头并以“}”结尾(SQL 语句)
- 我的控制块(namespace/sql)和宏('#....')。
如何将内部 SQL 语句解析为原始文本并正确处理以“#”开头的宏?
或者有什么例子吗?
ANTLR4 词法分析器模式可以做到这一点,这意味着创建一个单独的词法分析器 g4 文件,定义两种模式:DEFAULT 模式和 SQL 模式。
"sql FindByQuery" 语句推送到 SQL 模式,"}" 返回默认模式。
在这两种独立的 ANTLR4 模式中,词法分析器可以完全不同。