Skip to content
This repository has been archived by the owner on Dec 11, 2024. It is now read-only.

Commit

Permalink
[WIP] add grammar lab (antlr4) (#119)
Browse files Browse the repository at this point in the history
增加新的前端实验,使用 antlr4 代替 flex + bison
  • Loading branch information
WuK authored Jan 12, 2024
1 parent db47166 commit fcb0f0d
Show file tree
Hide file tree
Showing 14 changed files with 1,441 additions and 107 deletions.
35 changes: 6 additions & 29 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ name: docker

on:
push:
branches: [latest, unstable-slim]
branches: [latest]
tags: ["*"]
pull_request:
branches: [latest, unstable-slim]
branches: [latest]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

Expand All @@ -28,7 +28,7 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: ${{ github.ref_name != 'unstable-slim' }}
submodules: True

# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
Expand All @@ -48,24 +48,13 @@ jobs:
# Build Docker image with Buildx
# https://github.com/docker/build-push-action
- name: Build Docker image
if: github.ref_name != 'unstable-slim' && github.base_ref != 'unstable-slim'
uses: docker/build-push-action@v3
with:
load: true
context: .
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: BASE_IMAGE=debian:bookworm

- name: Build Docker image for unstable-slim
if: github.ref_name == 'unstable-slim' || github.base_ref == 'unstable-slim'
uses: docker/build-push-action@v3
with:
load: true
context: .
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: BASE_IMAGE=debian:unstable-slim
build-args: BASE_IMAGE=ubuntu:noble

- name: Run Tests
continue-on-error: true
Expand All @@ -84,23 +73,11 @@ jobs:
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
if: github.ref_name != 'unstable-slim' && github.base_ref != 'unstable-slim'
uses: docker/build-push-action@v3
with:
push: ${{ github.event_name != 'pull_request' }}
context: .
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: BASE_IMAGE=debian:bookworm
platforms: linux/amd64,linux/arm64/v8

- name: Build and push Docker image for unstable-slim
if: github.ref_name == 'unstable-slim' || github.base_ref == 'unstable-slim'
uses: docker/build-push-action@v3
with:
push: ${{ github.event_name != 'pull_request' }}
context: .
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: BASE_IMAGE=debian:unstable-slim
platforms: linux/amd64,linux/arm64/v8,linux/riscv64,linux/386,linux/arm/v7,linux/mips64le,linux/ppc64le,linux/s390x # ,linux/arm/v5
build-args: BASE_IMAGE=ubuntu:noble
platforms: linux/amd64,linux/arm64/v8,linux/arm/v7,linux/ppc64le,linux/s390x
7 changes: 4 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# <https://github.com/llvm/llvm-project/blob/llvmorg-14.0.6/llvm/CMakeLists.txt>
cmake_minimum_required(VERSION 3.13.4)
project(SYsU-lang VERSION 12.0.0.20230529)
# <https://github.com/llvm/llvm-project/blob/llvmorg-17.0.6/llvm/CMakeLists.txt>
cmake_minimum_required(VERSION 3.20.0)
project(SYsU-lang VERSION 2404.0.0.20240229)
include(CPack)
include(CTest)
add_subdirectory(compiler)
add_subdirectory(preprocessor)
add_subdirectory(grammar)
add_subdirectory(lexer)
add_subdirectory(parser)
add_subdirectory(generator)
Expand Down
55 changes: 27 additions & 28 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,53 +1,52 @@
# syntax=docker/dockerfile:1.4
ARG BASE_IMAGE=debian
ARG BASE_IMAGE=ubuntu
FROM ${BASE_IMAGE}
WORKDIR /autograder
WORKDIR /workspace
VOLUME /workspace
COPY <<build_install.sh <<run.sh . /workspace/SYsU-lang/
WORKDIR /opt/SYsU-lang
COPY <<build_install.sh <<run.sh . /opt/SYsU-lang
#!/bin/sh
rm -rf \$HOME/sysu
rm -rf \$2
cmake -G Ninja \\
-DCMAKE_BUILD_TYPE=RelWithDebInfo \\
-DCMAKE_C_COMPILER=clang \\
-DCMAKE_CXX_COMPILER=clang++ \\
-DCMAKE_INSTALL_PREFIX=\$HOME/sysu \\
-DCMAKE_CXX_STANDARD=17 \\
-DCMAKE_INSTALL_PREFIX=\$2 \\
-DCMAKE_PREFIX_PATH="$(llvm-config --cmakedir)" \\
-DCPACK_SOURCE_IGNORE_FILES=".git/;tester/third_party/" \\
-S /workspace/SYsU-lang \\
-B \$HOME/sysu/build
cmake --build \$HOME/sysu/build
cmake --build \$HOME/sysu/build -t install
-S \$1 \\
-B \$2/build
cmake --build \$2/build -j
cmake --build \$2/build -t install
build_install.sh
#!/bin/sh
python3 -m tarfile -e /autograder/submission/*.tar.gz /workspace/submission
rm -rf /workspace/SYsU-lang/generator
cp -r /workspace/submission/*-Source/generator /workspace/SYsU-lang
rm -rf /workspace/SYsU-lang/optimizer
cp -r /workspace/submission/*-Source/optimizer /workspace/SYsU-lang
rm -rf /workspace/submission
\$HOME/build_install
python3 -m tarfile -e /autograder/submission/*.tar.gz /opt/SYsU-lang/submission
rm -rf /opt/SYsU-lang/generator
cp -r /opt/SYsU-lang/submission/*-Source/generator /opt/SYsU-lang
rm -rf /opt/SYsU-lang/optimizer
cp -r /opt/SYsU-lang/submission/*-Source/optimizer /opt/SYsU-lang
rm -rf /opt/SYsU-lang/submission
/opt/SYsU-lang/build_install.sh /opt/SYsU-lang /opt/sysu
mkdir -p /autograder/results
sysu-compiler \\
--unittest=benchmark_generator_and_optimizer_1 \\
"/workspace/SYsU-lang/**/*.sysu.c" >/autograder/results/results.json
"/opt/SYsU-lang/**/*.sysu.c" >/autograder/results/results.json
run.sh
RUN <<EOF
apt-get update -y
apt-get upgrade -y
apt-get install -y --no-install-recommends \
clang llvm-dev zlib1g-dev libzstd-dev \
lld flex bison cmake python3 ninja-build git
libantlr4-runtime-dev default-jre-headless pkg-config uuid-dev flex bison \
clang llvm-dev zlib1g-dev libzstd-dev lld python3 cmake ninja-build git
apt-get autoremove -y
apt-get clean -y
rm -rf /var/lib/apt/lists/*
mv /workspace/SYsU-lang/run.sh /autograder/run
mv /opt/SYsU-lang/run.sh /autograder/run
chmod +x /autograder/run
mv /workspace/SYsU-lang/build_install.sh $HOME/build_install
chmod +x $HOME/build_install
$HOME/build_install
chmod +x /opt/SYsU-lang/build_install.sh
/opt/SYsU-lang/build_install.sh /opt/SYsU-lang /opt/sysu
EOF
ENV PATH=/root/sysu/bin:$PATH \
CPATH=/root/sysu/include:$CPATH \
LIBRARY_PATH=/root/sysu/lib:$LIBRARY_PATH \
LD_LIBRARY_PATH=/root/sysu/lib:$LD_LIBRARY_PATH
ENV PATH=/opt/sysu/bin:$PATH \
CPATH=/opt/sysu/include:$CPATH \
LIBRARY_PATH=/opt/sysu/lib:$LIBRARY_PATH \
LD_LIBRARY_PATH=/opt/sysu/lib:$LD_LIBRARY_PATH
65 changes: 49 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ SYsU 是一个教学语言,应用于中山大学(**S**un **Y**at-**s**en **U

## 编译运行

需要注意的是,[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` 编译。经过测试的实验环境为 `debian:bookworm`
需要注意的是,[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:noble`

```bash
# 安装依赖
apt-get install -y --no-install-recommends \
clang llvm-dev zlib1g-dev libzstd-dev \
lld flex bison cmake python3 ninja-build git
libantlr4-runtime-dev default-jre-headless pkg-config uuid-dev flex bison \
clang llvm-dev zlib1g-dev libzstd-dev lld python3 cmake ninja-build git

git clone \
-c feature.manyFiles=true \
Expand All @@ -34,6 +34,7 @@ cmake -G Ninja \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_INSTALL_PREFIX=$HOME/sysu \
-DCMAKE_PREFIX_PATH="$(llvm-config --cmakedir)" \
-DCPACK_SOURCE_IGNORE_FILES=".git/;tester/third_party/" \
Expand Down Expand Up @@ -164,9 +165,46 @@ int main(){
}
```

### `grammar`

SYsU 的新语义分析器,产生类似于 `clang -cc1 -dump-tokens 2>&1``clang -cc1 -ast-dump=json` 的输出。作为语义分析实验模块,本仓库中的 `sysu-grammar` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其语义分析规则补充完整([详细实验要求](grammar/README.md))。

```bash
$ ( export PATH=$HOME/sysu/bin:$PATH \
CPATH=$HOME/sysu/include:$CPATH \
LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \
LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH &&
sysu-preprocessor tester/functional/000_main.sysu.c |
sysu-grammar -dump-tokens )
int 'int' Loc=<tester/functional/000_main.sysu.c:1:1>
identifier 'main' Loc=<tester/functional/000_main.sysu.c:1:5>
l_paren '(' Loc=<tester/functional/000_main.sysu.c:1:9>
r_paren ')' Loc=<tester/functional/000_main.sysu.c:1:10>
l_brace '{' Loc=<tester/functional/000_main.sysu.c:1:11>
return 'return' Loc=<tester/functional/000_main.sysu.c:2:5>
numeric_constant '3' Loc=<tester/functional/000_main.sysu.c:2:12>
semi ';' Loc=<tester/functional/000_main.sysu.c:2:13>
r_brace '}' Loc=<tester/functional/000_main.sysu.c:3:1>
eof '' Loc=<tester/functional/000_main.sysu.c:3:2>
```

<!-- {% raw %} -->

```bash
$ ( export PATH=$HOME/sysu/bin:$PATH \
CPATH=$HOME/sysu/include:$CPATH \
LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \
LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH &&
sysu-preprocessor tester/functional/000_main.sysu.c |
sysu-grammar )
{"inner":[{"inner":[{"inner":[{"inner":[{"kind":"IntegerLiteral","value":"3"}],"kind":"ReturnStmt"}],"kind":"CompoundStmt"}],"kind":"FunctionDecl","name":"main"}],"kind":"TranslationUnitDecl"}
```

<!-- {% endraw %} -->

### `lexer`

SYsU 的词法分析器,产生类似于 `clang -cc1 -dump-tokens 2>&1` 的输出。作为词法分析实验模块,本仓库中的 `sysu-lexer` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其词法规则补充完整([详细实验要求](lexer/README.md))。
SYsU 的旧词法分析器,产生类似于 `clang -cc1 -dump-tokens 2>&1` 的输出。作为词法分析实验模块,本仓库中的 `sysu-lexer` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其词法规则补充完整([详细实验要求](lexer/README.md))。

```bash
$ ( export PATH=$HOME/sysu/bin:$PATH \
Expand All @@ -189,7 +227,7 @@ eof '' Loc=<tester/functional/000_main.sysu.c:3:2>

### `parser`

SYsU 的语法分析器,接受来自 `sysu-lexer` 的输入,输出一个 json 格式的语法分析树(类似于 `clang -cc1 -ast-dump=json`)。作为语法分析实验模块,本仓库中的 `sysu-parser` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其语法规则补充完整([详细实验要求](parser/README.md))。
SYsU 的旧文法分析器,接受来自 `sysu-lexer` 的输入,输出一个 json 格式的语法分析树(类似于 `clang -cc1 -ast-dump=json`)。作为语法分析实验模块,本仓库中的 `sysu-parser` 并不能处理完整的 SYsU,但提供了一个模板,需要学生将其语法规则补充完整([详细实验要求](parser/README.md))。

<!-- {% raw %} -->

Expand Down Expand Up @@ -228,8 +266,7 @@ $ ( export PATH=$HOME/sysu/bin:$PATH \
LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \
LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH &&
sysu-preprocessor tester/functional/000_main.sysu.c |
sysu-lexer |
sysu-parser |
sysu-grammar |
sysu-generator )
; ModuleID = '-'
source_filename = "-"
Expand All @@ -252,8 +289,7 @@ $ ( export PATH=$HOME/sysu/bin:$PATH \
LIBRARY_PATH=$HOME/sysu/lib:$LIBRARY_PATH \
LD_LIBRARY_PATH=$HOME/sysu/lib:$LD_LIBRARY_PATH &&
sysu-preprocessor tester/functional/000_main.sysu.c |
sysu-lexer |
sysu-parser |
sysu-grammar |
sysu-generator |
sysu-optimizer )
=================================================
Expand Down Expand Up @@ -349,16 +385,13 @@ git submodule update --init --recursive --depth 1

### Q & A: 本项目的版本管理的规则是?为什么项目名为 SYsU-lang,而非 SYsU-compiler ?

目前本项目存在两个分支:

- [`latest`](https://github.com/arcsysu/SYsU-lang/tree/latest) 分支下为中大课程教学中使用的代码,功能稳定,预期在 `debian:bookworm` 环境中工作。
- [`unstable-slim`](https://github.com/arcsysu/SYsU-lang/tree/unstable-slim) 分支下为助教探索后续实验改革方案(如 mlir)的代码,预期在`debian:unstable-slim` 环境中工作。该分支中的文档可能不会及时更新,以对应 [Dockerfile](https://github.com/arcsysu/SYsU-lang/blob/unstable-slim/Dockerfile) 中的测试语句为准。
[`latest`](https://github.com/arcsysu/SYsU-lang/tree/latest) 分支下为中大课程教学中使用的代码,功能较为稳定,预期在 `ubuntu:noble` 环境中工作。文档可能不会及时更新,以对应 [Dockerfile](https://github.com/arcsysu/SYsU-lang/blob/latest/Dockerfile) 中的测试语句为准。

对于中大以外的高校教学者与个人自学者,我们建议使用 [releases](https://github.com/arcsysu/SYsU-lang/releases) 中最新发布的实验框架源码以及对应版本号的 [docker image](https://hub.docker.com/r/wukan0621/sysu-lang)。它们可能在时间上略有落后,但经过了中大一学期的教学检验,不存在潜在的可能导致教学事故的错误。我们也十分欢迎来自你们的课堂反馈[![Discussions](https://img.shields.io/github/discussions/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/discussions) 与改进建议[![Issues](https://img.shields.io/github/issues/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/issues)[![Issues-pr](https://img.shields.io/github/issues-pr/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/pulls) 请提交至 `unstable-slim` 分支)
对于中大以外的高校教学者与个人自学者,我们建议使用 [releases](https://github.com/arcsysu/SYsU-lang/releases) 中最新发布的实验框架源码以及对应版本号的 [docker image](https://hub.docker.com/r/wukan0621/sysu-lang)。它们可能在时间上略有落后,但经过了中大一学期的教学检验,不存在潜在的可能导致教学事故的错误。我们也十分欢迎来自你们的课堂反馈[![Discussions](https://img.shields.io/github/discussions/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/discussions) 与改进建议[![Issues](https://img.shields.io/github/issues/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/issues)[![Issues-pr](https://img.shields.io/github/issues-pr/arcsysu/SYsU-lang)](https://github.com/arcsysu/SYsU-lang/pulls)

版本号的命名格式为 `<major>.<minor>.<patch>.<tweak>`,如 `11.0.7.20221118`。一般来说,对于使用 `latest` 分支代码的用户,`<major>``<minor>``<patch>` 发生变化时,我们建议尽快更新至最新版本。
版本号的命名格式为 `<major>.<minor>.<patch>.<tweak>`,如 `2404.0.0.20240229`。一般来说,对于使用 `latest` 分支代码的用户,`<major>``<minor>``<patch>` 发生变化时,我们建议尽快更新至最新版本。

- `<major>` 指示了该版本的软件依赖为对应的 debian 版本
- `<major>` 指示了该版本的软件依赖为对应的 ubuntu/debian 版本
- `<minor>` 指示了该版本的功能版本,不同 `<minor>` 间可能不直接兼容
- `<patch>` 指示了该版本的补丁版本,不同 `<patch>` 间预期可以直接更新,修正前一个版本中存在的问题
- `<tweak>` 指示了当前版本代码(不含文档)的日期,可能存在微调,但不同 `<tweak>` 的代码应当具有完全相同的表现
Expand Down
Loading

0 comments on commit fcb0f0d

Please sign in to comment.