2022年编译原理词法分析器语法分析器实验分析方案.docx
《2022年编译原理词法分析器语法分析器实验分析方案.docx》由会员分享,可在线阅读,更多相关《2022年编译原理词法分析器语法分析器实验分析方案.docx(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选学习资料 - - - - - - - - - 编译技术 班级网络 0802学 号 3080610052姓 名 叶晨舟指导老师 朱 玉 全2022 年 7 月 4 日一、目的编译技术是理论与实践并重的课程,而其试验课要综合运用一、二年级所学的多门课1 / 21 名师归纳总结 - - - - - - -第 1 页,共 21 页精选学习资料 - - - - - - - - - 程的内容,用来完成一个小型编译程序;从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的熟识和懂得;培育同学对完整系统的独立分析和设计的才能,进一步培育同学的独立编程才能;二、任务及要求基本要求:1词法
2、分析器 产生下述小语言的单词序列这个 小语言 的全部的单词符号,以及它们的种别编码和内部值如下表:单词符号 种别编码 助记符 内码值DIM 1 $DIM - IF 2 $IF - DO 3 $DO - STO 4 $STOP - P 5 $END - END 6 $ID - 标识符 7 $INT 内部字符串常数 整)8 $ASSIG 标准二进形式= 9 N - + 10 $PLUS - * 11 $STAR - * 12 $POWE- ,13 R - 14 $COM- )MA $LPAR $RPAR 对于这个 小语言 ,有几点重要的限制:第一 ,全部的关键字 如 IF WHILE等)都是“ 保
3、留字” ;所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符;例如,下面的写法是肯定禁止的: IF5)=x 其次 ,由于把关键字作为保留字,故可以把关键字作为一类特别标示符来处理;也就是说,对于关键字不专设对应的转换图;但把它们 及其种别编码)预先支配在一张表格中 此表叫作保留字表);当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字;再次 ,假如关键字、标识符和常数之间没有确定的运算符或界符作间隔,就必需至少用一个空白符作间隔 如,一个条件语句应写为0 i= 1;而肯定不要写成IFi0 i=1;由于对于后者,我们的分析器将无条件地将IFI 看成一个标识符;这个小语言的
4、单词符号的状态转换图,如下图:2 / 21 名师归纳总结 - - - - - - -第 2 页,共 21 页精选学习资料 - - - - - - - - - 2语法分析器 能识别由加 + 减- 乘* 除/ 乘方 括号 |i 使用的算法可以是:猜测分析法;递归下降分析法;算符优先分析法;LR 分析法等;3中间代码生成器产生上述算术表达式的中间代码四元式序列)三、实现过程给出各题目的具体算法描述,数据结构和函数说明,流程图;3 / 21 名师归纳总结 - - - - - - -第 3 页,共 21 页精选学习资料 - - - - - - - - - 1、词法分析器的流程图 开头输入源文件路径否路径
5、是否有效是打开源文件初始化文件指针识别指针内容文件终止?是终止否回退是空格,空白或换否是字母吗否是数字吗否是界符吗否将字符加入字符数行吗组Word是是是将字符加是是将字符将字符加入字符数将字符跳过该字符入字符数组Word加入字组Word加入字符数组指向下一字符符数组Word指向下一字符指向下一字符Word是字母惑数字识别指针内容输出 word输出Word内容为不吗为界符是数字吗可识别否将word与关键字表 key进行匹输出 word为否配否指向下一字符匹配?输出word一般标示符为常数是输出 word为关键字2、语法分析器主程序图4 / 21 名师归纳总结 - - - - - - -第 4 页
6、,共 21 页精选学习资料 - - - - - - - - - 3、中间代码生成器流程图:四、源程序词法分析器 : #include #include 5 / 21 名师归纳总结 - - - - - - -第 5 页,共 21 页精选学习资料 - - - - - - - - - #include using namespace std;typedef struct table / 分析表储备结构 char m100 ;table ;table M100100 ; /定义分析表typedef struct stacknode / 定义栈内元素节点 char data; struct stackn
7、ode *next ;stackk ;void initlinkstackk *&s / 初始化新栈 s=stackk *mallocsizeofstackk; s-next=NULL ; void poplinkstackk *&s / 顶元素出栈 stackk *p ;char v; ifs-next.=NULL p=s-next ; v=p-data ; s-next=p-next ; freep; 带头结点 void pushlinkstackk *&s,char x / 新 元 素 入 栈 stackk *p ; p=stackk *mallocsizeofstackk; p-dat
8、a=x; p-next=s-next ; s-next=p; void displaystackk *s / 打印 现实显示 栈内元素 6 / 21 名师归纳总结 - - - - - - -第 6 页,共 21 页精选学习资料 - - - - - - - - - stackk *p ; int i=0,j ; char st100 ; p=s-next; whilep.=NULL sti+=p-data ; p=p-next ; forj=i-1 ;j=0 ; j- printf%c,stj; forj=0 ; j / 打印 对齐格式 printf%c, ; char gettopstackk
9、 *s / 返 回 栈 顶 元 素 值 ifs-next=NULL return 0; else return s-next-data ; int findchar c,char array / 查找函数, int i ;int flag=0 ;fori=0 ;i ifc=arrayi flag=1 ; return flag ; int locationchar c,char array / 定位函数 ,指出字符所在位置 int i ;fori=0 ;i ifc=arrayi 7 / 21 名师归纳总结 - - - - - - -第 7 页,共 21 页精选学习资料 - - - - - -
10、- - - return i; void error / 出错函数定义 printf%15c 出错 .n, ; void analysechar Vn,char Vt int i,j,m,p,q,length,t,h ; char w,X; char str100 ;opt0: scanf%s,str ; fori=0 ; i ;i+ if.findstri,Vt printf 输入字符串有误 .请重新输入 . ; goto opt0 ; break; stackk *st ; initlinkst ; pushlinkst,# ; pushlinkst,Vn0 ; /#与识别符号入栈 j=0
11、 ; h=1; w=str0 ; printf 步骤 %-12c分析栈 %-24c剩余输入串 %-12c所用产生式 n, , , ;opt1: printf%-16d,h ; /显示步骤 h+; displayst ; / 显示分析栈中内容 X=gettopst ; / 上托栈顶符号放入 X poplinkst ; forint k=0 ;k / 打印对齐格式 printf%c, ;8 / 21 名师归纳总结 - - - - - - -第 8 页,共 21 页精选学习资料 - - - - - - - - - fort=j ;t ;t+ printf%c,strt; /显示剩余字符串 iffin
12、dX,Vt& X.=# / ifX=w 分析栈的栈顶元素和剩余输入串的第一个元素相比较 printf%15c 匹配 n,X ; j+ ; w=strj ; goto opt1; else error ; else ifX=# ifX=w printf%8c 是该文法的句子!n, ; else error ; else p=locationX,Vn ; q=locationw,Vt ; char *S1=null,*S2=NULL; ifstrcmpMpq.m,S1=0|strcmpMpq.m,S2=0 / 查找产生式 error ; else char str0100 ; strcpystr0
13、,Mpq.m; printf%15c-%sn,X,str0 ifstrcmpstr0,$=0 goto opt1; else ; /显示对应的产生式9 / 21 名师归纳总结 - - - - - - -第 9 页,共 21 页精选学习资料 - - - - - - - - - length=strlenstr0 ; /逆序进栈 form=length-1 ;m=0 ;m- pushlinkst,str0m ; goto opt1; int main int i,k,n,r ; char Vn100,Vt100,select ;printf*n; printf 对任意输入 LL1 文法的分析表,判
14、定验证字符串是否为该文法的句子 n ; printf 并能给出分析和演示过程; n ;printf*n;opt2: printf 请输入各终结符 ; fori=0 ;i scanf%c,&Vti; ifVti=# r=i; break; printf 请输入非终结符个数 :n ; scanf%d,&n ; getchar; for i=0 ;i printf 请输入非终结符 Vn%d:n,i ; scanf%c,&Vni; getchar;10 / 21 名师归纳总结 - - - - - - -第 10 页,共 21 页精选学习资料 - - - - - - - - - printf 请输入此非
15、终结符对应各终结符的产生式右部 串:n ; fork=0 ;k scanf%s,Mik.m; getchar; opt3: null 或NULL 表示出错; $表示空 printf 请输入要分析的字符串,且以 #终止 :n ; analyseVn, Vt ; printf*请挑选 *n; printf 1: 输入字符串 n ; printf 2: 输入新分析表 n ; printf 0: 退 出 n ; printf*n;opt4: cinselect; switchselect case 1: goto opt3 ;break; case 2: goto opt2 ; case 0: bre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 编译 原理 词法 分析器 语法 实验 分析 方案
限制150内