@@ -20,15 +20,11 @@ Lab 课大致安排:
20
20
21
21
参考 [ 环境配置] ( ../env/index.md )
22
22
23
- ## 什么是编译器
24
-
25
- TODO
26
-
27
23
## 什么是 ANTLR
28
24
29
25
ChatGPT said:
30
26
31
- ANTLR(ANother Tool for Language Recognition)是一个功能强大的 语法解析器生成工具,常用于构建编译器、解释器、DSL(领域特定语言)、代码分析工具等。它的主要作用是将 ** 文法规则** 转换成可以在目标语言(如 Java、C#, Python, JavaScript 等)中运行的 ** 词法分析器(Lexer)** 和 ** 语法分析器(Parser)** 。
27
+ ANTLR(ANother Tool for Language Recognition)是一个功能强大的 ** 语法解析器生成工具** ,常用于构建编译器、解释器、DSL(领域特定语言)、代码分析工具等。它的主要作用是将 ** 文法规则** 转换成可以在目标语言(如 Java、C#, Python, JavaScript 等)中运行的 ** 词法分析器(Lexer)** 和 ** 语法分析器(Parser)** 。
32
28
33
29
### 什么是文法规则
34
30
@@ -58,127 +54,78 @@ ANTLR(ANother Tool for Language Recognition)是一个功能强大的 语法
58
54
59
55
Project Zero is released!
60
56
57
+ ## ANTLR 配置
61
58
62
- 以下删除。
63
-
64
- ### 1. 先把 Java 装好
59
+ 首先,从 https://github.com/sqlab-sustech/CS323-Compilers-2025F-Projects/ clone 代码,并切换到 project0-fake1 分支:
65
60
66
- ANTLR 是用 Java 写的,运行时也需要 JVM,所以第一步就是装 Java。
67
- - 如果你已经装过 JDK 8 或以上版本,在终端/命令行里敲
68
- ```
69
- java -version
70
- ```
71
- 能出现类似 ` openjdk 17.0.x ` 的字样,就跳过这一步。
72
- - 如果提示找不到命令,先去 [ Oracle 官网] ( https://www.oracle.com/cn/java/technologies/downloads/ ) 下载对应系统的 JDK。安装完记得把 ` JAVA_HOME ` 配好,并把 ` %JAVA_HOME%/bin ` (Windows)或 ` $JAVA_HOME/bin ` (macOS/Linux)加到系统 PATH 里。
73
- Windows 用户可以在“系统属性 → 高级 → 环境变量”里弄;mac/Linux 在 ` ~/.bashrc ` 或 ` ~/.zshrc ` 里加个
74
- ```
75
- export JAVA_HOME="你放置java的目录"
76
- export PATH=$JAVA_HOME/bin:$PATH
77
- ```
78
- 然后 ` source ~/.zshrc ` 或者` source ~/.bashrc ` 让它生效。
79
-
80
- ---
61
+ ``` shell
62
+ $ git clone https://github.com/sqlab-sustech/CS323-Compilers-2025F-Projects/
63
+ $ cd CS323-Compilers-2025F-Projects
64
+ $ git checkout project0-fake1
65
+ ```
81
66
82
- ### 2. 准备 IntelliJ IDEA 和 Maven
67
+ 随后,在 IDEA 中打开这个文件夹,你应该看到如下目录结构:
83
68
84
- IDEA 推荐用 ** IntelliJ IDEA Community** (免费)或 ** Ultimate** (学生免费)。去 [ JetBrains 官网] ( https://www.jetbrains.com/idea/download ) 下载安装即可。
85
- Maven 可以选两条路:
86
- - 懒人做法:什么都不用管,IDEA 自带 Maven 了。
87
- - 手痒做法:去 [ Maven 官网] ( https://maven.apache.org/download.cgi ) 下载二进制包,解压后把 ` bin ` 目录加到 PATH,同样在终端里 ` mvn -v ` 能出信息即可。
69
+ ![ alt text] ( ../assets/labs/w1-intro/idea-dir.png )
88
70
89
- ---
71
+ 设置 Java SDK 版本为 21。
90
72
91
- ### 3. 安装 ANTLR 插件
73
+ ### 使用 Makefile 编译 ANTLR 语法文件
92
74
93
- 1 . 打开 IDEA → 左上角 ** File → Settings** (macOS 是 ** IntelliJ IDEA → Preferences** )。
94
- 2 . 左侧找到 ** Plugins → Marketplace** ,搜索框里敲 ** ANTLR v4** 。
95
- ![ ] ( ../assets/antlr/plugin.png )
96
- 3 . 看到作者是 “ANTLR” 的那个,点 ** Install** ,装完后重启 IDEA。
97
- 4 . 重启完,随便打开一个 ` .g4 ` 文件,如果左侧项目树里文件名左边出现一只小“A”图标,就说明插件安装成功。
98
- ---
75
+ 我们之前说,ANTLR 是一套 ** 语法解析器生成工具** ,它可以针对某个给定的语法文件,生成一些可以处理该语法的代码。
99
76
100
- ### 4. 新建 Maven 项目并放好语法文件
77
+ 项目根目录中有一个 ` Calc1.g4 ` 文件,它是一个 ANTLR 的语法文件,在项目根目录下执行 ` make ` ,我们可以注意到在 ` src/main/java ` 下面多了 ` generated.Calc1 ` 这个包,里面有若干 ` .java ` 文件。这些代码就是 ANTLR 工具针对 ` Calc1.g4 ` 这个语法生成的代码。
101
78
102
- 1 . ** File → New → Project → Maven** ,直接 ** Next** 。
103
- 2 . IDEA 会自动帮你生成 ` src/main/java ` 、` src/main/resources ` 等目录。(如果没有可以自己新建,在对应的目录下右击新建文件夹,应该会有提示)
104
- 3 . 在 ` src/main ` 上右键 → ** New → Directory** ,起名 ` grammar ` 。
105
- 4 . 把我们提供的 ` Calculator.g4 ` 拖进去。
106
- 此时如果插件生效,` Calculator.g4 ` 左侧会出现一个红色小“A”图标。
79
+ ![ alt text] ( ../assets/labs/w1-intro/antlr-codegen-make.png )
107
80
108
- ---
81
+ 再执行 ` make clean ` 我们会发现 ` generated/ ` 目录被删除了。
109
82
110
- ### 5. 配置 ANTLR 代码生成路径
83
+ ### 安装 IDEA 的 ANTLR 插件
111
84
112
- 1 . 在 ` Calculator.g4 ` 上右键 → ** Configure ANTLR...** 。
113
- 弹出的窗口里填:
114
- - ** Output directory...** 选到项目根目录下的 ` src/main/java ` (点右侧文件夹图标,一路点进去)。
115
- - ** Package/namespace** 填 ` antlr ` 。
116
- - ** Language** 选 ` Java ` 。
117
- 其他保持默认 → ** OK** 。
118
- ![ ] ( ../assets/antlr/menu2.png )
119
- 2 . 再右键 ` Calculator.g4 ` → ** Generate ANTLR Recognizer** 。
120
- 几秒后,你会看到 ` src/main/java/antlr ` 下面蹦出 ` CalculatorLexer.java ` 、` CalculatorParser.java ` 等文件。
85
+ 打开 Settings,找到 Plugin,在 Marketplace 里搜索 ** ANTLR v4** ,安装开发者为 "Terence Parr" 的那个插件。
121
86
122
- ---
87
+ ![ alt text ] ( ../assets/labs/w1-intro/antlr-plugin.png )
123
88
124
- ### 6. 引入 ANTLR 运行时依赖
89
+ 在 ` Calc1.g4 ` 文件上点右键,在菜单栏中点 "Configure ANTLR",打开配置框,并按照如下配置:
125
90
126
- 这时候 ` *.java ` 文件会一片红,因为缺antlr运行时所需要的jar包。
127
- 打开项目根目录下的 ` pom.xml ` ,把光标放在 ` <dependencies> ` 标签里(如果没有就自己建一个),粘贴:
91
+ ![ alt text] ( ../assets/labs/w1-intro/antlr-plugin-configure.png )
128
92
129
- ``` xml
130
- <dependency >
131
- <groupId >org.antlr</groupId >
132
- <artifactId >antlr4</artifactId >
133
- <version >4.13.2</version >
134
- </dependency >
135
- ```
93
+ 在 ` Calc1.g4 ` 文件上点右键,在菜单栏中点 "Generate ANTLR Recognizer",我们会注意到在 ` src/main/java/generated/Calc1 ` 下面出现了同样的文件。
136
94
137
- 保存后,IDEA 右上角会出现一个小 Maven 图标,点它或者按 ** Ctrl+Shift+O** (mac 是 ⌘+⇧+O)刷新。
138
- 等进度条跑完,红色波浪线会全部消失。
139
- ![ ] ( ../assets/antlr/reload.png )
140
- ---
95
+ ### 调用 ANTLR
141
96
142
- ### 7. 写个 Main 类跑起来
143
-
144
- 1 . 在 ` src/main/java ` 上右键 → ** New → Java Class** ,起名 ` Main ` 。
145
- 2 . 把下面代码粘进去:
97
+ 将 ` Main.java ` 覆盖为如下内容,如果遇到了依赖问题,使用 Maven 解决依赖问题。
146
98
147
99
``` java
148
- package com.example.antlr_demo ;
149
-
150
- import antlr.CalculatorLexer ;
151
- import antlr.CalculatorParser ;
100
+ import generated.Calc1.Calc1Lexer ;
101
+ import generated.Calc1.Calc1Parser ;
152
102
import org.antlr.v4.runtime.* ;
103
+ import org.antlr.v4.runtime.tree.* ;
153
104
154
105
public class Main {
155
106
public static void main (String [] args ) {
156
107
// 把要解析的字符串喂给 ANTLR
157
108
CharStream input = CharStreams . fromString(" 1 + 2" );
158
109
// 词法分析器
159
- CalculatorLexer lexer = new CalculatorLexer (input);
110
+ Calc1Lexer lexer = new Calc1Lexer (input);
160
111
// Token 流
161
112
CommonTokenStream tokens = new CommonTokenStream (lexer);
162
113
// 语法分析器
163
- CalculatorParser parser = new CalculatorParser (tokens);
114
+ Calc1Parser parser = new Calc1Parser (tokens);
164
115
// 从规则 'expression' 开始解析
165
- ParseTree tree = parser. expression ();
116
+ ParseTree tree = parser. expr ();
166
117
// 把树打印出来看看
167
118
System . out. println(tree. toStringTree(parser));
168
119
}
169
120
}
170
121
```
171
122
172
- 3 . 右键 ` Main.java ` → ** Run 'Main.main()'** 。
173
- 控制台会输出:
123
+ 然后,运行该 Main 类,Console 会输出:
174
124
175
125
```
176
126
(expression (term 1) + (term 2))
177
127
```
178
128
179
- 这就表示 ANTLR 成功把 ` 1 + 2 ` 拆成了一棵语法树。
180
- 暂时看不懂树长什么样没关系,后面我们会慢慢讲到它背后的含义。
129
+ 这就表示 ANTLR 成功把 ` 1 + 2 ` 拆成了一棵语法树。
181
130
182
- ---
183
-
184
- 跟着做完这几步,你就拥有了能跑起来的 ANTLR 环境。接下来我们就可以开始写真正的语法规则了。
131
+ 暂时看不懂树长什么样没关系,后面我们会慢慢讲到它背后的含义。
0 commit comments