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

    实验一、词法分析实验

    专业 商软3班  姓名 陈文豪  学号 201506110196

    一、实验目的

       编制一个词法分析程序

    二、实验内容和要求

        输入:源程序字符串

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

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

    1. 源程序名:压缩包文件(rarzip)中源程序名词法分析.c,可执行程序名:词法分析.exe

    2. 原理分析及流程图

    关键过程:把输入的字符串存入数组---从数组中拿出一个字符根据它的ascii码判断出种别---判断完后输出

    3. 主要程序段及其解释

      1 void cwh()
      2 {
      3     int i,m;/*m用于记录linshi的下标*/
      4     char *guanjianzi[6]= {"begin","if","then","while","do","end"}; /*char*[]数组每个元素指向一个char型的变量,关键字数组记得zhongbie+1*/
      5     for(i=0; i<15; i++)
      6     {
      7         linshi[i]=NULL;   /*定义一个临时存放字符串的数组用作比较*/
      8     }
      9     m=0;/*初始化下标*/
     10     sum=0;
     11     ch=zifu[p++];
     12     /*开始识别字符种别*/
     13     while(ch==' ')
     14     {
     15         ch=zifu[p++];
     16     }
     17     /*识别关键字或者标识符*/
     18     if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
     19     {
     20         while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))/*将标识符存入临时数组*/
     21         {
     22             linshi[m++]=ch;
     23             ch=zifu[p++];
     24         }
     25         linshi[m]='';
     26         p--;
     27         zhongbie=10;/*p=p+1下次识别就是p+1*/
     28         for(i=0; i<6; i++) /*将识别出来的字符和已定义的关键字作比较 */
     29         {
     30             if(strcmp(linshi,guanjianzi[i])==0)
     31             {
     32                 zhongbie=i+1;
     33                 break;
     34             }
     35         }
     36     }
     37     /*识别数字*/
     38     else if((ch>='0'&&ch<='9'))
     39     {
     40         while((ch>='0'&&ch<='9'))
     41         {
     42             linshi[m++]=ch;
     43             ch=zifu[p++];
     44         }
     45         p--;
     46         zhongbie=11;
     47     }
     48     else
     49     {
     50         switch(ch)
     51         {
     52         case ':':
     53             linshi[m++]=ch;
     54             ch=zifu[p++];
     55             if(ch=='=')
     56             {
     57                 zhongbie=18;
     58                 linshi[m++]=ch;
     59             }
     60             else
     61             {
     62                 zhongbie=17;
     63                 p--;
     64             }
     65             break;
     66         case '<':
     67             linshi[m++]=ch;
     68             ch=zifu[p++];
     69             if(ch=='=')
     70             {
     71                 zhongbie=21;
     72                 linshi[m++]=ch;
     73             }
     74             else if(ch=='>')
     75             {
     76                 zhongbie=22;
     77                 linshi[m++]=ch;
     78             }
     79             else
     80             {
     81                 zhongbie=20;
     82                 p--;
     83             }
     84             break;
     85         case '>':
     86             linshi[m++]=ch;
     87             ch=zifu[p++];
     88             if(ch=='=')
     89             {
     90                 zhongbie=24;
     91                 linshi[m++]=ch;
     92             }
     93             else
     94             {
     95                 zhongbie=23;
     96                 p--;
     97             }
     98             break;
     99         case '+':
    100             zhongbie=13;
    101             linshi[0]=ch;
    102             break;
    103         case '-':
    104             zhongbie=14;
    105             linshi[0]=ch;
    106             break;
    107         case '*':
    108             zhongbie=15;
    109             linshi[0]=ch;
    110             break;
    111         case '/':
    112             zhongbie=16;
    113             linshi[0]=ch;
    114             break;
    115         case '=':
    116             zhongbie=25;
    117             linshi[0]=ch;
    118             break;
    119         case ';':
    120             zhongbie=26;
    121             linshi[0]=ch;
    122             break;
    123         case '(':
    124             zhongbie=27;
    125             linshi[0]=ch;
    126             break;
    127         case ')':
    128             zhongbie=28;
    129             linshi[0]=ch;
    130             break;
    131         case '#':
    132             zhongbie=0;
    133             linshi[0]=ch;
    134             break;
    135         case'
    ':
    136             zhongbie=-2;
    137             break;
    138         default:
    139             zhongbie=-1;
    140             break;
    141         }
    142     }
    143 }

    4. 运行结果及分析

    实验总结

    这是编译原理的第一次实验报告作业,刚开始做比较困难,因为没写过这类型的程序,后来上网查了些资料后才逐渐有了整体的思路,并最终完成程序。

    过程中有些小细节的处理不够细腻导致最终程序出现错误,在不断的处理这些错误的过程进一步巩固了自己的学到的知识。

    心得:学会了使用全局变量处理问题  

    实验问题:1.关键字不知道怎么整理成一个数组

                  2.字符如何判断是关键字还是标识符  

    解决方案:1.使用指针数组char *guanjianzi[6]

                  2.用strcmp(临时存放字符的数组,guanjianzi[])==0得出是关键字还是标识符

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    ORACLE10g R2【单实例 FS→单实例FS】
    算法理解汇总
    ORACLE10g R2【RAC+ASM→单实例FS】
    [SHOI2008]仙人掌图 II——树形dp与环形处理
    ORACLE10g R2【RAC+ASM→RAC+ASM】
    [学习笔记]动态点分治
    Java实现第九届蓝桥杯阶乘位数
    Oracle 12C R2 on Linux 7.X Data Guard 搭建文档
    [ZJOI2015]幻想乡战略游戏——动态点分治
    metabase 安装文档
  • 原文地址:https://www.cnblogs.com/lsq141205/p/5955580.html
Copyright © 2011-2022 走看看