编译技术第5次上机内容 目的:充分理解语义分析的方法及相关语义计算的执行时机,用C++程序实现。 要求: 1.以S属性的语法制导定义为基础,将下表的语义规则嵌套在语法分析的过程中,即实现语法制导的翻译过程。 产 生 式 语 义 规 则 L ® E n print (E.val) E ® E1 + T E.val := E1 .val + T.val E ® T E.val := T.val T ® T1 * F T.val := T1.val * F.val T ® F T.val := F.val F® (E) F.val := E.val F ® digit F.val := digit.lexval 2.以语法分析部分的两次上机结果为基础,添加语义分析部分。即以LL(1)文法或者LR文法为基础。当产生式完全推导出来或者归约时执行对应的语义动作。 3.输入: 5+3+8*2 输出:24 4. 若输入有误,如:3**2(4+5) 则应提示:*后面缺少运算对象, 2后面缺少运算符, 请重新输入! 5. 由于输入串是具体的数值,因此应调用相应的词法分析的功能。 扩展: 1. 对浮点数也能完成上述的操作。 2. 增加减法和除法对应的产生式,并能计算其语义结果。 3. 在FTP中第五次上机的文件夹中有两个压缩包,用递归下降法实现的程序在压缩包“recursion_calculator.rar”中,用非递归的预测分析方法实现的程序在压缩包“predict_calculator.rar”中。可以任选其一作为基础进行改进。将其改造成有减法和除法的程序,并写出对应的产生式。
2022-11-07 22:51:43 359KB 语法 制导 定义 计算
1
编译原理课件:Chapter-5 语法制导翻译技术.ppt
2022-07-07 09:11:09 1.35MB 编译原理
学习PL/0中简单语句的翻译处理并将其生成相应形式的四元式序列,学习中间代码的生方法与原理。
1
一、实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、实验的结果验证 1.输入是语法分析后提供的正确的单词串,输出为三地址指令形式的四元式序列。 给出语句串: begin_a:=2+3*4; _x:=(a+b)/c_end# 输出如下三地址指令: (1) t1=3*4 (2) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 2.自己任意给出一语句串,输出四元式序列。 要求:将上述2个语句串的执行结果显示保留在实验报告中(拷屏)。 四、算法思想 1、设置语义过程。 (1)emit(char *result,char *ag1,char *op,char *ag2) 该函数的功能是生成一个三地址语句送到四元式表中。 四元式表的结构如下: struct{char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2) char *newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,… char *newtemp(void) {char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } 2、函数lrparser 在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。 五、语义分析程序的C程序。 #include #include #include #include struct {char result[12]; char ag1[12]; char op[12]; char ag2[12]; }quad; char prog[80],token[12]; char ch; int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针,m是token的指针 char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner(); char *factor(void); char *term(void); char *expression(void); int yucu(); void emit(char *result,char *ag1,char *op,char *ag2); char *newtemp(); int statement(); int k=0; void emit(char *result,char *ag1,char *op,char *ag2) { strcpy(quad.result,result); strcpy(参数设置); strcpy(quad.op,op); strcpy(quad.ag2,ag2); cout<
1
计算机编译原理课程实验中使用,语法制导与中间代码生成。
2021-07-10 21:35:36 875B 语法 制导 翻译 中间代码
1
语法制导翻译器,将算术表达式翻译成三元式。 确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的算术表达式,程序将其转换成三元式输出。
2021-07-05 14:51:53 104KB LL1文法 编译原理 三元式 四元式
1
一个能够进行语法分析并生成三地址代码的微型编译程序,可以运行
2021-05-31 12:14:02 21KB 三地址代码
1
实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。其中包含C++实现代码、测试用例等基本报告内容。
1
语法制导把表达式翻译成逆波兰式,用c语言实现,通过VC编译
2021-05-27 15:47:48 24KB 语法制导 逆波兰式 c语言
1