1. 实验目的
- 实现一个支持对四则运算与条件转移四元式翻译的简易编译器
2. 实验内容
3. 词法分析
1 | from collections import namedtuple, deque |
简要说明
- token划分标准:
空白符
、数字
、字母
、等号
、大\小于号
、加减乘除等其余符号
- 退回操作:例如在检测到
大\小于号
时,需要向前继续查看下一个字符是数字
还是等号
(其余情况转错误处理),如果为数字
,则将其退回缓冲区- python实现退回:
file.seek(-1, 1)
- python实现退回:
- token格式:
(type,value)
,例如(NUMBER, 10)
4. LL1制导的语义分析
1 | cur_tok = None |
简要说明
expr
+term
+factor
:四则运算attr
:赋值- 读取
token.type=='EQUAL'
,再调用expr
,相当于x = expression
tac
:记录变量的“符号表”,由列表实现
- 读取
comp
:比较stat
:IF...ELSE...THEN
- 记录
goto LABEL
的”符号表”,由栈实现
- 记录
getNewVar
:创建新的变量getNewLbl
:创建新的LABEL
标识
5. 实验结果
测试输入
1 | x=1+2*3 |
- 注意以
LF
作为换行
输出

BUG
⚠:在stat
里涉及常量与常量,常量与变量的会出现错误的结果,不过我是懒得修了…