编译原理词法分析实验报告含可运行源码文档格式.docx
- 文档编号:5731133
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:24
- 大小:233.72KB
编译原理词法分析实验报告含可运行源码文档格式.docx
《编译原理词法分析实验报告含可运行源码文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验报告含可运行源码文档格式.docx(24页珍藏版)》请在冰点文库上搜索。
10)isNegative整数,是否为负数幂。
isNegative为1,则为负数幂,如123E-2。
11)
scanner()扫描子程序。
12)getchar()从控制台读取一个字符数据。
13)doublepow(doublex,doubley),计算x的y次幂。
14)intstrcmp(char*str1,char#str2),字符串比较。
三流程框图
主程序
扫描子程序
四函数相关说明
1.接收用户输入:
getchar()和do…while循环的组合
do{
ch=getchar();
prog[p++]=ch;
}while(ch!
='
#'
);
//输入以#号键结束
2.输出到控制台:
do…while循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。
scanner();
//扫描,单词
switch(syn)
{
case11:
if((isDecimal==0)&
&
(isExp==0))
{
//加了1个强制类型转换
printf("
(%2d,%8d)\n"
syn,(int)sum);
break;
}
if(isExp==1)
(%2d,%g)\n"
syn,sum);
isExp=0;
isDecimal=0;
elseif(isDecimal==1)
(%2d,%8.4f)\n"
elsebreak;
case-1:
printf("
UNKNOWNERROR\n"
break;
case90:
%8s小数格式不正确\n"
token);
case91:
%s指数格式不正确\n"
case99:
//syn=99时即判断为注释
default:
(%2d,%8s)\n"
syn,token);
}
}while(syn!
=0);
3.浮点数的识别,先识别数字,再识别.,再识别数字,再识别E或e,再识别-,再识别数字。
elseif((ch>
0'
)&
(ch<
9'
))
{k=0;
while((ch>
sum=sum*10+ch-'
;
//ch中数字本身是当做字符存放的
token[k++]=ch;
ch=prog[p++];
if(ch=='
.'
)
isDecimal=1;
if(!
(ch>
ch<
token[k++]=ch;
syn=90;
//小数格式不正确
else
while((ch>
{
//pow(x,y)计算x的y次幂
temp=(ch-'
)*pow(0.1,++count);
decimal=decimal+temp;
//AddToDec();
token[k++]=ch;
ch=prog[p++];
}
sum=sum+decimal;
if(((ch=='
e'
)||(ch=='
E'
))&
(syn!
=90))
isExp=1;
if(ch!
)token[k++]=ch;
if(ch=='
-'
isNegative=1;
ch=prog[p++];
if(ch!
+'
isNegative=0;
))syn=91;
while((ch>
=91))
//指数
index=index*10+ch-'
//10的幂
//123e3代表123*10(3)
//sum=sum*pow(10,index);
是错误的
if(syn!
=91)
if(isNegative)
sum=sum*pow(0.1,index);
else
sum=sum*pow(10.0,index);
if(syn!
=90)
{
if(isSignal==1)
sum=-sum;
isSignal=0;
=91){syn=11;
p=p-1;
}
if(prog[p-1]=='
)p=p-1;
}
4.注释的识别与过滤,识别到‘/’符号的时候进行判断,如若紧跟*符号则判断为注释,p指针不断后移知道读取到*/为止
case'
/'
:
if(prog[p]!
*'
syn=25;
token[m++]=ch;
do
{
p++;
}while(!
((prog[p]=='
(prog[p+1]=='
)));
p=p+2;
ch=prog[p];
syn=99;
break;
五输入与输出
词法分析程序需具备词法分析的功能:
输入:
所给文法的源程序字符串。
(字符串以“#”号结束)
输出:
二元组(syn,token或sum)构成的序列。
其中:
syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
六程序运行截图
七词法分析器使用说明
用户输入待识别字符串(并以“#”结尾,表示字符串输入结束),回车后程序自动输出词法分析结果。
八心得与体会
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
通过本试验的完成,更加加深了对词法分析原理的理解。
九源程序清单
#include<
stdio.h>
string.h>
math.h>
iostream>
charprog[180];
//存放所有输入字符
chartoken[20];
//存放词组
charch;
//单个字符
intsyn,p,m,n;
//syn:
种别编码
doublesum;
intcount;
intisSignal;
//是否带正负号(0不带,1负号,2正号)
intisDecimal;
//是否是小数
doubledecimal;
//小数
intisExp=0;
//是否是指数
intindex;
//指数幂
intisNegative;
//是否带负号
doubletemp;
inttemp2;
intk;
voidscanner();
char*rwtab[9]={"
main"
int"
float"
double"
char"
else"
voidmain()
{
p=0;
count=0;
isDecimal=0;
index=0;
printf("
\nPleaseinputstring:
\n"
system("
pause"
voidscanner()
sum=0;
decimal=0;
m=0;
for(n=0;
n<
20;
n++)
token[n]=NULL;
ch=prog[p++];
//从prog中读出一个字符到ch中
while((ch=='
'
\n'
\t'
))//跳过空字符(无效输入)
ch=prog[p++];
if(((ch>
a'
z'
))||((ch>
A'
Z'
)))//ch是字母字符
{
while(((ch>
)))
token[m++]=ch;
//ch=>
token
//读下一个字符
token[m++]='
\0'
p--;
//回退一格
syn=10;
//标识符
//如果是标识符中的一个
for(n=0;
9;
if(strcmp(token,rwtab[n])==0)
syn=n+1;
elseif((ch>
IsNum:
k=0;
elseswitch(ch)
case'
<
'
m=0;
syn=35;
syn=34;
p--;
>
syn=33;
syn=32;
temp2=prog[p];
if((p==1)&
(prog[1]>
(prog[1]<
isSignal=2;
gotoIsNum;
if((prog[p-2]>
(prog[p-2]<
{
syn=22;
if((temp2>
(temp2<
syn=11;
{syn=22;
isSignal=1;
elseif((prog[p-2]>
syn=23;
elseif((temp2>
//转到数字的识别
else
syn=24;
syn=21;
syn=31;
('
syn=26;
)'
syn=27;
{'
syn=28;
}'
syn=29;
'
syn=30;
['
syn=38;
]'
syn=39;
case'
syn=0;
p=p-1;
syn=-1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 实验 报告 运行 源码