1
1
# SYsU-lang
2
2
3
- ** [ 2024 中山大学春季学期实验入口] ( https://github.com/arcsysu/SYsU-lang2 ) ,我们将在经过一个学期的测试之后将其合并进入主线代码** 。
4
-
5
3
SYsU 是一个教学语言,应用于中山大学(** S** un ** Y** at-** s** en ** U** niversity)[ 编译原理课程] ( https://xianweiz.github.io/teach/dcs290/s2022.html ) 的教学。本项目是该课程的实验模板,可以得到一个 SYsU language 的编译器组件。实验的设计目标包括:
6
4
7
5
1 . 在兼容 [ SysY] ( https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf ) 语言的基础上,增加最少的语法支持,使其可以编译 [ Yat-sen OS] ( https://github.com/NelsonCheung-cn/yatsenos-riscv ) 。
@@ -15,7 +13,7 @@ SYsU 是一个教学语言,应用于中山大学(**S**un **Y**at-**s**en **U
15
13
16
14
需要注意的是,[ SysY] ( https://gitlab.eduxiji.net/nscscc/compiler2021/-/blob/master/SysY%E8%AF%AD%E8%A8%80%E5%AE%9A%E4%B9%89.pdf ) 语言允许编译时能够求值的 ` const int ` 作为数组大小,导致部分算例不能通过 ` gcc ` 的编译,因此为保持兼容推荐使用 ` clang ` 编译。经过测试的实验环境为 ` ubuntu:24.04 ` 。
17
15
18
- ``` bash
16
+ ``` shell
19
17
# 安装依赖
20
18
apt-get install -y --no-install-recommends \
21
19
libantlr4-runtime-dev default-jre-headless pkg-config uuid-dev flex bison \
@@ -76,7 +74,7 @@ cmake --build $HOME/sysu-stage2/build -t install
76
74
77
75
对于使用其他操作系统的同学,我们准备了一份 [ docker 开发环境] ( https://hub.docker.com/r/wukan0621/sysu-lang ) 。
78
76
79
- ``` bash
77
+ ``` shell
80
78
docker pull wukan0621/sysu-lang
81
79
docker run \
82
80
--name sysu-lang \
@@ -137,7 +135,7 @@ SYsU 编译器的上层驱动,类似于 `clang`。当前支持的额外功能
137
135
- ` --unittest ` :单元测试
138
136
- ` --convert-sysy ` :转换 SysY 到 SYsU
139
137
140
- ``` bash
138
+ ``` shell
141
139
( export PATH=$HOME /sysu/bin:$PATH \
142
140
CPATH=$HOME /sysu/include:$CPATH \
143
141
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -151,7 +149,7 @@ SYsU 编译器的上层驱动,类似于 `clang`。当前支持的额外功能
151
149
152
150
SYsU 的预处理器。当前 ` sysu-preprocessor ` 直接调用 ` clang --driver-mode=cpp ` ,学有余力的同学也可自行实现。
153
151
154
- ``` bash
152
+ ``` shell
155
153
$ ( export PATH=$HOME /sysu/bin:$PATH \
156
154
CPATH=$HOME /sysu/include:$CPATH \
157
155
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -173,7 +171,7 @@ int main(){
173
171
174
172
SYsU 的新基于 antlr4 的文法分析器,用于代替被诟病已久的 flex+bison 旧实验,产生类似于 ` clang -cc1 -dump-tokens 2>&1 ` 、` clang -cc1 -ast-dump=json ` 的输出。作为文法分析实验模块,本仓库中的 ` sysu-grammar ` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其文法分析规则补充完整([ 详细实验要求] ( grammar/README.md ) )。
175
173
176
- ``` bash
174
+ ``` shell
177
175
$ ( export PATH=$HOME /sysu/bin:$PATH \
178
176
CPATH=$HOME /sysu/include:$CPATH \
179
177
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -194,7 +192,7 @@ eof '' Loc=<tester/functional/000_main.sysu.c:3:2>
194
192
195
193
<!-- {% raw %} -->
196
194
197
- ``` bash
195
+ ``` shell
198
196
$ ( export PATH=$HOME /sysu/bin:$PATH \
199
197
CPATH=$HOME /sysu/include:$CPATH \
200
198
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -210,7 +208,7 @@ $ ( export PATH=$HOME/sysu/bin:$PATH \
210
208
211
209
SYsU 的旧词法分析器,产生类似于 ` clang -cc1 -dump-tokens 2>&1 ` 的输出。作为词法分析实验模块,本仓库中的 ` sysu-lexer ` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其词法规则补充完整([ 详细实验要求] ( lexer/README.md ) )。
212
210
213
- ``` bash
211
+ ``` shell
214
212
$ ( export PATH=$HOME /sysu/bin:$PATH \
215
213
CPATH=$HOME /sysu/include:$CPATH \
216
214
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -235,7 +233,7 @@ SYsU 的旧语法分析器,接受来自 `sysu-lexer` 的输入,输出一个
235
233
236
234
<!-- {% raw %} -->
237
235
238
- ``` bash
236
+ ``` shell
239
237
$ ( export PATH=$HOME /sysu/bin:$PATH \
240
238
CPATH=$HOME /sysu/include:$CPATH \
241
239
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -250,7 +248,7 @@ $ ( export PATH=$HOME/sysu/bin:$PATH \
250
248
251
249
当然,也可以直接从 ` clang -cc1 -dump-tokens 2>&1 ` 获得输入。
252
250
253
- ``` bash
251
+ ``` shell
254
252
( export PATH=$HOME /sysu/bin:$PATH \
255
253
CPATH=$HOME /sysu/include:$CPATH \
256
254
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -264,7 +262,7 @@ $ ( export PATH=$HOME/sysu/bin:$PATH \
264
262
265
263
` sysu-generator ` 将 ` sysu-parser ` 得到的语法分析树转换为 LLVM IR。作为代码生成实验模块,本仓库中的 ` sysu-generator ` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其补充完整([ 详细实验要求] ( generator/README.md ) )。
266
264
267
- ``` bash
265
+ ``` shell
268
266
$ ( export PATH=$HOME /sysu/bin:$PATH \
269
267
CPATH=$HOME /sysu/include:$CPATH \
270
268
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -287,7 +285,7 @@ entry:
287
285
288
286
注意在以下的输出中,` ; ModuleID = '<stdin>' ` 前的输出来自 ` stderr ` ,包含了一个来自 [ banach-space/llvm-tutor] ( https://github.com/banach-space/llvm-tutor/blob/main/lib/StaticCallCounter.cpp ) 的 ` StaticCallCounter ` Pass,可以统计生成代码中包含哪些 ` call ` 调用。
289
287
290
- ``` bash
288
+ ``` shell
291
289
$ ( export PATH=$HOME /sysu/bin:$PATH \
292
290
CPATH=$HOME /sysu/include:$CPATH \
293
291
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -314,7 +312,7 @@ entry:
314
312
315
313
同时提供了一个 LLVM 插件 ` libsysuOptimizer.so ` ,可以使用 ` opt ` 直接加载。这意味着 ` sysu-optimizer ` 中的 pass 也可直接用于 LLVM 生态。
316
314
317
- ``` bash
315
+ ``` shell
318
316
( export PATH=$HOME /sysu/bin:$PATH \
319
317
CPATH=$HOME /sysu/include:$CPATH \
320
318
LIBRARY_PATH=$HOME /sysu/lib:$LIBRARY_PATH \
@@ -350,7 +348,7 @@ entry:
350
348
351
349
大算例以 ` git submodule ` 的形式存放在 ` tester/third_party ` 。加载方式:
352
350
353
- ``` bash
351
+ ``` shell
354
352
git submodule update --init --recursive --depth 1
355
353
```
356
354
0 commit comments