编译原理课程设计LR分析器总控程序的实现

上传人:仙*** 文档编号:74177863 上传时间:2022-04-13 格式:DOC 页数:14 大小:295.02KB
收藏 版权申诉 举报 下载
编译原理课程设计LR分析器总控程序的实现_第1页
第1页 / 共14页
编译原理课程设计LR分析器总控程序的实现_第2页
第2页 / 共14页
编译原理课程设计LR分析器总控程序的实现_第3页
第3页 / 共14页
资源描述:

《编译原理课程设计LR分析器总控程序的实现》由会员分享,可在线阅读,更多相关《编译原理课程设计LR分析器总控程序的实现(14页珍藏版)》请在装配图网上搜索。

1、合肥工业大学计算机与信息学院课程设计课 程:编译原理专业班级:计算机科学与技术09-2班学 号:姓 名: 一:设计题目 题目: LR分析器总控程序的实现设计内容及要求:对P.101中的文法,按图5.5LR分析表构造LR分析器。要求程序按P.102例5.7那样,对于输入串i*i+i,输出LR分析器的工作过程。改进:可以自行输入输入串,能按重新按钮重新开始,外加了一个计时器。二:设计目的 进一步了解了LR分析器的整个工作过程,将LR分析器以图形界面的形式展现了出来,有利加深了对LR分析过程的掌握。三:实验原理本程序是用windows编的,大体的思想是这样的:通过建立一个符号栈,状态栈,输入栈(结构

2、体类型定义的)分别用来存放符号,状态,输入串,将LR分析表构造成为一个二维数组table139,其中0-11表示状态结点,2126表示规约标号,-1表示error(出错),12表示acc(接受),在acation函数里面通过i等于多少来判断到底是规约还是移进。在Main_OnCommand()函数中通过switch.case.来判断每次及下一步所要执行的操作。运行的时候,首先要输入一个以#结尾的输入串,然后单击开始下一步.,如果规约成功,则弹出一个规约成功的对话框,否则弹出一个规约失败的对话框。当然在运行的过程中如果出现什么差错,都可以单击重新开始按钮重新输入输入串重新开始。四:实验代码#in

3、clude stdAfx.h#include #include #include resource.h#include MainDlg.hchar *str26=E-E+T,E-T,T-T*F,T-F,F-(E),F-i;int flag=0;#define MAX 20typedef structint stack1MAX;int top1;status;typedef structchar stack2MAX;int top2;symbol_instr;char index_char9=i,+,*,(,),#,E,T,F;/为二维数数组的纵坐标/LR分析表/0-11表示状态结点,2126表

4、示规约标号,/-1表示error(出错),12表示acc(接受)int table139 = 5,-1,-1, 4,-1,-1, 1, 2, 3,-1, 6,-1,-1,-1,12,-1,-1,-1,-1,22, 7,-1,22,22,-1,-1,-1,-1,24,24,-1,24,24,-1,-1,-1, 5,-1,-1, 4,-1,-1, 8, 2, 3,-1,26,26,-1,26,26,-1,-1,-1, 5,-1,-1, 4,-1,-1,-1, 9, 3, 5,-1,-1, 4,-1,-1,-1,-1,10,-1, 6,-1,-1,11,-1,-1,-1,-1,-1,21, 7,-1

5、,21,21,-1,-1,-1,-1,23,23,-1,23,23,-1,-1,-1,-1,25,25,-1,25,25,-1,-1,-1;/规约规则struct rulechar x;int y;r6=E,3,E,1,T,3,T,1,F,3,F,1; /后面的代表A中的长度BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(uMsg) HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COM

