华中师范大学
CHINA 题 目: 院 班 级:姓 名:学 号:指导老师:NORMAL UNIVERSITY
0701
CENTRAL
一.实验题目
词法分析 二.实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 三.实验内容
输入: 对所给文法的源程序字符串。
输出: 二元组(syn, token或 sum)构成的序列。 其中: syn 为单词自身字符串; token为存放的单词自身字符串; sum为整形常数。 四.实验步骤
1.进行算法分析
2.编写程序
3.测试程序
4.进行调试
5.写实验报告
五.实验设计思想
六.实现代码
#include #include #include
void scaner();
char prog[80] , token[8];
int syn, p, m, n, sum, i, len;
char *rwtab[6]={"begin", "if", "then","while","do", "end"};
int main() {
FILE *f1;
f1=fopen("read.txt","rt"); do {
fgets(prog, 80,f1); len=strlen(prog); prog[len-1]=0; p=0; do {
scaner(); if(syn==-1) {
if(prog[p]==0) break;
else if(prog[p++]==9) continue; }
switch(syn) {
case 11: printf("(%d, %d)\n",syn,sum);break; case -1: printf("error\n"); p++;break; default: printf("(%d, %s)\n",syn,token); }
}while(syn && prog[p]); if(syn==0) break;
}while(!feof(f1)); fclose(f1); return 0; }
void scaner() {
m=0; sum=0;
memset(token,0, sizeof(token)); while(prog[p]==' ') p++;
if(prog[p]>='a' && prog[p]='A' && prog[p]
{
while(prog[p]>='a' && prog[p]='A' && prog[p]='0' && prog[p]
for(n=0; n
if(strcmp(token,rwtab[n])==0) {
syn=n+1; break; } }
else if(prog[p]>='0' && prog[p]
while(prog[p]>='0' && prog[p]
sum=sum*10 + prog[p] - '0'; p++; }
syn=11; }
else
switch(prog[p]) {
case '') {
syn=21;
token[m++]=prog[p++]; }
else if(prog[p]=='=') {
syn=22;
token[m++]=prog[p++]; }
else
syn=20; token[m]='\0'; break;
case '>': token[m++]=prog[p++]; if(prog[p]=='=') {
{
while(prog[p]>='a' && prog[p]='A' && prog[p]='0' && prog[p]
token[m++]=prog[p++];
token[m]='\0';
syn=10;
for(n=0; n
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if(prog[p]>='0' && prog[p]
{
while(prog[p]>='0' && prog[p]
{
sum=sum*10 + prog[p] - '0';
p++;
}
syn=11;
}
else
switch(prog[p])
{
case '
if(prog[p]=='>')
{
syn=21;
token[m++]=prog[p++];
}
else if(prog[p]=='=')
{
syn=22;
token[m++]=prog[p++];
}
else
syn=20;
token[m]='\0';
break;
case '>': token[m++]=prog[p++];
if(prog[p]=='=')
{
} } syn=24; token[m++]=prog[p++]; } else syn=23; token[m]='\0'; break; case ':': token[m++]=prog[p++]; if(prog[p]=='=') { syn=18; token[m++]=prog[p++]; } else syn=17; token[m]='\0'; break; case '+': syn=13; token[0]=prog[p++]; break; case '-': syn=14; token[0]=prog[p++]; break; case '*': syn=15; token[0]=prog[p++]; break; case '/': syn=16; token[0]=prog[p++]; break; case '=': syn=25; token[0]=prog[p++]; break; case ';': syn=26; token[0]=prog[p++]; break; case '(': syn=27; token[0]=prog[p++]; break; case ')': syn=28; token[0]=prog[p++]; break; case '#': syn=0; token[0]=prog[p++]; break; default: syn=-1;
读入begin
x:=9;
if x>0
then
x:= 2*x + 1/3;
? end #:
输出结果:
七.小结
这个程序其实就简和单的单词统计的问理论知识里面的大不相同,通过对这个程序的写我了解了相关的知识
八.参考文献
编译原理教
华中师范大学
CHINA 题 目: 院 班 级:姓 名:学 号:指导老师:NORMAL UNIVERSITY
0701
CENTRAL
一.实验题目
词法分析 二.实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 三.实验内容
输入: 对所给文法的源程序字符串。
输出: 二元组(syn, token或 sum)构成的序列。 其中: syn 为单词自身字符串; token为存放的单词自身字符串; sum为整形常数。 四.实验步骤
1.进行算法分析
2.编写程序
3.测试程序
4.进行调试
5.写实验报告
五.实验设计思想
六.实现代码
#include #include #include
void scaner();
char prog[80] , token[8];
int syn, p, m, n, sum, i, len;
char *rwtab[6]={"begin", "if", "then","while","do", "end"};
int main() {
FILE *f1;
f1=fopen("read.txt","rt"); do {
fgets(prog, 80,f1); len=strlen(prog); prog[len-1]=0; p=0; do {
scaner(); if(syn==-1) {
if(prog[p]==0) break;
else if(prog[p++]==9) continue; }
switch(syn) {
case 11: printf("(%d, %d)\n",syn,sum);break; case -1: printf("error\n"); p++;break; default: printf("(%d, %s)\n",syn,token); }
}while(syn && prog[p]); if(syn==0) break;
}while(!feof(f1)); fclose(f1); return 0; }
void scaner() {
m=0; sum=0;
memset(token,0, sizeof(token)); while(prog[p]==' ') p++;
if(prog[p]>='a' && prog[p]='A' && prog[p]
{
while(prog[p]>='a' && prog[p]='A' && prog[p]='0' && prog[p]
for(n=0; n
if(strcmp(token,rwtab[n])==0) {
syn=n+1; break; } }
else if(prog[p]>='0' && prog[p]
while(prog[p]>='0' && prog[p]
sum=sum*10 + prog[p] - '0'; p++; }
syn=11; }
else
switch(prog[p]) {
case '') {
syn=21;
token[m++]=prog[p++]; }
else if(prog[p]=='=') {
syn=22;
token[m++]=prog[p++]; }
else
syn=20; token[m]='\0'; break;
case '>': token[m++]=prog[p++]; if(prog[p]=='=') {
{
while(prog[p]>='a' && prog[p]='A' && prog[p]='0' && prog[p]
token[m++]=prog[p++];
token[m]='\0';
syn=10;
for(n=0; n
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if(prog[p]>='0' && prog[p]
{
while(prog[p]>='0' && prog[p]
{
sum=sum*10 + prog[p] - '0';
p++;
}
syn=11;
}
else
switch(prog[p])
{
case '
if(prog[p]=='>')
{
syn=21;
token[m++]=prog[p++];
}
else if(prog[p]=='=')
{
syn=22;
token[m++]=prog[p++];
}
else
syn=20;
token[m]='\0';
break;
case '>': token[m++]=prog[p++];
if(prog[p]=='=')
{
} } syn=24; token[m++]=prog[p++]; } else syn=23; token[m]='\0'; break; case ':': token[m++]=prog[p++]; if(prog[p]=='=') { syn=18; token[m++]=prog[p++]; } else syn=17; token[m]='\0'; break; case '+': syn=13; token[0]=prog[p++]; break; case '-': syn=14; token[0]=prog[p++]; break; case '*': syn=15; token[0]=prog[p++]; break; case '/': syn=16; token[0]=prog[p++]; break; case '=': syn=25; token[0]=prog[p++]; break; case ';': syn=26; token[0]=prog[p++]; break; case '(': syn=27; token[0]=prog[p++]; break; case ')': syn=28; token[0]=prog[p++]; break; case '#': syn=0; token[0]=prog[p++]; break; default: syn=-1;
读入begin
x:=9;
if x>0
then
x:= 2*x + 1/3;
? end #:
输出结果:
七.小结
这个程序其实就简和单的单词统计的问理论知识里面的大不相同,通过对这个程序的写我了解了相关的知识
八.参考文献
编译原理教