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

实验报告-词法分析.c

实验一、词法分析程序

商业软件工程   简梓茵  201506110132

一、        实验目的

 

熟悉词法分析的形式。

 

二、        实验内容和要求

     对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号

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

 

  1. 1.      源程序名:wordanalyse.c
  2. 2.      原理分析及流程图 

技术分享

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

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

 

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

                    return 0; 

                break; 

                 

                default:  

                printf("( %-10s%5d )\n",token,syn); 

                break; 

            } 

        }while(syn!=0); 

    //getch(); 

 } 

 //=================================对录入的词汇进行解析

void scaner(void) 

{   

    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. 4.      运行结果及分析

 技术分享

运行正常。

四、        实验总结

很多地方都纠结了好久,

包括符号处理,符号处理需要分类讨论。

另外还有就是空格和回车的处理,以及字符的读取处理。

为了提高程序效率,关键字处理最后用了指针数组来存储关键字。

 

实验报告-词法分析.c