词法分析实验报告_219范楚广

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析实验报告_219范楚广相关的知识,希望对你有一定的参考价值。

实验一、词法分析实验

商业软件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.      运行结果及分析

 技术分享

 

 

 

四、        实验总结

 

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

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

以上是关于词法分析实验报告_219范楚广的主要内容,如果未能解决你的问题,请参考以下文章

219_范楚广_对编译原理的认识

词法分析实验报告

词法分析实验报告

实验一 词法分析实验报告

实验报告-词法分析

词法分析实验报告