试验1:词法分析

实验一、词法分析实验

商业软件工程3  李华秋  201506110205

一、 实验目的

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

 

二、 实验内容和要求

     输入:源程序字符串

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

 

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

 

  1. 源程序名:

 

  1. 原理分析及流程图

#include <stdio.h>

#include <string.h>char prog[80],token[8],ch;int syn,p,m,n,sum;char *key[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,key[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. 主要程序段及其解释:

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--;

  1. 运行结果及分析

四、 实验总结

 

对词法转换过程认识不够,没能独立完成本次试验,对课本的知识还一知半解,刚接触逻辑上有些跟不上,课堂上的东西也没全掌握,很多问题都是靠查阅资料和问同学才解决。

 

 

 

posted @ 2016-10-12 22:57  205李华秋  阅读(251)  评论(5编辑  收藏  举报