如何在ANTLR4中解析嵌入sql

时间:2016-10-26 05:07:25

标签: antlr4 dsl

请考虑以下示例输入:

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. 我的控件块(命名空间/ sql)和宏('#....')。
  3. 如何将内部SQL语句解析为原始文本并处理宏以'#'正确?

    或者有什么例子吗?

1 个答案:

答案 0 :(得分:0)

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

“sql FindByQuery”语句推送到SQL模式,“}”弹出回DEFAULT模式。

在这两个单独的ANTLR4模式中,词法分析器可能完全不同。