面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. 笔记和吹水
  3. 正文

使用 ANTLR4 生成代码分析 MYSQL

2023年1月12日 84点热度 0人点赞 0条评论
内容纲要

环境搭建和生成

首先安装 Java 8 以上的版本。

打开 https://www.antlr.org/download.html,
找到 "ANTLR tool itself ",或者直接点击 https://www.antlr.org/download/antlr-4.11.1-complete.jar 下载包。

file

然后打开 https://github.com/antlr/grammars-v4
下载对应语法分析模板。

file

执行命令生成 java 代码。

 java -jar antlr-4.11.1-complete.jar .\MySqlLexer.g4 -Dlanguage=Csharp

执行命令生成 C# 代码:

 java -jar antlr-4.11.1-complete.jar .\MySqlLexer.g4 -Dlanguage=CSharp
 java -jar antlr-4.11.1-complete.jar .\MySqlParser.g4 -Dlanguage=CSharp

file

C# 分析 SQL

引入 Antlr4.Runtime 库。

C# 可以这样分析 SQL:

    internal class Program
    {
        static void Main()
        {
            String input = "ALTER TABLE <code>sjzy_user_center</code>.<code>t_system</code>ADD COLUMN <code>Token</code> varchar(1000) NULL DEFAULT NULL COMMENT '子系统token' AFTER <code>AssociatedInternalSubsystem</code>;";
            ICharStream stream = CharStreams.fromString(input);
            ITokenSource lexer = new MySqlLexer(stream);
            ITokenStream tokens = new CommonTokenStream(lexer);
            MySqlParser parser = new MySqlParser(tokens);
            parser.BuildParseTree = true;
            StartSlaveContext tree = parser.startSlave();
            Console.WriteLine(tree.ToStringTree());
            P(tree.children);
        }
        static void P(IList<IParseTree> tree)
        {
            foreach (var item in tree)
            {
                if (item.ChildCount != 0)
                {
                    List<IParseTree> child = new List<IParseTree>(0);
                    for (int i = 0; i < item.ChildCount; i++)
                    {
                        child.Add(item.GetChild(i));
                    }
                    P(child);
                }
                else
                {
                    Console.WriteLine(item.ToStringTree());
                }
            }
        }
    }

file

每个 Token 都对应了一个 Type 类型,可以在 MySqlLexer.tokens 或 MySqlParser.tokens 文件中搜索到。

首先使用 tree.children 获取所有子节点,返回 IList<IParseTree> 列表,每个 IParseTree 下面有个 Payload 属性,里面记载了这个 Token 的所有特性。

                var token = item.Payload as CommonToken;

例如,STRING_LITERAL 表示关键词属于一个命名,

如果想查找数据库或表名称,或字段名称,可以这样搜索:

                if(token.Type == MySqlParser.STRING_LITERAL)
                {

                }
                if (token.Type == 1141)
                {

                }
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: antlr c
最后更新:2023年1月12日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

文章目录
  • 环境搭建和生成
  • C# 分析 SQL

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号