软件学院实验卡和实验报告学号:xxxxxxxxxxx姓名:xxx年级专业班级:xxxxxxxxxxxxxxxxxxxxxx实验室组别: __ __ 实验日期:2xxx 年xx 月 xxx 日课程名称编译原理实验课时4 实验名称和序号语义分析4 同组者姓名实验目的通过上机实验,加深对语法制导翻译的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。实验环境(1)软件环境: Microsoft Visual Studio 6.0;(2)硬件环境: Windows 2000操作系统。实验内容和原理对给定的程序通过语义分析器能够判断语句串是否正确。正确则输出三地址指令形式的四元式代码,错误则抛出错误信息。实验步骤方法关键代码(1)输入待分析的字符串。语法如下:a.关键字: begin,if,then,while,do,end. b.运算符和界符::= + - * / < <= > >= <> = ; ( ) # c.其他单词是标识符(ID) 和整形常数 (NUM) :ID=letter(letter|digit)*,NUM=digitdigit* d.空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM 、运算符、界符和关键字,词法分析阶段通常被忽略。(2)扫描字符串,采用递归向下进行分析。主要函数如下:a.scaner() //词法分析函数,char token[8] 用来存放构成单词符号的字符串; b.parser() //语法分析, 在语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。只对表达式、赋值语句进行翻译。c. emit(char *result,char *arg1,char *op,char *ag2)//该函数功能是生成一个三地址语句返回四元式表中。d. char *newtemp() //该函数返回一个新的临时变量名,临时变量名产生的顺序为T1,T2, ⋯。( ( 接上页 ) 实验步骤方法关键代码四元式表的结构如下:struct {char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (3)输出为三地址指令形式的四元式序列。例如:语句串begin a:=2+3*4;x:=(a+b)/c;end#,输出的三地址指令如下:t1=3*4 t2=2+t1 a=t2 t3=a+b t4=t3/c x=t4 测试记录分析结论对于正确的语句串,例如:begin a:=2+3*4;x:=(a+b)/c; end#,运行结果如图:对于缺少赋值符号、 “end ”、“begin ”、“(”、“)”等均可做出错误判断并给出相应提示。小结实现了输出为三地址指令形式的四元式序列。通过上机实验 ,加深了对语法制导翻译原理的理解 ,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。加深了对 C++ 语言的用途的理解。以下由实验教...