如何实现一个SQL解析器( 三 )


如何实现一个SQL解析器

文章插图
4.1.2 GrammarANTLR官方提供了很多常用的语言的语法文件,可以进行修改后直接进行复用:https://github.com/antlr/grammars-v4
在使用语法的时候,需要注意以下事项:
  • 语法名称和文件名要一致;
  • 语法分析器规则以小写字母开始;
  • 词法分析器规则以大写字母开始;
  • 用'string'单引号引出字符串;
  • 不需要指定开始符号;
  • 规则以分号结束;
  • ...
4.1.3 ANTLR4实现简单计算功能下面通过简单示例,说明ANTLR4的用法,需要实现的功能效果如下:
ANTLR示例
1+2 => 1+2=31+2*4 => 1+2*4=91+2*4-5 => 1+2*4-5=41+2*4-5+20/5 => 1+2*4-5+20/5=8(1+2)*4 => (1+2)*4=12
如何实现一个SQL解析器

文章插图
通过ANTLR处理流程如下图所示:
如何实现一个SQL解析器

文章插图
整体来说一个原则,递归下降 。即定义一个表达式(如expr),可以循环调用直接也可以调用其他表达式,但是最终肯定会有一个最核心的表达式不能再继续往下调用了 。
步骤一:定义词法规则文件(CommonLexerRules.g4)
CommonLexerRules.g4
如何实现一个SQL解析器

文章插图
// 定义词法规则lexer grammar CommonLexerRules;//////// 定义词法// 匹配IDID: [a-zA-Z]+ ;// 匹配INTINT: [0-9]+;// 匹配换行符NEWLINE: '\n'('\r'?);// 跳过空格、跳格、换行符WS: [ \t\n\r]+ -> skip;//////// 运算符DIV:'/';MUL:'*';ADD:'+';SUB:'-';EQU:'=';步骤二:定义语法规则文件(LibExpr.g4)
LibExpr.g4
如何实现一个SQL解析器

文章插图
// 定于语法规则grammar LibExpr;// 导入词法规则import CommonLexerRules;// 词法根prog:stat+ EOF?;// 定义声明stat:expr (NEWLINE)?# printExpr| ID '=' expr (NEWLINE)? # assign| NEWLINE# blank;// 定义表达式expr:expr op=('*'|'/') expr # MulDiv|expr op=('+'|'-') expr # AddSub|'(' expr ')'# Parens|ID# Id|INT# Int;步骤三:编译生成文件
如果是Maven工程,这里在pom文件中添加如下依赖:
ANTLR依赖JAR
如何实现一个SQL解析器

文章插图
<dependencies><dependency><groupId>org.antlr</groupId><artifactId>antlr4</artifactId><version>4.9.3</version></dependency><dependency><groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId><version>4.9.3</version></dependency></dependencies>然后,执行Maven编译命令即可:
Maven编译命令
如何实现一个SQL解析器

文章插图
mvn generate-sources步骤四:编写简单的示例代码
待预算的示例文本:
示例文本

如何实现一个SQL解析器

文章插图
如何实现一个SQL解析器

文章插图
1+21+2*41+2*4-51+2*4-5+20/5(1+2)*4加减乘除逻辑类:
逻辑实现类

经验总结扩展阅读