词法分析实验报告(实验一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理词法分析实验报告
软工082班
兰洁
200831104044
一、实验内容
二、实验目的
三、实验预期
四、程序规定
五、实验原理
●程序流程图
●判别浮点功能扩展流程图
●状态转换图
六、程序代码与浮点判别功能扩展
七、测试用例
●扩展功能测试用例;
●普通功能测试用例
八、输出结果
九、实验心得
一、实验内容:
词法分析:
1、识别简单语言的单词符号;
2、识别关键字、标识符、数字、运算符等。并扩展浮点识别功能。
二、实验目的
调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。
三、实验预期结果:
经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。
四、程序规定:
1、关键字:"function","if","then","while","do","endfunc";
2、算术运算符:”+”,”-”,”*”,”/”,”=”;
3、关系运算符:"<" ">" "<=" ">=" "==" "!=";
4、界符:"(" ")" ";" "#";
5、标识符规定以字母开头,字母均为小写;
6、空格和换行符跳过;
7、单词对应编码:
十、实验原理:
输入串--------------------〉词法分析程序————————〉单词符号串
输入:字符串以#结束。
输出:单词的二元组(syn,token/sum)
程序流程图
分析浮点数功能扩展部分流程图:
shuzi()函数
状态转换图
六、程序代码:
备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数!
我把浮点数的syn设置为80!
/*词法分析源代码*/
#include
#include
scaner();
char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
char * rwtab[6]={"function","if","then","while","do","endfunc"}; int i=0,k,c,sumint,f;
char fenshu[80],sum1[80];
double sumf=0,fudian;
int shuzi(){
if(ch>='0' && ch<='9')
syn=80;
else
syn=-2;
return syn;}
main()
{p=0;
printf("\n please input string :\n");
do{
scanf("%c",&ch);
prog[++p]=ch;}
while(ch!='#');
p=0;
do
{
scaner();
switch(syn)
{ case 11:printf("\n(%d,%d)",syn,sum);break;
case -1:printf("\n error");break;
case 80:printf("\n(%d,%f)",syn,fudian);break; default:printf("\n(%d,%s)",syn,token);
}
}while(syn!=0);
}
scaner()
{
for(n=0;n<8;n++)
token[n]=NULL;//if(1+2!=3)
ch=prog[++p];
while(ch==' ' || ch=='\n')
ch=prog[++p];//跳过空格
if(ch>='a' && ch<='z')
{
m=0;
while(ch>='a' && ch<='z' || ch>='0' && ch<='9') {
token[m++]=ch;//token[0]=f,m=1
ch=prog[++p];
}
token[m]='\0';
ch=prog[--p];
syn=10;
for(n=0;n<6;n++){
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
}
else
if(ch>='0' && ch<='9')
{
c=p;
k=0;
do
{ sum1[k]=ch;
ch=prog[++c]; //ch取后一个数字
k++;
shuzi();//这个函数用来分析浮点数的整数部分是否已经输入到数组里
f=syn;
} while(f==80)
if(ch=='.')
{
for(n=0;n { sumint=sumint*10+sum1[n]-'0'; } //计算整数部分 i=0; do { ch=prog[++c]; fenshu[i]=ch; i++;