实验一、词法分析器实验

一、 实验目的

 

通过词法分析器,进一步了解词法之间的关系。

二、 实验内容和要求

将输入的字符串通过词法分析器一一识别出来,同时将该字符串或者字符并且和种别码一起输出来。

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

 

  1. 源程序名:z.c

可执行程序名:z.exe

  1. 原理分析及流程图

采用数组存放数据,通过字符串的比较实现关键字的种别码输出

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

int m=0;

     sum=0;

     char *r[7]={"begin","if","then","for","while","do","end"};//数组存放关键字

    for(n=0;n<9;n++)

        token[n]='';

    ch=prog[p++];

    while(ch==' ')

        ch=prog[p++];

    if(isalpha(ch))    /*ch为字母字符*/

    {

        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/

        {

           token[m++]=ch;

           ch=prog[p++];}

        token[m++]='';

        ch=prog[p--];

        syn=10;

        for(n=0;n<7;n++)

            if(strcmp(token,r[n])==0)    /*字符串的比较*/

            {

                syn=n+1;

                break;}}

    else

        if(isdigit(ch))    /*ch是数字字符*/

        {

            while(isdigit(ch))    /*ch是数字字符*/

            {

                sum=sum*10+ch-'0';

                ch=prog[p++];}

            ch=prog[p--];

            syn=11;}

        else

            switch(ch){

                case'<':m=0;token[m++]=ch;ch=prog[p++];

                        if(ch=='>'){

                        syn=21;

                            token[m++]=ch;}

                        else if(ch=='='){

                            syn=22;

                            token[m++]=ch;}

                            else{

                                 syn=20;

                                 ch=prog[p--];}

                        break;

                case'>':m=0;token[m++]=ch;ch=prog[p++];

                        if(ch=='='){

                            syn=24;

                            token[m++]=ch;}

                        else{

                        syn=23;

                        ch=prog[p--];}

                        break;

             case':':m=0;token[m++]=ch;ch=prog[p++];

                     if(ch=='='){

                         syn=18;

                        token[m++]=ch;}

                     else{

                         syn=17;

                         ch=prog[p--];}

                     break;

             case'+':syn=13;token[0]=ch;break;

             case'-':syn=14;token[0]=ch;break;

             case'*':syn=15;token[0]=ch;break;

             case'/':syn=16;token[0]=ch;break;

             case'=':syn=25;token[0]=ch;break;

             case';':syn=26;token[0]=ch;break;

             case'(':syn=27;token[0]=ch;break;

             case')':syn=28;token[0]=ch;break;

             case'!':syn=29;token[0]=ch;break;

             case'#':syn=0;token[0]=ch;break;

             default:syn=-1;}

我采用prog数组存放键盘输入的字符,用r数组存放关键字的数组。通过判断空格键来用token数组存放前面的字符,如果前面的字符既出现字母又出现数字,那么就是标识符。反而就是关键字。然后通过token数组的字符串与前面定义r数组的字符串一一比较,输出所对应的种别码。

  1. 运行结果及分析

 

四、 实验总结

在这次的实验中了解词法分析的过程,解决一些问题。在完成我的词法分析器的时候考虑到关键字固定的字符串,这就有利于字符串的比较,从而识别出对应的种别码。对于数字的采用sum=sum*10+ch-'0'一个字符’1’转换为数字需要减’0’才能得到对应的数字,因为数字有个十百千万的规则,因为读取数字字符的时候是从其他位开始读的,最后才读个位。比如123,先读1,然后1*10+2=12,然后12*10+3=123

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/zzl-0402/p/5954647.html