首页 > 代码库 > 词法分析实验报告

词法分析实验报告

 

实验一、词法分析实验

专业 商业软件工程

  姓名 黄施策

 学号 201506110228

一、        实验目的

     编制一个词法分析程序。

二、        实验内容和要求

    输入:源程序字符串

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

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

 

  1. 1.      源程序名:词法分析.c

可执行程序名:词法分析.exe

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

主要总体设计问题。

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

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

实现主要功能的程序段,重要的是程序的注释解释。#include<stdio.h>

#include<string.h>

#define N 100

void priint(char str[],int i,int semp[]);

void pristring(char str[],int i,int semp[]);

void prichar(char str[],int i,int semp[]);

void main()

{

    int i;

    int temp;

    char str[N];

    int semp[N]={0};    /*此数组用来标记str字符串里每个成员是否已进行分析,已分析为1,否则为0*/

    printf("输入您需要进行词法分析的源程序:");

    gets(str);

    temp=strlen(str);      /*temp所储存的是输入的字符串的长度*/

    for(i=0;i<temp;i++)

    {                      /*利用ASCII码对字符进行分类并进入各自对应的函数*/

           if((semp[i]==0)&&(str[i-1]<48||str[i-1]>57)&&(str[i]>=48&&str[i]<=57)){

                  priint(str,i,semp);}/*数字*/

           if((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))){

                  pristring(str,i,semp);}/*字母*/

    if((semp[i]!=1)&&((str[i]>=32&&str[i]<=47)||(str[i]>=58&&str[i]<=64)||(str[i]>=91&&str[i]<=96)||(str[i]>=123&&str[i]<=126))){

                  prichar(str,i,semp);}/*符号*/

    }

}

 

void priint(char str[],int i,int semp[])

{

    char strtemp[N]={‘\0‘};

    int j,k;

    for(j=0;j<N;j++)

    {

           if(str[i]<48||str[i]>57) break;

           strtemp[j]=str[i];

           semp[i]=1;

           i++;

    }

    printf("<11,");

    k=0;

    do{

           printf("%c",strtemp[k]);

           k++;

    }while(strtemp[k]!=‘\0‘);

    printf(">\n");

    strnset(strtemp,‘\0‘,N);/*将字符串strtemp的前N个字符都设为指定字符‘\0‘*/

}

 

void pristring(char str[],int i,int semp[])

{

    int j=0;

    int k;

    char gechar[N];

    char *tempp[10]={"begin","if","then","while","do","end"};  /*二维字符数组*/

    do{

          gechar[j]=str[i];

             semp[i]=1;

             i++;

             j++;

    }while((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122)));

    if(strcmp(gechar,tempp[0])==0)  {printf("<1,begin>");}     /*strcmp功能:对两字符进行比较,相同返回0,不同则为其他数*/

    else if(strcmp(gechar,tempp[1])==0)  {printf("<2,if>");}

    else if(strcmp(gechar,tempp[2])==0)  {printf("<3,then>");}

    else if(strcmp(gechar,tempp[3])==0)  {printf("<4,while>");}

    else if(strcmp(gechar,tempp[4])==0)  {printf("<5,do>");}

    else if(strcmp(gechar,tempp[5])==0)  {printf("<6,end>");}

    else   {

           printf("<10,");

           for(k=0;k<j;k++)

           {

                  printf("%c",gechar[k]);

           }

           printf(">\n");

    }

    strnset(gechar,‘\0‘,N);

}

 

void prichar(char str[],int i,int semp[])

{

    char gchar=str[i];

    switch(gchar)

    {

          case ‘+‘:printf("<13,%c>\n",gchar);semp[i]=1;break;

          case ‘-‘:printf("<14,%c>\n",gchar);semp[i]=1;break;

          case ‘*‘:printf("<15,%c>\n",gchar);semp[i]=1;break;

             case ‘/‘:printf("<16,%c>\n",gchar);semp[i]=1;break;

             case ‘:‘:

                         if(str[i+1]!=‘=‘){

                                printf("<17,%c>\n",gchar);

                                semp[i]=1;

                         }

                         else if(str[i+1]==‘=‘){

                                printf("<18,%c%c>\n",gchar,str[i+1]);

                                semp[i]=1;

                                semp[i+1]=1;

                         }

                         break;

             case ‘<‘:

                         if((str[i+1]!=‘=‘)&&(str[i+1]!=‘>‘)){

                                printf("<20,%c>\n",gchar);

                                semp[i]=1;

                         }

                         else if(str[i+1]==‘=‘){

                                printf("<21,%c%c>\n",gchar,str[i+1]);

                                semp[i]=1;

                                semp[i+1]=1;

                         }

                         else if(str[i+1]==‘>‘){

                                printf("<22,%c%c>\n",gchar,str[i+1]);

                                semp[i]=1;

                                semp[i+1]=1;

                         }

                         break;

             case ‘>‘:

                         if(str[i+1]!=‘=‘){

                                printf("<23,%c>\n",gchar);

                                semp[i]=1;

                         }

                         else if(str[i+1]==‘=‘){

                                printf("<24,%c%c>\n",gchar,str[i+1]);

                                semp[i]=1;

                                semp[i+1]=1;

                         }

                         break;

             case ‘=‘:

                     if((str[i-1]!=‘<‘)&&(str[i-1]!=‘:‘)&&(str[i-1]!=‘>‘)){

                            printf("<25,%c>\n",gchar);

                                semp[i]=1;

                         }

                         break;

             case ‘;‘:printf("<26,%c>\n",gchar);semp[i]=1;break;

             case ‘(‘:printf("<27,%c>\n",gchar);semp[i]=1;break;

             case ‘)‘:printf("<28,%c>\n",gchar);semp[i]=1;break;

             case ‘#‘:printf("<0,%c>\n",gchar);semp[i]=1;break;

             default:printf("<非法字符,%c>\n",gchar);semp[i]=1; break;    /*对种码表里没有的符号都默认为非法字符*/

    }

}

  1. 4.      运行结果及分析

技术分享

四、        实验总结

 

词法分析文法不熟练,还需多加练习,巩固提高。

词法分析实验报告