词法分析实验报告_219范楚广
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析实验报告_219范楚广相关的知识,希望对你有一定的参考价值。
实验一、词法分析实验
商业软件3班 范楚广 219
一、 实验目的
编制一个词法分析程序。通过设计一个编译词法分析程序,实现对词法分析转换的理解,加深对转换过程的认识,通过这个软件把理论知识运用到实际之中。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身
三、 实验方法、步骤及结果测试
- 1. 源程序名:词法分析_219范楚广.c
可执行程序名:词法分析_219范楚广.exe
- 2. 原理分析及流程图
#include <stdio.h>
#include <string.h>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
scaner();
main()
{p=0;
printf("\\n 请输入一个字符串以#号结束:\\n");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!=‘#‘);
p=0;
do{
scaner();
switch(syn)
{case 11:printf("( %-10d%5d )\\n",sum,syn);
break;
case -1:printf("你输入了一个错误的字符串\\n");
getch();
exit(0);
default: printf("( %-10s%5d )\\n",token,syn);
break;
}
}while(syn!=0);
getch();
}
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‘)&&(ch>=‘A‘)))
{ while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((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;
break;
}
}
else if((ch>=‘0‘)&&(ch<=‘9‘))
{ while((ch>=‘0‘)&&(ch<=‘9‘))
{ sum=sum*10+ch-‘0‘;
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case ‘<‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘=‘)
{ syn=22;
token[m++]=ch;
}
else
{ syn=20;
p--;
}
break;
case ‘>‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘=‘)
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
p--;
}
break;
case ‘+‘: token[m++]=ch;
ch=prog[p++];
if(ch==‘+‘)
{ syn=17;
token[m++]=ch;
}
else
{ syn=13;
p--;
}
break;
case ‘-‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘-‘)
{ syn=29;
token[m++]=ch;
}
else
{ syn=14;
p--;
}
break;
case ‘!‘:ch=prog[p++];
if(ch==‘=‘)
{ syn=21;
token[m++]=ch;
}
else
{ syn=31;
p--;
}
break;
case ‘=‘:token[m++]=ch;
ch=prog[p++];
if(ch==‘=‘)
{ syn=25;
token[m++]=ch;
}
else
{ syn=18;
p--;
}
break;
case ‘*‘: syn=15;
token[m++]=ch;
break;
case ‘/‘: syn=16;
token[m++]=ch;
break;
case ‘(‘: syn=27;
token[m++]=ch;
break;
case ‘)‘: syn=28;
token[m++]=ch;
break;
case ‘{‘: syn=5;
token[m++]=ch;
break;
case ‘}‘: syn=6;
token[m++]=ch;
break;
case ‘;‘: syn=26;
token[m++]=ch;
break;
case ‘\\"‘: syn=30;
token[m++]=ch;
break;
case ‘#‘: syn=0;
token[m++]=ch;
break;
case ‘:‘:syn=17;
token[m++]=ch;
break;
default: syn=-1;
break;
}
token[m++]=‘\\0‘;
}
- 3. 主要程序段及其解释:
1、输入的字符串用数组
printf("\\n 请输入一个字符串以#号结束:\\n");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!=‘#‘);
2、当前字符是属于哪个范围就分配到哪个字符数组里面去
{ 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‘)&&(ch>=‘A‘)))
{ while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
{token[m++]=ch;
ch=prog[p++];
}
- 4. 运行结果及分析
四、 实验总结
对于词法分析的输入,有些不懂。通过用字符数组的方式储存来解决。
通过词法分析的实验更够更好地理解编译的原理。
以上是关于词法分析实验报告_219范楚广的主要内容,如果未能解决你的问题,请参考以下文章