zoukankan      html  css  js  c++  java
  • 实验一、词法分析器实验

    一、 实验目的

     

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

    二、 实验内容和要求

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

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

     

    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

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Django2.1发布,Django2.1新特性
    解决tomcat启动慢问题
    ELKstack简介及环境部署
    Django项目中使用celery做异步任务
    vue moment库格式化处理后端传的日期
    vueAdmin ui基础包
    DRF项目工程基础包
    linux文件系统命令和分区 挂载
    linux解压缩基本命令使用
    vim基本操作
  • 原文地址:https://www.cnblogs.com/zzl-0402/p/5954647.html
Copyright © 2011-2022 走看看