步骤二:定义语法规则文件(LibExpr.g4)
LibExpr.g4// 定于语法规则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<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编译命令mvn generate-sources步骤四:编写简单的示例代码
文章插图
待预算的示例文本:
示例文本
文章插图
文章插图
1+21+2*41+2*4-51+2*4-5+20/5(1+2)*4加减乘除逻辑类:
逻辑实现类package com.vivo.learn.sql;import java.util.HashMap;import java.util.Map;/** * 重写访问器规则,实现数据计算功能 * 目标: *1+2 => 1+2=3 *1+2*4 => 1+2*4=9 *1+2*4-5 => 1+2*4-5=4 *1+2*4-5+20/5 => 1+2*4-5+20/5=8 *(1+2)*4 => (1+2)*4=12 */public class LibExprVisitorImpl extends LibExprBaseVisitor<Integer> {// 定义数据Map<String,Integer> data = https://www.huyubaike.com/biancheng/new HashMap
文章插图
package com.vivo.learn.sql;import org.antlr.v4.runtime.tree.ParseTree;import java.io.FileNotFoundException;import java.io.IOException;import org.antlr.v4.runtime.*;/** * 打印语法树 */public class TestLibExprPrint {// 打印语法树 input -> lexer -> tokens -> parser -> tree -> printpublic static void main(String args[]){printTree("E:\\smartloli\\hadoop\\sql-parser-example\\src\\main\\resources\\testCase.txt");}/*** 打印语法树 input -> lexer -> token -> parser -> tree* @param fileName*/private static void printTree(String fileName){// 定义输入流ANTLRInputStream input = null;// 判断文件名是否为空,若不为空,则读取文件内容,若为空,则读取输入流if(fileName!=null){try{input = new ANTLRFileStream(fileName);}catch(FileNotFoundException fnfe){System.out.println("文件不存在,请检查后重试!");}catch(IOException ioe){System.out.println("文件读取异常,请检查后重试!");}}else{try{input = new ANTLRInputStream(System.in);}catch(FileNotFoundException fnfe){System.out.println("文件不存在 , 请检查后重试!");}catch(IOException ioe){System.out.println("文件读取异常,请检查后重试!");}}// 定义词法规则分析器LibExprLexer lexer = new LibExprLexer(input);// 生成通用字符流CommonTokenStream tokens = new CommonTokenStream(lexer);// 语法解析LibExprParser parser = new LibExprParser(tokens);// 生成语法树ParseTree tree = parser.prog();// 打印语法树// System.out.println(tree.toStringTree(parser));// 生命访问器LibExprVisitorImpl visitor = new LibExprVisitorImpl();visitor.visit(tree);}}
推荐阅读
- 教你用canvas打造一个炫酷的碎片切图效果
- 40岁眼霜排行榜:雅诗兰黛、赫莲娜上榜,40岁如何选择眼霜
- 2021微信收藏如何全部删除(怎样全部删除微信收藏)
- cf如何免费修改名字(手机可以改cf名字吗)
- cf端游如何改名(cf改名卡多少钱一个)
- 梦幻西游搬砖赚钱方式(梦幻西游搬砖如何月入3000)
- 听说玩梦幻西游能赚钱,小白如何开始(梦幻单开159能赚钱吗)
- Spring 深入——IoC 容器 02
- 函数柯里化实现sum函数
- 原神坎蒂丝武器如何搭配