实验内容
sum.c是用c语言写的从sum语言到栈式计算机STACK的机器语言的编译器(省略了词法语法分析部分)。该程序的基本功能是先构造SUM语言的某句子的抽象语法树,然后将该语法树翻译成STACK的机器语言程序,并按顺序打印出该机器语言程序的指令。程序中有两段内容不完整(在程序中用TODO表示),请读懂并编译通过该程序,再将TODO的部分补充完整,并编译通过。
读懂程序sum.c并编译通过。(该程序可以使用gcc编译通过,其他编译环境请自行调试)
用你自己写的程序段替换程序中的TODO部分,使程序功能与实验内容的描述一致。
(此要求为额外要求,供学有余力的同学自行选择。)将程序的输入改为句子1+(2+3)的抽象语法树,尝试程序能否输出正确的结果。
实验参考
SUM语言简介:SUM语言是一种描述简单表达式的语言,该语言只有两种终结符num和+,其中num表示整型数,+表示加法。即该语言能表示整型的加法表达式。加法为左结合。
语言的文法为:E -> num | E+E
栈式计算机STACK简介:这种机器有一个栈,能做的操作有两种,第一是向栈中压入一个整型数,第二是将栈顶的两个整型数弹出并做加法,然后将所得结果压入栈中。
因此,该计算机的机器语言只有两个指令,一为:PUSH n;(将整型数n压入栈中);另一为:ADD;(无操作数,默认将栈顶的两个整型数弹出栈并相加,再将结果压入栈中)。
sum.c采用的翻译方法:
SUM语言的句子先写成抽象语法树,然后对抽象语法树进行后续遍历,遍历到整型时就执行PUSH操作,遍历到+时就执行ADD操作。
SUM语言的句子翻译为STACK程序的例子:
SUM语言的句子: 1+2+3
对应的抽象语法树:
1
2
3
4
5+
/ \
+ 3
/ \
1 2翻译成的STACK指令:
PUSH 1
PUSH 2
ADD
PUSH 3
ADD
完整代码
1 |
|
- List_reverse_print 和 compile的case EXP_SUM为填充部分