ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:16.93KB ,
资源ID:3601490      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3601490.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译技术第5次上机内容.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译技术第5次上机内容.docx

1、编译技术第5次上机内容编译技术第5次上机内容目的:充分理解语义分析的方法及相关语义计算的执行时机。要求: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.lexval2以词法分析和语法分

2、析部分的上机结果为基础,添加语义分析部分。即以LR文法为基础。当进行产生式归约时执行对应的语义动作。3输入:5+3+8*2输出:244 若输入有误,如:3+2则应提示:重新输入!5 由于输入串是具体的数值,因此应调用相应的词法分析的功能。/ Expression.cpp : Defines the entry point for the console application./#include stdafx.h#include conio.h#include#include#includeusing namespace std;#define L 0#define E 1#define T

3、2#define E_ 3#define T_ 4#define F 6#define digit 7 / 数字#define add 8 / 左括号#define mul 9 / 右括号#define lb 10#define rb 11int nStackPtr;int Stack100; / 栈void guiyue(stack &state,stack &value,char nex);void Push(int n) nStackPtr +; StacknStackPtr = n;void Pop() nStackPtr-;void PrintStack() int i; for (

4、i = nStackPtr; i = 0; i-) if (Stacki = E) printf(E ); if (Stacki = E_ ) printf(E ); if (Stacki = T ) printf(T ); if (Stacki = T_ ) printf(T ); if (Stacki = F) printf(F ); if (Stacki = digit) printf(digit ); if (Stacki = add) printf(+ ); if (Stacki = mul) printf(* ); if (Stacki = lb) printf( ); if (S

5、tacki = rb) printf() ); printf(n);/ 利用栈来分析表达式串,判定表达式串是否正确/ /int main(int argc, char* argv) char strInput100; / 存放表达式串 bool bResult; int nInputPtr; nStackPtr = -1; nInputPtr = 0; bResult = true; / 输入表达式串,存放在 strInput中 printf(请输入表达式串:); scanf(%s,strInput); Push(E); PrintStack(); while (bResult & nStac

6、kPtr = 0) switch(StacknStackPtr) case E: if (strInputnInputPtr = 0 & strInputnInputPtr = 0 & strInputnInputPtr = 0 & strInputnInputPtr= 0 & strInputnInputPtr=9) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case add: if (strInputnInputPtr = +) Pop(); nInputPtr+; else bResult = false;

7、 PrintStack(); break; case mul: if (strInputnInputPtr = *) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case lb: if (strInputnInputPtr = () Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case rb: if (strInputnInputPtr = ) Pop(); nInputPtr+; else bResult = false; Print

8、Stack(); break; default: bResult = false; break; if (bResult = false) printf(表达式有问题了n); else printf(表达式没问题!n);/以上是词法、语法分析代码/-/以下是语义分析代码 stack state; stack value; int i=0; int size=strlen(strInput); for(i=0;i=0&strInputi=9) state.push(digit); value.push(strInputi-0); if(i!=(size-1) guiyue(state,value

9、,strInputi+1); else guiyue(state,value,#); else if(strInputi=+) state.push(add); else if(strInputi=*) state.push(mul); else if(strInputi=() state.push(lb); else if(strInputi=) state.push(rb); if(i!=(size-1) guiyue(state,value,strInputi+1); else guiyue(state,value,#); / printf(Hello World!n); return

10、0;void guiyue(stack &state,stack &value,char nex) int next; if(nex=0&nex=9) next=digit; else if(nex=#) next=0; else switch(nex) case +: next=add; break; case *: next=mul; break; case (: next=lb; break; case ): next=rb; break; stack state1=state; stack value1=value; int top_s1,top_s2; int top_v1; int

11、 top=state.top(); bool flag=true; while(flag) switch(state.top() case digit: state.pop(); state.push(F); state1=state; break; case F: if(state.size()=3) state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=state1.top(); state1.pop(); if(top_s1=mul&top_s2=T) state1.push(T); state=state1; value1.po

12、p(); top_v1=value1.top(); value1.pop(); value1.push(top_v1*value.top(); value=value1; else state.pop(); state.push(T); state1=state; else state.pop(); state.push(T); state1=state; break; case T: if(next=mul) flag=false; else if(state.size()=3) state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=

13、state1.top(); state1.pop(); if(top_s1=add&top_s2=E) state1.push(E); state=state1; value1.pop(); top_v1=value1.top(); value1.pop(); value1.push(top_v1+value.top(); value=value1; else state.pop(); state.push(E); state1=state; else state.pop(); state.push(E); state1=state; break; case E: if(next=add|ne

14、xt=rb) flag=false; else if(state.size()=1&state.top()=E) state.pop(); state.push(L); printf(%dn,value.top(); exit(0); state1=state; break; case rb: state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=state1.top(); state1.pop(); if(top_s1=E&top_s2=lb) state1.push(F); state=state1; state1=state; break;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1