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

[WIP] add grammar lab (antlr4) #119

Merged
merged 16 commits into from
Jan 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading