编译原理词法分析和语法分析报告+代码C语言版Word格式文档下载.docx
- 文档编号:22225925
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:59
- 大小:23.10KB
编译原理词法分析和语法分析报告+代码C语言版Word格式文档下载.docx
《编译原理词法分析和语法分析报告+代码C语言版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析和语法分析报告+代码C语言版Word格式文档下载.docx(59页珍藏版)》请在冰豆网上搜索。
5
=
22
end
6
23
lettet
10
24
(letter|digit)*
dightdight*
11
25
+
13
;
26
—
14
(
27
*
15
)
28
/
16
#
2.3词法分析程序的功能:
输入:
所给文法的源程序字符串。
输出:
二元组(syn,token
或sum)构成的序列。
其中:
syn为单词种别码;
token为存放的单词自身字符串
sum为整型常数。
例如:
对源程序beginx:
=9:
ifx>
9thenx:
=2*x+1/3;
end#
的源文件,经过词法分析后输
出如下序列:
(1,begin)(10,x)(18,:
=)(11,9)(26,;
)(2,if)
⋯⋯
三、词法分析程序的算法思想:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思
想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
3.1主程序示意图:
主程序示意图如图3-1所示。
其中初始包括以下两个方面:
⑴关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描
程序识别出标识符时,查关键字表。
如能查到匹配的单词,则该单词为关键字,否则为一
般标识符。
关键字表为一个字符串数组,其描述如下:
Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”,};
置初值
调用扫描子程序
输出单词二元组
否输入串结束
是
结束
图3-1
(2)程序中需要用到的主要变量为syn,token和sum
3.2扫描子程序的算法思想:
首先设置3个变量:
①token用来存放构成单词符号的字符串;
②sum用来整型单词;
③
syn用来存放单词符号的种别码。
扫描子程序主要部分流程如图3-2所示。
变量初始化
忽略空格
是否文件结束?
是是返回
字母
拼字符串
是否关键字?
syn为对应关键字的
单词种别码
否
数字其他
运算符、符号
界符等符号
拼数
对不同符号给
报错
出相应的syn值
syn=10
syn=11
返回
图3-2
四、词法分析程序的C语言程序源代码:
#include<
stdio.h>
string.h>
charprog[80],token[8],ch;
intsyn,p,m,n,sum;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
scaner();
main()
{p=0;
printf("
\npleaseinputastring(endwith'
#'
):
/n"
);
do{
scanf("
%c"
&
ch);
prog[p++]=ch;
}while(ch!
='
p=0;
switch(syn)
{case11:
(%-10d%5d)\n"
sum,syn);
break;
case-1:
youhaveinputawrongstring\n"
getch();
exit(0);
default:
printf("
(%-10s%5d)\n"
token,syn);
}
}while(syn!
=0);
scaner()
{sum=0;
for(m=0;
m<
8;
m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch=='
'
)||(ch=='
\n'
))ch=prog[p++];
if(((ch<
z'
)&
&
(ch>
a'
))||((ch<
Z'
A'
)))
{while(((ch<
))||((ch>
0'
(ch<
9'
))){token[m++]=ch;
ch=prog[p++];
p--;
syn=10;
for(n=0;
n<
6;
n++)
if(strcmp(token,rwtab[n])==0)
{syn=n+1;
elseif((ch>
))
{while((ch>
)){sum=sum*10+ch-'
;
syn=11;
elseswitch(ch)
{case'
'
:
token[m++]=ch;
if(ch=='
{syn=22;
token[m++]=ch;
else
{syn=20;
p--;
case'
{syn=24;
{syn=23;
+'
{syn=17;
{syn=13;
-'
{syn=29;
{syn=14;
!
{syn=21;
{syn=31;
{syn=25;
{syn=18;
*'
syn=15;
/'
syn=16;
('
syn=27;
)'
syn=28;
{'
syn=5;
}'
syn=6;
syn=26;
\"
syn=30;
syn=0;
syn=17;
syn=-1;
token[m++]='
\0'
五、结果分析:
输入beginx:
end#后经词法分析输出如下序列:
(begin
1)(x10)(:
17)(=18)(911)(;
26)(if2)⋯⋯如图5-1所示:
图5-1
六、总结:
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基
本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
通过本试验的
完成,更加加深了对词法分析原理的理解。
语法分析
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构
分析。
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1待分析的简单语言的语法
用扩充的BNF表示如下:
⑴<
程序>
:
=begin<
语句串>
⑵<
=<
语句>
{;
⑶<
赋值语句>
⑷<
=ID:
=<
表达式>
⑸<
项>
{+<
项>
|-<
⑹<
项>
因子>
{*<
|/<
因子>
⑺<
因子>
=ID|NUM|(<
表达式>
2.2实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否
则输出“error”。
输入begina:
=9;
x:
=2*3;
b:
=a+xend#
输出success!
输入x:
=a+b*cend#
输出error
2.3语法分析程序的酸法思想
(1)主程序示意图如图2-1所示。
调用scaner读下一个单词符号
调用lrparser
图2-1
语法分析主程序示意图
(2)递归下降分析程序示意图如图
2-2所示。
(3)语句串分析过程示意图如图
2-3
所示。
begin?
调用statement函数
调用scaner
是否;
?
调用语句串分析程序
是否end?
否
出错处理
syn=0&
kk=0?
图2-3语句串分析示意图
打印分析成功出错处理
图2-2递归下降分析程序示意图
(4)statement语句分析程序流程如图
2-4、2-5、2-6、2-7所示。
是否标识符?
调用term函数
是否+,-?
是否:
=?
否是
调用expression函数调用scaner
出错处理出错处理
图2-4statement语句分析函数示意图图2-5expression表达式分析函数示
意图
调用factor函数
是否*,/?
是否整常数?
图2-6term分析函数示意图
是否(?
调用expression函数
是否)?
调用scaner调用scaner
图2-7factor分析过程示意图
三、语法分析程序的C语言程序源代码:
#include"
stdio.h"
string.h"
charprog[100],token[8],ch;
intkk;
factor();
expression();
yucu();
term();
statement();
lrparser();
{
p=kk=0;
\npleaseinputastring(endwith'
\n"
{scanf("
lrparser()
if(syn==1)
/*读下一个单词符号*/
/*调用yucu()函数;
*/
if(syn==6)
{scaner();
if((syn==0)&
(kk==0))
success!
\n"
else{if(kk!
=1)printf("
thestringhaven'
tgota'
end'
kk=1;
else{printf("
haven'
begin'
return;
yucu()
/*调用函数statement();
*/
while(syn==26)
if(syn!
=6)
statement()
{if(syn==10)
if(syn==18)
thesing'
iswrong!
wrongsentence!
expression()
{term();
while((syn==13)||(syn==14))
/*调用函数term();
term()
{factor();
while((syn==15)||(syn==16))
/*调用函数factor();
factor()
{if((syn==10)||(syn==11))scaner();
elseif(syn==27)
if(syn==28)
theerroron'
theexpressionerror!
m=0;
while(ch=='
)ch=prog[p++];
token[m++]='
break;
if(ch=='
elseif(ch=='
syn=13;
syn=14;
syn=25;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 语法分析 报告 代码 语言版