实验一

格式说明:排版时注意按此模板的字体,字号和行距。

报告提交和打印输出时请去掉此框。

 

实验一、编译原理实验

专业 商业软件工程3班 姓名 黄俊熙 学号201506110212

一、        实验目的

 

编制一个词法分析程序

 

 

二、        实验内容和要求

输入:源程序字符串

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

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

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名×××.c

可执行程序名:×××.exe

  1. 2.      原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

  1. 3.      主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

#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"};

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

}

 

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

}

 

 

 

 

 

 

 

 

四、        实验总结

 

开始的时候一点头绪都没有,感觉上个学年学到的基础全部忘记了,通过向同学请教问题,从而渐渐的理解到这个程序是要干什么的。我觉得最难的一部是如何判断一串字符串的不同对应的种别码。

posted @ 2016-10-13 11:27  黄俊熙  阅读(88)  评论(0)    收藏  举报