实验一、词法分析实验

商业软件3班  范楚广  219

一、        实验目的

 

编制一个词法分析程序。通过设计一个编译词法分析程序,实现对词法分析转换的理解,加深对转换过程的认识,通过这个软件把理论知识运用到实际之中。

 

二、        实验内容和要求

 

输入:源程序字符串

输出:二元组(种别,单词本身

 

三、        实验方法、步骤及结果测试

 

  1. 1.      源程序名:词法分析_219范楚广.c

可执行程序名:词法分析_219范楚广.exe

  1. 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';

}

  1. 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++];

}

 

  1. 4.      运行结果及分析

 

 

 

 

四、        实验总结

 

对于词法分析的输入,有些不懂。通过用字符数组的方式储存来解决。

通过词法分析的实验更够更好地理解编译的原理。