6、MAND, Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); return FALSE;void init_stack1(HWND hwnd,status *p)if( !p)MessageBox(hwnd,TEXT(出错),TEXT(警告),MB_OK|MB_ICONHAND);p-top1 = -1;void push1(HWND hwnd,status *&p,int x)if(p-top1 top1+;p-stack1p-top1 = x;else MessageBox(hwnd,TEXT(出错),TEXT(警告),MB_

7、OK|MB_ICONHAND);int pop1(HWND hwnd,status *p)int x;if(p-top1 != 0)x = p-stack1p-top1;p-top1-;return x;else MessageBox(hwnd,TEXT(状态栈为空),TEXT(警告),MB_OK|MB_ICONHAND);/printf(n状态栈1空!n);return 0;void out_stack(HWND hwnd,status *p)if(p-top1 0)MessageBox(NULL,TEXT(状态栈为空),TEXT(警告),MB_OK|MB_ICONHAND);/printf

8、(n状态栈3空!n);int i;TCHAR str256;for(i=0;itop1;i+)wsprintf(&stri,%d,p-stack1i);SetDlgItemText(hwnd,IDC_EDIT1,str);int get_top1(HWND hwnd,status *p)int x;if(p-top1 != -1)x = p-stack1p-top1;return x;else MessageBox(hwnd,TEXT(状态栈为空),TEXT(警告),MB_OK|MB_ICONHAND);/printf(n状态栈2空!n);return 0;void init_stack2(H

9、WND hwnd,symbol_instr *p)if( !p)MessageBox(hwnd,TEXT(出错),TEXT(警告),MB_OK|MB_ICONHAND);p-top2= -1;void push2(HWND hwnd,symbol_instr *p,char x)if(p-top2 top2+;p-stack2p-top2 = x;p-stack2p-top2+1=0;else MessageBox(hwnd,TEXT(出错),TEXT(警告),MB_OK|MB_ICONHAND);char pop2(HWND hwnd,symbol_instr *p)char x;if(p-

10、top2 != -1)x = p-stack2p-top2;p-top2-;p-stack2p-top2+1=0;return x;else MessageBox(hwnd,TEXT(符号栈为空),TEXT(警告),MB_OK|MB_ICONHAND);/printf(n符号栈1空!n);return 0;void out_stack1(HWND hwnd,symbol_instr *p)if(p-top2 stack2);void out_stack2(HWND hwnd,symbol_instr *p)if(p-top2 stack2);char get_top2(HWND hwnd,sy

11、mbol_instr *p)char x;if(p-top2 != -1)x = p-stack2p-top2;return x;else MessageBox(hwnd,TEXT(符号栈为空),TEXT(警告),MB_OK|MB_ICONHAND);/printf(n符号栈2空!n);return 0;void print(HWND hwnd,status *status_p,symbol_instr *symbol_p,symbol_instr *instr_p)out_stack(hwnd,status_p); /输出状态栈的内容out_stack1(hwnd,symbol_p); /输

12、出符号栈的内容out_stack2(hwnd,instr_p); /输出输入串int get_index_char(char i)for(int j=0;j=0 & i=21 & i=26)x = ri-21.y;for(j=0;jx;j+)pop1(hwnd,status_p);pop2(hwnd,symbol_p);push2(hwnd,instr_p,ri-21.x);SetDlgItemText(hwnd,IDC_EDIT4,str2i-21);void CALLBACK TimerProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTi

13、me)SYSTEMTIME stLocal;TCHAR buf256;GetLocalTime(&stLocal);wsprintf(buf,%d年%d月%d日 %d:%d:%d,stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond);SetDlgItemText(hwnd,IDC_EDIT5,buf);BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)SetTimer(hwnd,0,1000,T

14、imerProc);return TRUE;status *status_p=new status;symbol_instr *symbol_p=new symbol_instr;symbol_instr *instr_p=new symbol_instr ; void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)switch(id) case IDC_BUTTON1:init_stack1(hwnd,status_p); /初始化各栈init_stack2(hwnd,symbol_p);init_stack2

15、(hwnd,instr_p);/压进栈初始元素push1(hwnd,status_p,0);push2(hwnd,symbol_p,#);char x;TCHAR msg256;GetDlgItemText(hwnd,IDC_EDIT3,msg,sizeof(msg);unsigned int i;for(i=0;i top2 != 0)x = pop2(hwnd,symbol_p);push2(hwnd,instr_p,x);print(hwnd,status_p,symbol_p,instr_p);/打印初始分析表*/break;case IDC_BUTTON2: action(hwnd,

16、status_p,symbol_p,instr_p);break;case IDC_BUTTON3:SetDlgItemText(hwnd,IDC_EDIT1,TEXT();SetDlgItemText(hwnd,IDC_EDIT2,TEXT();SetDlgItemText(hwnd,IDC_EDIT3,TEXT();SetDlgItemText(hwnd,IDC_EDIT4,TEXT();break;default:break; void Main_OnClose(HWND hwnd) EndDialog(hwnd, 0);四:实验结果(1)当输入i*i+i#时最终弹出规约成功的对话框:(2)当输入ii*i#时,最终会弹出规约出错的对话框如下:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!