A simple compiler front-end for MicroC(a small subset of C).
- 变量必须先声明才能赋值
- 变量类型只有int, char
- 函数类型有void, int, char
- 支持的运算有 + , -, *, /, <<, >>, &&, ||, ! , -(符号取反)
- 不支持预处理语句
- 赋值语句只能单独使用,不能放在表达式内部
- 支持单行注释和多行注释
- 支持全局变量
- 变量可以在函数体的任意位置声明
- 函数声明必须和定义一起
- 预置input()函数用于输入,print()函数用于输出
- 尝试定义 void 型变量时会返回一个int类型
- 使用未定义的变量时会抛出错误信息并以该名字声明一个值为0的int类型变量,以便后续分析
- 变量的重复定义会抛出错误信息,在语法分析时会被忽略
- 函数的参数定义重复,重复的参数会被抛弃并抛出错误信息
- 存在隐式类型转换时会抛出警告
- 调用函数时,参数数量有误,会抛出错误信息,当前函数调用作废,返回 0
- 调用未定义的函数时,抛出错误信息,若有参数,参数将被抛弃,返回 0
- 调用函数时,参数类型不对,会抛出警告信息,并尝试隐式类型转换。
- 未定义main函数时会抛出错误信息。
- 函数的重复定义将会引起错误并导致分析终止
- 输出三地址码文本文件 [源文件名]_out.txt
- 输出语法分析树文本文件 [源文件名]_tree.txt
- 输出分析中的错误信息 [源文件名]_error.txt
- 语法相对参考的TinyC而言丰富了不少,但整体来看还是太过简单。
- 中间代码的输出形式和文法的属性定义上一开始设想的过于简单,导致后续即将完成时才反应过来无法实现逻辑运算的短路原则,这是此项目的最大败笔。
- 一些错误处理不够恰当。
- 暂未实现运行三地址码的模拟器。
语法参考:《自己动手写编译器》https://pandolia.net/tinyc/index.html
- 需要PLY库支持:
pip install ply
- 将目标文件的路径写入main.py中,运行main.py即可得到输出