资源描述:
《编译原理实验(词法语法分析附源代码》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、编译原理实验报告********************************************************************************!••丄■•丄■•土•丄■•丄■•土•丄■•丄“•丄■•丄“•丄■•丄■■卜•丄■•丄■•卜•丄■•丄■•卜•丄■•卜•丄■%£*•丄■*1*•£**1*•!**1*•£*•£*•£*・丄・・丄・・丄・・丄・・丄・・丄・•丄■^7^^7^#T%^7^#T>^7^#T%^7^#T><Tw^7w<Tw<Tw<Tw叫.<T><T>#T%#T%#T%#T%#T^^T%#T
2、%吓・#T%吓・#T%吓・#T%吓・#T%吓・#T%吓・^7^吓・^7^*■^7^彳.#7^彳・PLO语言功能简单、结构清晰、可读性强,而又具备了一般高级程序设计语言的必须部分,因而PLO语言的编译程序能充分体现一个高级语言编译程序实现的基本方法和技术。PL/O语言文法的EBNF表示如下:v程序〉::二<分程序〉.<分程序>::=[<常量说明>][<变量说明〉][<过程说明>]<语句〉v常量说明>::=CONSTv常量定义>{,v常量定义>};v常量定义〉::=<标识符>=v无符号整数〉v无符号整数〉::二v数字〉{v数字>}<变量说明
3、>::=VARV标识符>{,V标识符>};v标识符〉::二<字母〉{<字母>
4、v数字>}v过程说明>::=<过程首部><分程序>{;<过程说明〉};v过程首部〉::二PROCEDUREv标识符〉;v语句〉::=<赋值语句>
5、v条件语句>
6、v当循环语句>
7、v过程调用语句>
8、<复合语句>
9、v读语句X写语句>
10、<空><赋值语句〉::=<标识符>:二<表达式>V复合语句〉::二BEGINv语句〉{;V语句〉JENDv条件语句〉::二v表达式>v关系运算符><表达式〉
11、ODDv表达式〉<表达式>::二[+卜]<项>{<加法运算符><项>}V项〉:
12、:=V因子〉{<乘法运算符>V因子>}V因子>::=<标识符>
13、V无符号整数>
14、'CV表达式〉')'V加法运算符〉::=+卜V乘法运算符〉::二叩V关系运算符〉::==
15、#
16、<
17、<=
18、>
19、>=V条件语句〉::二IFV条件〉THENV语句〉<过程调用语句〉::=CALL标识符v当循环语句〉::二WHILEv条件〉DOv语句〉v读语句>:-READ'('v标识符>{,v标识符>}yv写语句>::=WRITE'('v表达式>{,<表达式>}')'v字母>::=a
20、b
21、-
22、X
23、Y
24、Zv数字>::=0
25、1
26、-
27、8
28、9【预处理】对于一个plO文法首
29、先应该进行一定的预处理,提取左公因式,消除左递归(直接或间接),接着就可以根据所得的文法进行编写代码。【实验一】词法分析【实验目的】给出PL/0文法规范,要求编写PL/0语言的词法分析程序。【实验内容】已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。【实验要求】1•确定编译中使用的表格、标识符与关键字的区分方法等。2.把词法分析器设计成一个独立一遍的过程。3.词法分析器的输出形式采用二元式序列,例如:(ident,a)(plus,+)(number,15)(times,*)(ident,b)【输入输出】输入:PL/O源程
30、序。例:a+15*b输出:(ident,a)(plus,+)(number,15)(times,*)(ident,b)[实验结果]实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,到达句柄时,则采取LL(1)文法进行规约。实验结果如下:31、输出文件。分别为in.txtout.txt【实验体会】在编写这段代码的过程中,比较麻烦得还是之前的语法预处理阶段,将不满足11(1)文法的语法转化为标准的11(1)文法。程序在处理词法分析的过程就是不断通过getsym()这个函数来条用getch(),不断形成一个一个的词汇,供下面语法分析时使用。记录词汇类型的sym是一个枚举类型。使用起来会方便许多,比较系统。其中还用到了文本输入输岀的技巧,把读出的词汇保存起来。词法分析还是比较简单,在编写代码的时候没有太大的阻碍。通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分
32、析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。【实验二】语法分