词法分析实验报告

☆樱花仙子☆ 提交于 2020-01-05 01:40:21

实验一、词法分析实验

专业 商业软件3班  姓名 林鑫杰 学号201506110211

一、        实验目的

 

编制一个词法分析程序

 

二、        实验内容和要求

输入:源程序字符串

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

 

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

 

 

#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 please input a string(end with '#'):\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("you have input a wrong string\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';

}

 

 

 

 

四、        实验总结

 

通过这次实验让我更进一步的加强了对词法分析的理解,虽然做这个程序花了很多时间,但还是通过一步一步的查阅资料解决了这些问题。

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!