编译原理实验-(词法语法分析-附源代码

上传人:hs****ma 文档编号:474321521 上传时间:2023-02-06 格式:DOCX 页数:14 大小:17.87KB
返回 下载 相关 举报
编译原理实验-(词法语法分析-附源代码_第1页
第1页 / 共14页
编译原理实验-(词法语法分析-附源代码_第2页
第2页 / 共14页
编译原理实验-(词法语法分析-附源代码_第3页
第3页 / 共14页
编译原理实验-(词法语法分析-附源代码_第4页
第4页 / 共14页
编译原理实验-(词法语法分析-附源代码_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《编译原理实验-(词法语法分析-附源代码》由会员分享,可在线阅读,更多相关《编译原理实验-(词法语法分析-附源代码(14页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告*PL0语言功能简单、结构清晰、可读性强,而又具备了一般高级程序设计语言的必须部分,因而PL0语言的编译程序能充分体现一个高级语言编译程序实现的基本方法和技术。PL/0语言文法的EBNF表示如下::=. := :=CONST,; := := :=VAR , ; :=| :=; ; :=PROCEDURE ; :=| | :=:= :=BEGIN ; END := |ODD := +|- := := | () := +|- := *|/ := =|#|= := IF THEN := CALL 标识符 := WHILE DO := READ(,) := WRITE(,) := a|

2、b|X|Y|Z := 0|1|8|9【预处理】对于一个pl0文法首先应该进行一定的预处理,提取左公因式,消除左递归(直接或间接),接着就可以根据所得的文法进行编写代码。【实验一】词法分析【实验目的】给出PL/0文法规范,要求编写PL/0语言的词法分析程序。【实验内容】已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。【实验要求】1. 确定编译中使用的表格、标识符与关键字的区分方法等。2. 把词法分析器设计成一个独立一遍的过程。3. 词法分析器的输出形式采用二元式序列,例如:(ident, a)(plus, + )(number, 15)(times, * )(ident, b )

3、【输入输出】输入:PL/0源程序。例: a+15*b输出:(ident, a)(plus, + )(number, 15)(times, * )(ident, b )【实验结果】实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,到达句柄时,则采取LL(1)文法进行规约。实验结果如下:实验结果用文本来进行输入输出,所以在工程目录下还会有一个文本输入,输出文件。分别为in.txt out.txt【实验体会】在编写这段代码的过程中,比较麻烦得还是之前的语法预处理阶段,将不满足ll(1)文法的语法转化为标准的ll(1)文法。程序在处理词法分析的过程就是不断通过getsym()这个函数来条用

4、getch(),不断形成一个一个的词汇,供下面语法分析时使用。记录词汇类型的sym是一个枚举类型。使用起来会方便许多,比较系统。其中还用到了文本输入输出的技巧,把读出的词汇保存起来。词法分析还是比较简单,在编写代码的时候没有太大的阻碍。通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C+语言)直接编写此法分析程序。另外,也让我重新熟悉了C+语言的相关内容,加深了对C+语言的用途的理解。【实验二】语法分析【实验目的】给出PL/0文法规范,要求编写PL/0语言的语法分析程序。【实验内容】已给PL/

5、0语言文法,构造表达式部分的语法分析器。【实验要求】1. 将实验一“词法分析”的输出结果,作为表达式语法分析器的输入,进行语法解析,对于语法正确的表达式,报告“语法正确”;对于语法错误的表达式,报告“语法错误”,指出错误原因。2. 把语法分析器设计成一个独立一遍的过程。3. 语法分析器的编写方法采用递归子程序法。【输入输出】输入:PL/0表达式,用实验一的输出形式作为输入。例如: 对于PL/0表达式,a+15*b用下列形式作为输入:(ident, a)(plus, + )(number, 15)(times, * )(ident, b )输出:对于语法正确的表达式,报告“语法正确”;对于语法错

6、误的表达式,报告“语法错误”,指出错误原因。【实验结果】实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,对输入的一个语句进行判断,判断语法的正误,采用对算法的判断,若全为数字则进行最后的计算【实验体会】通过语法分析可以判断当前输入语句是否正确,实验通过对数学式的处理来进行对语句的判断是否正确,若正确则只要输入“语句正确”即可,若语句错误则需要根据错误的原因输出错误的理由,以方便编译员修改自己的代码。实现方法是通过对文本文件的输入,当前数据与即将输入的字符串进行匹配,若不符合LL(1)文法则判定为错误,若符合则继续向下完成语法分析。【源代码】#include #include #i

7、nclude #include #include #include #include #include using namespace std;ifstream fin(in.txt);ofstream fout(out.txt);enum symbol /01 2 34 567nul,ident, number, plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,wri

8、tesym,readsym,dosym,callsym,constsym,varsym,procsym;#define symnum 32char symworksymnum10;/单符号#define norw 13 /key_word num#define al 10 /maxstr#define nmax 10/number longchar wordnorwal;/key wordchar ch;/bufferchar getch()enum symbol sym;char idal+1;/ identchar aal+1;/tempchar IDal+1; int cc=0,ll=0

9、,num;/当前在行的位置cc,行字符的长度ll,num数字的值int nn=0;char line81;int flg=0;/ 正数;/char line81;enum symbol ssym256;enum symbol wsymnorw;/int cc,ll;/chccint err;void init()int i;for(i=0;i=255;i+)ssymi=nul;/0ssym+=plus;ssym-=minus;ssym*=times;ssym/=slash;ssym(=lparen;ssym)=rparen;ssym=eql;ssym,=comma;ssym.=period;s

10、sym#=neq;/not equalssym;=semicolon;strcpy(&symworkplus0,plus);strcpy(&symworkminus0,minus);strcpy(&symworktimes0,times);strcpy(&symworkslash0,slash);strcpy(&symworklparen0,lparen);strcpy(&symworkrparen0,rparen);strcpy(&symworkeql0,eql);strcpy(&symworkcomma0,comma);strcpy(&symworkneq0,neq);strcpy(&sy

11、mworkperiod0,period);strcpy(&symworksemicolon0,semicolon);strcpy(&word00,begin);/关键字小写字母strcpy(&word10,call);strcpy(&word20,const);strcpy(&word30,do);strcpy(&word40,end);strcpy(&word50,if);strcpy(&word60,odd);strcpy(&word70,procedure);strcpy(&word80,read);strcpy(&word90,then);strcpy(&word100,var);strcpy(&word110,while);strcpy(&word120,write);wsym0=beginsym;wsym1=callsym;wsym2=constsym;wsym3=dosym;wsym4=endsym;wsym5=ifsym;wsym6=oddsym;wsym7=procsym;wsym8=readsym;wsym9=thensym;wsym10=varsym;wsym11=whilesym;wsym

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号