
文章插图
4.1.2 GrammarANTLR官方提供了很多常用的语言的语法文件,可以进行修改后直接进行复用:https://github.com/antlr/grammars-v4
在使用语法的时候,需要注意以下事项:
- 语法名称和文件名要一致;
- 语法分析器规则以小写字母开始;
- 词法分析器规则以大写字母开始;
- 用'string'单引号引出字符串;
- 不需要指定开始符号;
- 规则以分号结束;
- ...
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

文章插图
通过ANTLR处理流程如下图所示:

文章插图
整体来说一个原则,递归下降 。即定义一个表达式(如expr),可以循环调用直接也可以调用其他表达式,但是最终肯定会有一个最核心的表达式不能再继续往下调用了 。
步骤一:定义词法规则文件(CommonLexerRules.g4)
CommonLexerRules.g4// 定义词法规则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// 定于语法规则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加减乘除逻辑类:
逻辑实现类
经验总结扩展阅读
- 教你用canvas打造一个炫酷的碎片切图效果
- 不满情绪大爆发如何安抚
- 文静诗意的双胞胎名字 双胞胎名字大全
- 副机长工资多少钱一个月 收入高吗
- 40岁眼霜排行榜:雅诗兰黛、赫莲娜上榜,40岁如何选择眼霜
- 机长工资多少钱一个月 收入高不高
- 软件开发工程师一个月多少钱 工资待遇好吗
- 空姐工资一般是多少钱一个月 年终奖有多少
- 梦幻西游搬砖赚钱方式(梦幻西游搬砖如何月入3000)
- 2023年双鱼座爱情劫难 2023年双鱼座如何度过感情劫