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

    实验一、词法分析实验

    专业:商业软件工程三班       姓名:郑锦诚      学号:201506110198

    一、实验目的

    词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。

    二、实验内容和要求

    让用户输入一段程序段,然后逐个读取字符,将它们拼在一起,获取一个有意义的单词或符号,识别出单词或符号种别以及自身的值,并输出。

    各种单词符号对应的种别码:

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    :

    17

    if

    2

    :=

    18

    then

    3

    <

    20

    while

    4

    <=

    21

    do

    5

    <>

    22

    end

    6

    >

    23

    l(l|d)*

    10

    >=

    24

    dd*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

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

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

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

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

    主要总体设计问题:本次实验程序是用顺序存储结构,关键函数为mor,没有参数,也没有返回值,全用全局变量来实现运行代码,多次使用循环语句while、do whlie以及for,也使用了判断语句if、else判断是否为符号时使用了switch语句进行执行判断。

     

    1. 3.      主要程序段及其解释:   
    void mor()//主要函数的调用
    
    {   
    
        sum=0;  //先把sum赋值为0
    
          ch=a[p++];  //把有程序段数组a的字符赋给ch,p再加一
    
        m=0;      //把m赋值为0
    
        while((ch==' ')||(ch=='
    ')||(ch=='	'))   ch=a[p++];  //判断ch是否为空格,若是则进行判断下一个字符,p再加一
    
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) 
    
        {//判断字符ch是否是字母,若是则赋值给数组b,ch指向判断下一个字符是否是字母或是数字,并且p加一
    
    while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) 
    
            { 
    
                b[m++]=ch; 
    
                ch=a[p++]; 
    
            }   
    
               p--; //循环结束后,p减一,为了防止漏掉字符
    
               syn=10; //先把syn赋值为10,再进行判断是否是保留字或是关键字
    
               b[m++]='';//并把数组b的下一位赋值为,这样防止系统出现混乱
    
               for(n=0;n<6;n++)  //循环6次进行判断是否为保留字
    
                  if(strcmp(b,word[n])==0)    //关键字数组比较,相同则表示为关键字,种别码即为下标值加一
    
                  {
    
                         syn=n+1; 
    
                         return; 
    
                  } 
    
        }                                  
    
        else if((ch>='0')&&(ch<='9'))  //或者字符ch是数字的
    
      {  
    
           while((ch>='0')&&(ch<='9'))  //再次判断下一个字符是否为数字
    
           { 
    
               sum=sum*10+ch-'0';    //将字符型转化为整形sum
    
               ch=a[p++];  //字符ch指向下一个程序段数组a的字符
    
           } 
    
           p--;  //循环结束后,p减一,为了防止漏掉字符
    
           syn=11;  //数字的种别码是11
    
        } 
    
        else    //else语句内识别除关键字、标识符、数字以外的其他字符
    
        {  
    
            switch(ch) 
    
            { 
    
            case '+':  //字符ch是+的,syn赋值为13
    
                syn=13; 
    
                      b[m++]=ch;  //字符ch指向程序段数组a的下一个字符,p加一       
    
                break; 
    
            case '-':   /字符ch是-的,syn赋值为14
    
                      syn=14;
    
                b[m++]=ch;//字符ch指向程序段数组a的下一个字符,p加一
    
                break;
    
               case '*': 
    
                syn=15; 
    
                b[m++]=ch;//字符ch指向程序段数组a的下一个字符,p加一 
    
                break; 
    
            case '/': 
    
                syn=16; 
    
                b[m++]=ch; /字符ch指向程序段数组a的下一个字符,p加一 
    
                break; 
    
            case ':': 
    
                b[m++]=ch; 
    
                ch=a[p++];//字符ch指向程序段数组a的下一个字符,p加一 
    
                      if(ch=='=')  //判断字符ch是否为=,若是则赋值到数组b中
    
                      { 
    
                             syn=18; 
    
                             b[m++]=ch; 
    
                      } 
    
                      else  //否则赋值为18,再p减一
    
                      {  
    
                             syn=18; 
    
                             p--; 
    
                      } 
    
                      break;
    
               case '!': //为!则结束程序
    
                      syn=-2;
    
                      break;
    
            default:  //输入一个错误的字符的时候
    
                syn=-1; 
    
                break; 
    
            } 
    
        } 
    
        b[m++]='';  //把数组b的下一位赋值为
    
    }       运行结果及分析

    四、实验运行结果

    结果符合预期,词法分析程序先识别字母if进行判断,符合字符数组Word的保留字进行输出种别码以及自身的值,遇到空格就指向下一位,从而执行i,以此类推,当识别到!时程序结束。

     

    五、 实验总结

    难点问题:1.编译时出现死循环或不循环。

              2.输入保留字或关键字时,输出的结果没有符合预期,有时保留字变成关键字,关键字变成保留字。

    解决方法:1.循环嵌套出错以及循环条件&&,||的不规范使用导致的,已修改好。

              2.在数组b的下一位等于,就可以解决了。

    心得体会:经过这次的实践,我认识到自己的不足以及粗心,在今后的学习道路上相信会更加的出彩,多找到自己的不足,才能更好的加强自己的能力。

  • 相关阅读:
    rabbitmq线上服务器与项目结合的问题总结
    关于RabbitMQ Queue Argument的简介
    rabbitmq代码配置
    python基础篇17-虚环境
    Java-实体与集合转换
    Java-精确计算工具类
    Java-汉字繁体拼音转换
    Java-集合条件筛选
    Java-发邮件
    Java-MD5
  • 原文地址:https://www.cnblogs.com/04JC/p/5955717.html
Copyright © 2011-2022 走看看