如何在 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)
    }
}

代码中有两种不同的语言:

  1. 任何原始文本,包括空格,前提是不是以“#”开头并以“}”结尾(SQL 语句)
  2. 我的控制块(namespace/sql)和宏('#....')。

如何将内部 SQL 语句解析为原始文本并正确处理以“#”开头的宏?

或者有什么例子吗?

ANTLR4 词法分析器模式可以做到这一点,这意味着创建一个单独的词法分析器 g4 文件,定义两种模式:DEFAULT 模式和 SQL 模式。

"sql FindByQuery" 语句推送到 SQL 模式,"}" 返回默认模式。

在这两种独立的 ANTLR4 模式中,词法分析器可以完全不同。