论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
【编译原理】Antlr 入门使用
【编译原理】Antlr 入门使用
不到断气不罢休
金牌会员
|
2024-5-16 20:32:05
|
显示全部楼层
|
阅读模式
楼主
主题
878
|
帖子
878
|
积分
2634
前面文章我们学习了编译器前端的词法和语法分析工具,本篇我们来看看如何借助 Antlr 工具,快速生成词法和语法分析代码。
一、安装
mac 环境:
1)安装
brew install antlr
复制代码
2)设置 classpath
(把 Antlr 的 JAR 文件设置到 CLASSPATH 环境变量中,以便顺遂编译所生成的 Java 源代码。)
vi ~/.bash_profile
# 替换成你的 antlr jar 路径
CLASSPATH=".:/opt/homebrew/Cellar/antlr/4.13.1/antlr-4.13.1-complete.jar:$CLASSPATH"
source ~/.bash_profile
复制代码
有了这个玩意,你可以用很简单的方式定义好词法和语法文件,他会主动生成对应的解析文件,给你生成出 AST 来。
你可以从生成的类文件中,看看是如何生成 AST 树的。
对于我们之前遇到的左递归问题,它又是如何办理的,也是用循环代替递归么?
生成 AST 树,算完成了词法分析和语法分析。
根据这棵树做什么,就是语义分析了。
二、开发 Java 项目
1、创建一个 maven 项目
2、pom 中添加 Antlr 库
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.10</version>
</dependency>
复制代码
3、编写一个 antlr 文件 Expr.g4。位置随意,可以放到 src 目录
grammar Expr;
expr: expr op=(ADD|SUB) expr # AddSub
| INT # int
;
ADD: '+';
SUB: '-';
INT : [0-9]+ ;
WS : [ \t]+ -> skip;
复制代码
4、编译项目 (如许可以生成一些antlr的解析器的类代码,方便后面编程)
mvn compile
复制代码
你应该能在项目根目录看到一个 gen 文件夹,打开后内里是生成的 java 类
把这部分代码放到你的 src 包路径下 src/main/java/com/xxx/my_antlr_demo/antlr4
5、编写调用代码
EvalVisitor.java
import com.shuofxz.my_antlr_demo.antlr4.ExprBaseVisitor;
import com.shuofxz.my_antlr_demo.antlr4.ExprLexer;
import com.shuofxz.my_antlr_demo.antlr4.ExprParser;
public class EvalVisitor extends ExprBaseVisitor<Integer> {
@Override
public Integer visitAddSub(ExprParser.AddSubContext ctx) {
Integer left = visit(ctx.expr(0)); // should call "visit", not "visitChildren"
Integer right = visit(ctx.expr(1));
if (ctx.op.getType() == ExprLexer.ADD) {
return left + right;
} else {
return left - right;
}
}
@Override
public Integer visitInt(ExprParser.IntContext ctx) {
return Integer.valueOf(ctx.INT().getText());
}
}
复制代码
AppDemo.java
import com.shuofxz.my_antlr_demo.antlr4.ExprLexer;
import com.shuofxz.my_antlr_demo.antlr4.ExprParser;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CodePointCharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
public class AppDemo {
public static void main(String[] args) {
String input = null;
// 此处把输入的参数,直接赋值了
args = new String[2];
args[0] = "-input";
args[1] = "1+2+3-4";
for (int i=0; i<args.length; i++) {
if (args[i].equals("-input")) {
input = args[++i];
}
}
if (input == null) {
System.out.println("args: -input <expression>");
return;
}
CodePointCharStream charStream = CharStreams.fromString(input);
ExprLexer lexer = new ExprLexer(charStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ExprParser parser = new ExprParser(tokens);
ParseTree tree = parser.expr();
EvalVisitor visitor = new EvalVisitor();
Object result = visitor.visit(tree);
System.out.println("output=" + result);
}
}
复制代码
记得重新实行第四步生成代码并更换。
然后我们可以把输入字符换为 1@2@3#4。
你大概猜到了这里就实现了类似操作符重载的功能。
那么后面我们就可以用这个工具,实现我们自己的语法解析工具了。
三、Antlr 中都做了什么?
antlr 语法文件中写的都是啥?
分为两个部分:词法规则和语法规则
词法规则定义了语言的基本词汇元素,即词法单位(Tokens)。它们通常包括标识符、常量、关键字和符号等。通常以大写字母开头,如 ADD、INT 等
语法规则定义了语言的结构,阐明了不同词法单位是如何组合起来形成语言结构的。语法规则描述了语句、表达式、声明等高级结构,如 expr。
接下来我们表明一下关键实行步骤中都做了什么事情:
grammar Expr;
expr: expr op=(ADD|SUB) expr # AddSub
| INT # int
;
ADD: '@';
SUB: '#';
INT : [0-9]+ ;
WS : [ \t]+ -> skip;
复制代码
词法分析器:词法分析的任务是将输入文本分割成一系列的记号(tokens),每个记号是语言中最小的故意义单位,如关键字、标识符、字面量等。
记号流:用于从词法分析器中获取记号,并将它们组织成一个流,以便之后进行语法分析。
语法分析器:对记号流tokens进行语法分析。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
不到断气不罢休
金牌会员
这个人很懒什么都没写!
楼主热帖
Spark的一些重要概念
从SAP ECC升级到SAP S4HANA, 几个Key P ...
手绘地图深度解析:类型、风格、功能、 ...
数据库设计员工管理系统
【Redis高手修炼之路】初学Redis——概 ...
MySQL触发器
物联网无线数传通信模块设备常见的几种 ...
从API到Agent:万字长文洞悉LangChain ...
【高效学数据库】第一范式、第二范式、 ...
什么是计算机网络
标签云
存储
服务器
快速回复
返回顶部
返回列表