编译原理实验指导书新大纲改文档格式.docx
- 文档编号:21039912
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:22
- 大小:121.99KB
编译原理实验指导书新大纲改文档格式.docx
《编译原理实验指导书新大纲改文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验指导书新大纲改文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
程序样例:
#include<
fstream.h>
iostream.h>
voidpro_process(char*);
voidmain()//测试驱动程序
{
//定义扫描缓冲区
charbuf[4048]={'
\0'
};
//缓冲区清0
//调用预处理程序
pro_process(buf);
//在屏幕上显示扫描缓冲区的内容
cout<
<
buf<
endl;
}
voidpro_process(char*buf)//预处理程序
ifstreamcinf("
source.txt"
ios:
:
in);
inti=0;
//计数器
charold_c='
cur_c;
//前一个字符,当前字符。
boolin_comment=false;
//false表示当前字符未处于注释中。
while(cinf.read(&
cur_c,sizeof(char))){//从文件读一个字符
switch(in_comment){
casefalse:
if(old_c=='
/'
&
&
cur_c=='
*'
){//进入注释
i--;
//去除已存入扫描缓冲区的字符'
in_comment=true;
}
else{
if(old_c=='
\\'
\n'
)//发现续行
i--;
//去除已存入扫描缓冲区的字符'
\'
else{
if(cur_c>
='
A'
cur_c<
Z'
)//大写变小写
cur_c+=32;
if(cur_c=='
\t'
||cur_c=='
)//空格取代TAB换行
cur_c='
'
;
buf[i++]=cur_c;
}
break;
casetrue:
)//离开注释
in_comment=false;
}//endofswitch
old_c=cur_c;
//保留前一个字符
}//endofwhile
buf[i++]='
#'
//在源程序尾部添加字符'
实验二词法分析器的手工构造
通过本次实验,使学生掌握词法分析的构造原理及实现技术,会编写简单程序设计语言的词法分析器。
1、通过词法分析基本原理和基本技术的学习,参照给定的词法分析程序样例,验证一个简单语言的词法分析程序,加深对词法分析基本原理和基本技术的理解。
2、从文件读入源程序,经预处理后进行词法分析,输出为单词串,即由(词法信息,语义信息)所组成的二元组序列;
有一定检查词法错误的能力。
2、提交实验报告,报告内容包括:
实验目的、程序设计、运行结果、心得体会。
3、上机时间:
2学时。
三、实验原理
1、
词法分析器的功能和输出格式
词法分析器的功能是输入源程序,输出单词的Token序列。
词法分析器的单词符号可表示成的二元式(单词种别码,单词符号的属性值)。
本实验中,基本字、符号词采用一词一类的方式,标识符、常数采用的是一类一个类码的方式。
2、
单词的BNF表示
标识符
->
<
字母
字母数字串
字母数字串|<
数字
下划线
字母数字串|ε
无符号整数
数字串
|ε
运算符
+|*|++|=
界符
|;
|(|)|#
3、状态转换图
识别标识符的状态转换图
识别实常数和整常数的状态转换图
四、实验内容
请参照给定的C词法分析程序的样例,编写下列给定的源程序的VC++词法分析程序,屏幕显示结果。
begin
integerr;
r=r+10;
end
五、词法分析器的手工构造样例程序
string.h>
stdlib.h>
conio.h>
constshortWORDLEN=20;
structcode_val{
charcode;
charval[WORDLEN];
//扫描函数原型
code_valscanner(char*);
//拼接函数原型
voidconcat(char[],char);
//查保留字表函数
charreserve(char[]);
//预处理函数原型
//主函数
voidmain()
//扫描缓冲区
//预处理
//显示buf
//单词识别
//ofstreamcoutf("
Lex_r.txt"
out);
code_valt;
//临时变量
do{
t=scanner(buf);
//调用一次扫描器获得一个单词二元式
cout<
t.code<
'
t.val<
//屏幕显示单词二元式
//coutf<
//单词二元式输出至文件
}while(t.code!
);
"
Endoflexicalanalysis!
getch();
//扫描函数,每调用一次,返回一个单词的二元式。
structcode_valscanner(char*buf)
staticinti=0;
//buf指针
structcode_valt={'
"
NUL"
chartoken[WORDLEN]="
\0"
//用于拼接单词
//去除前导空格
while(buf[i]=='
)i++;
//开始识别单词
//标识符或基本字
if(buf[i]>
a'
buf[i]<
z'
){
while(buf[i]>
||buf[i]>
0'
9'
)
concat(token,buf[i++]);
t.code=reserve(token);
//查保留字表
if(t.code=='
i'
)strcpy(t.val,token);
//是标识符
returnt;
//返回标识符或基本字的二元式
}
//整常数或实常数
if(buf[i]=='
.'
){//实常数123.
while(buf[i]>
)//123.4
concat(token,buf[i++]);
t.code='
y'
}
else//整常数
x'
strcpy(t.val,token);
//返回当前单词整常数(123)或实常数(123.或123.4)的二元式
//实常数
if(buf[i]=='
concat(token,buf[i++]);
if(buf[i]>
strcpy(t.val,token);
returnt;
//返回当前单词实常数(.123)的二元式
else{//单个.错误词形
cout<
Errorword>
token<
exit(0);
//其余单词
switch(buf[i]){
case'
'
('
)'
+'
if(buf[++i]=='
)
t.code='
$'
else{
default:
//错误字符
Errorchar>
buf[i]<
}//endofswitch
i++;
//指向下个单词
returnt;
//返回当前单词的二元式
//拼接函数,原token="
BEG"
buf[i++]='
I'
调用后token="
BEGI"
。
voidconcat(chartoken[],charc)
for(inti=0;
token[i];
i++);
token[i]=c;
token[++i]='
charreserve(chartoken[])
constchar*table[]={"
begin"
end"
integer"
real"
constcharcode[]={"
{}ac"
i<
(int)strlen(code);
i++)
if(strcmp(token,table[i])==0)returncode[i];
return'
//标识符的单词种别为'
//预处理函数
voidpro_process(char*buf)
charold_c='
//计数器,前一个字符,当前字符。
//状态标志,false表示当前字符未处于注释中。
cur_c,sizeof(char))){//从文件读一个字符
){//进入注释
//去除已存入扫描缓冲区的字符'
)//去除续行符'
,包括后续换行符。
)cur_c+=32;
//大写变小写
if(cur_c=='
||cur_c=='
)cur_c='
//空格
)//离开注释
//保留前一个字符
buf[i]='
实验三递归下降分析设计
通过本次实验,使学生掌握递归下降分析的原理及实现技术,会编写简单程序的递归下降语法分析程序。
1、根据递归下降分析算法和给定的C语法分析程序的样例,编写指定的源程序的VC++语法分析程序,屏幕显示结果。
2、有运行实例。
即对于给定的文法和一个源程序,所编语法分析程序能正确判断此程序语法是否正确,有语法错误的要给出错误提示。
3、提交实验报告,报告内容如下:
目的、要求、算法描述、程序结构、主要变量名说明、程序清单、调试情况、设计技巧、心得体会。
4、上机时间:
三、实验原理和说明
1、递归下降分析法的功能
语法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
2、递归下降分析法的前提
给定文法必须是LL
(1)文法,若不是需改造文法:
消除二义性、消除左递归、提取左因子,确保文法为LL
(1)文法。
3、递归下降分析法设计思想及算法
为G[S]的每个非终结符号U构造一个递归函数。
假设产生式形如:
A1|2|…|n,则按下面的方法编写子函数A():
procedureA()
beginiftokenPredict(A1)then
(1)else
iftokenPredict(A2)then
(2)else
……
iftokenPredict(An)then(n)else
err()
end
其中对i=X1X2…Xn,(i)=’(X1);
’(X2);
…;
’(Xn);
如果XVN,’(X)=X()
如果XVT,’(X)=Match(X)
如果X=,()=skip(空语句)
四、实验内容
根据递归下降分析算法和给定的C语法分析程序的样例,编写教材P86页3给定的文法G的递归下降语法分析程序,分析“(a,(a,a))#”是否为该文法的句子,屏幕显示结果。
注意:
可把“(a,(a,a))#”的词法分析的类号放在字符数组中,这样程序中的所有有关文件的操作均可省掉。
如:
charc[]=”(i,(i,i))#”。
五、递归下降分析算法
对给定文法G:
E→TE'
E'
→+TE'
|ε
T→FT'
T'
→*FT'
F→(E)|i|x|y
对应的递归下降分析程序如下:
#include"
iostream.h"
stdlib.h"
voidE(void);
voidE1(void);
voidT(void);
voidT1(void);
voidF(void);
charc[]="
(i,(i,i))#"
t;
voidmain(void)
{t=c[i++];
E();
if(t=='
endl<
ok"
else
errinmain()"
voidE(void){//E¡
ú
TE'
if(t.code=='
||t.code=='
){//if(t.code¡
Ê
first(T)
T();
E1();
else{
coutf<
ErrinE()>
exit(0);
voidE1(void)//E'
¡
+TE'
|¦
Å
cinf>
>
t.code>
t.val;
coutf<
t.code;
//¶
Á
Ò
»
¸
ö
µ
¥
´
Ä
¶
þ
Ô
ª
½
²
¢
ä
³
Ö
±
ð
elseif(!
(t.code=='
))//if(!
t.code¡
follow(E'
))
ErrinE1()>
voidT(void)//T¡
FT'
){//if(t.code¡
first(F))
F();
T1();
ErrinT()>
voidT1(void)//T'
*FT'
)){//if(!
follow(T'
ErrinT1()>
voidF(void)//F¡
(E)|i|x|y
){
elseif(t.code=='
E();
cinf>
else{
coutf<
ErrinF1>
ErrinF2>
实验四LR语法分析器程序设计
通过本次实验,使学生掌握LR语法分析的原理及实现技术,会编写简单程序的LR语法分析程序。
1、根据LR语法分析算法,编写一个LR语法分析程序。
4学时。
三、实验的数据结构和算法描述
1、数据结构
①LR分析表
②状态栈
在归约时,控制程序应按原路径折回,故在分析过程中需将所经历的状态记录下来,以便获得折回点。
设置状态栈,用于记录分析过程中所经历的状态,即路径。
③符号栈
用于记录路径的符号,它和状态栈等高。
符号栈的设置是为了便于说明,实际语法分析器无符号栈。
④产生式右部符号串长度
因每个状态仅识别一个符号,退回的状态数和构成句柄的字符数相等,故需存储产生式右部符号串
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 指导书 大纲