编译原理课程设计:实现 C 语言子集到 x86-64 汇编 的完整编译器,链接部分使用 gcc。
流水线:词法分析 → LL(1) 预测分析 → 语法树 → 四元式中间代码 → x86-64 汇编
- Python 3.10+:
dataclass(Token / Mnode / Node)、类型标注、pathlib、f-string - 包结构:代码重组为
pcc/包,支持pip install与pcc命令行 - CLI 重构:
argparse标准参数解析;移除os.system()执行用户输入的隐患 - 测试套件:14 个 pytest 用例(词法 / 语法 / 中间代码 / 汇编 / gcc 端到端)
- 行为兼容:生成的四元式与汇编与 v1.0 逐字节一致(仅
.ident版本号变化) - 旧版代码保留在
legacy/供学习对比
pip install . # 安装为 pcc 命令
# 或直接使用:
python -m pcc.cli -hpcc -o <file.c> # 直接编译生成可执行程序(需 gcc)
pcc -s <file.c> # 生成汇编源码 (.s)
pcc -m <file.c> # 查看生成的四元式(中间代码)
pcc -t <file.c> # 查看语法树生成过程
pcc -l <file.c> # 查看词法分析
pcc -p # 查看预测分析表
pcc -g # 查看语法推导
pcc -v # 显示版本
pcc # 交互模式pip install pytest
python -m pytest tests/ -v| 模块 | 职责 |
|---|---|
pcc/utils.py |
公共工具函数(切词、判断、符号表) |
pcc/lexer.py |
词法分析器(Token dataclass) |
pcc/get_predict_table.py |
FIRST/FOLLOW 集合与 LL(1) 预测分析表 |
pcc/lr.py |
非递归预测分析(语法树生成) |
pcc/generate.py |
中间代码生成(四元式) |
pcc/to_asm.py |
x86-64 汇编生成 |
pcc/cli.py |
命令行入口 |
tests/ |
pytest 测试套件 |
legacy/ |
v1.0 原始代码(存档) |
- 声明与赋值
int a;
a = 10;
int b = a;- 混合四则运算
int a = 1 + 2*(3 - 4);- 数组(下标支持嵌套表达式)
int arr[10];
a[0] = 1;
int b = a[0];
arr[arr[(index+1)*2-1]] = 7;- printf 输出(最多三个参数,支持表达式)
printf("三个参数:%d,%d,%d",a,b,c);
printf("%d", d + 2*(3+4));- if 嵌套
if(a < 2*10){
a = a + 1;
if(c < a){
printf("%d", a*c);
}
}- while 嵌套
int main(){
int i = 1;
printf("正在由pcc编译器为你打印99乘法表!\n");
while(i < 10){
int j = i;
while(j < 10){
printf("%d*%d=%d\t",i, j, i*j);
j = j + 1;
}
printf("\n");
i = i +1;
}
}$ pcc -o test/99mul.c
编译成功,执行:test/99mul
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 ... .text
.section .rodata
.LC0:
.string "f(%d)=%d\n"
.text
.globl main
.type main, @function
main:
.cfi_startproc
pushq %rbp
...
call printf@PLTMIT © flymysql