• 词法分析实验报告(一)


    实验一  词法分析实验

    专业:商业软件三班   姓名:曾铭杰  学号:201506110197

    一、        实验目的

    用C语言设计一个词法分析程序,将字符流的源程序进行分析,从左到右逐个字符地扫描源程序,同时滤掉空格符和回车换行符,逐个读取字符,然后将它们拼在一起组成一个有意义的单词符号,识别出单词的种别及单词自身的值.

    二、        实验内容和要求

    1.输入一段源程序字符串;

    2.输出格式按照二元组(种别,单词符号本身)。

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

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

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

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

    通过读取用户输入字符串,滤掉空格符合回车换行符,如果单词以字母开头则为标识符,再让标志符与关键字数组比较,存在与之相同元素即为关键字,否则则进入switch语句,与运算符,分隔符等有意义符号进行比较即可。

            

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

       

    do{ 
    
                scaner(); 
    
                switch(type) 
    
                { 
    
                    case 11: 
    
                        printf("   %-10d%5d
    ",sum,type); 
    
                    break; 
    
                    case -1: 
    
                        printf("有无法识别的字符
    ");   
    
                        return 0; 
    
                    break;      
    
                    default:  
    
                    printf("   %-10s%5d 
    ",word,type); 
    
                    break; 
    
                } 
    
            }while(type!=0);

    do while 循环语句中有scaner函数,scaner函数是对用户输入的字符串进行处理,滤掉空格和回车换行符读取有意义的单词,并对单词进行分析,判断起种别,根据返回值的情况进行分类,如果返回值type为11,则证明该单词为数字,如果为-1则表示无法识别,其他值则表示该单词为标识符或关键字或运算符等。对一个单词进行判断后继续循环,知道scaner返回值type为0,即为用户输入的字符串结束符'#为止。

    scanner函数部分程序段如下所示:

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) 
         {  
    while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) 
            { 
                word[i++]=ch; 
                ch=string[p++]; 
            }
    
         p--;
         type=10;                     //先将以字母开头的字符识别为标识符
    
     
            for(n=0;n<6;n++) 
            if(strcmp(word,keyword[n])==0)    //与关键字数组比较,相同则表示为关键字,种别码即为下标值加1
            {  
               type=n+1; 
                break; 
            } 
      }                                  
    
      else if((ch>='0')&&(ch<='9')) 
         {  
           while((ch>='0')&&(ch<='9')) 
           { 
               sum=sum*10+ch-'0';    //将字符型转化为整形sum
                ch=string[p++]; 
            } 
            p--; 
            type=11; 
       } 
    1. 4.      运行结果及分析

     

    四、        实验总结

    刚开始进行词法分析程序编写时候毫无头绪,虽然知道其原理和要求,但是不知道从何入手,在通过网上查询资料后才有所头绪,实验过程也遇到很多问题。

    由于程序需要返回单词符号和种别码给用户查看,而函数只能有一个返回值,所以返回的参数需设为全局变量,以便调用和查询。其次是在关键字数组的设定上,本程序中keyword数据存储关键字,数组的下标值+1即表示该关键字的种别码,在程序开始时就已初始化好的了。在程序运行时,如果计算机读取到已字母开头的单词时,会暂时将它识别为标识符,再将标识符与关键字数组进行比较,相同时即为关键字,种别码即为下标值+1。

  • 相关阅读:
    郁闷,母版页为什么会这样?怎么在使用了母版页的情况下使用js?大家帮忙
    .NET中实现无刷新客户端联动下拉菜单 (无刷新)(一)
    ADO.NET(二)
    HasRows的返回值问题
    动态生成DataTable绑定至DataList一例
    关于FastReport4.3的使用心得1
    资源文件的编译
    加密当前数据库的所有存储过程。
    使用拼音首字母序列实现检索功能
    关于错误Access Violation和too many consecutive exceptions,解决方法
  • 原文地址:https://www.cnblogs.com/Ming-jay/p/5955629.html
Copyright © 2020-2023  润新知