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

    实验一、词法分析实验

    专业:商软二班   姓名:陈广鹏  学号:201506110167

    一、        实验目的

     

         编制一个词法分析程序。

    二、        实验内容和要求

    a)        输入:源程序字符串

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

    c)         要求:对字符串表示的源程序 

    从左到右进行扫描和分解

    根据词法规则

    识别出一个一个具有独立意义的单词符号

    以供语法分析之用

    发现词法错误,则返回出错信息。

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

     

    1. 1.      源程序名:压缩包文件(rarzip)中源程序名CC.c
    2. 2.      原理分析及流程图

      #include <stdio.h>   

    #include <string.h>      

    char prog[80],token[8],ch;   

    int syn,p,m,n,sum;   

    char *rwtab[6]={"begin","if","then","while","do","end"};        

    void scaner(void);       

    main()   

    {   

        p=0;   

        printf("\n please input a string(end with '#'):\n");   

           

        do{   

                scanf("%c",&ch);   

                prog[p++]=ch;   

        }while(ch!='#');   

           

        p=0;   

        do{   

                scaner();   

                switch(syn)   

                {   

                    case 11:   

                        printf("( %-10d%5d )\n",sum,syn);   

                    break;   

                       

                    case -1:   

                        printf("you have input a wrong string\n");   

                        //getch();   

                        return 0;   

                    break;   

                       

                    default:    

                    printf("( %-10s%5d )\n",token,syn);   

                    break;   

                }   

            }while(syn!=0);   

        return 0;//getch();   

     }   

       

    void scaner()   

    {     

        sum=0;   

        for(m=0;m<8;m++)   

            token[m]=0;   

            ch=prog[p++];   

            m=0;             

        while((ch==' ')||(ch=='\n'))   

            ch=prog[p++];     

        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))//可能是标示符或者变量名   

         {    

            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) //找到一个变量名或者关键字,直到遇到空格为止  

            {   

                token[m++]=ch;   

                ch=prog[p++];    

            }               

            p--;   

            syn=10;   

            for(n=0;n<6;n++)    //将识别出来的字符和已定义的标示符作比较

            if(strcmp(token,rwtab[n])==0)   

            {    

                syn=n+1;   

                break;   

            }   

         }   

         else if((ch>='0')&&(ch<='9')) //数字   

         {    

            while((ch>='0')&&(ch<='9'))   

            {   

                sum=sum*10+ch-'0'; //将字符串转换成数字  

                ch=prog[p++];   

            }   

            p--;   

            syn=11;   

        }   

        else    

        {   

            switch(ch)    //其它字符

            {   

            case '<':   

                token[m++]=ch;   

                ch=prog[p++];   

                if(ch=='=')   

                {    

                    syn=22;   

                    token[m++]=ch;   

                }    

                else   

                {     

                    syn=20;   

                    p--;   

                }   

            break;   

       

            case '>':   

                token[m++]=ch;   

                ch=prog[p++];   

                if(ch=='=')   

                {   

                    syn=24;   

                    token[m++]=ch;   

                }   

                else   

                {    

                    syn=23;   

                    p--;   

                }   

            break;   

       

            case '+':   

                token[m++]=ch;   

                ch=prog[p++];   

                if(ch=='+')   

                {   

                    syn=17;   

                    token[m++]=ch;   

                }   

                else   

                {   

                    syn=13;   

                    p--;   

                }   

            break;   

       

            case '-':   

                token[m++]=ch;   

                ch=prog[p++];   

                if(ch=='-')   

                {   

                    syn=29;   

                    token[m++]=ch;   

                }   

                else   

                {    

                    syn=14;   

                    p--;   

                }   

            break;   

       

            case '!':   

                ch=prog[p++];   

                if(ch=='=')   

                {    

                    syn=21;   

                    token[m++]=ch;   

                }   

                else   

                {    

                    syn=31;   

                    p--;   

                }   

            break;   

       

            case '=':   

                token[m++]=ch;   

                ch=prog[p++];   

                if(ch=='=')   

                {   

                    syn=25;   

                    token[m++]=ch;   

                }   

                else   

                {   

                    syn=18;   

                    p--;   

                }   

            break;   

       

            case '*':   

                syn=15;   

                token[m++]=ch;   

            break;   

       

            case '/':   

                syn=16;   

                token[m++]=ch;   

            break;   

       

            case '(':    

                syn=27;   

                token[m++]=ch;   

            break;   

       

            case ')':   

                syn=28;   

                token[m++]=ch;   

            break;   

       

            case '{':    

                syn=5;   

                token[m++]=ch;   

            break;   

       

            case '}':    

                syn=6;   

                token[m++]=ch;   

            break;   

       

            case ';':   

                syn=26;   

                token[m++]=ch;   

            break;   

       

            case '\"':   

                syn=30;   

                token[m++]=ch;   

            break;   

       

            case '#':    

                syn=0;   

                token[m++]=ch;   

            break;   

       

            case ':':   

                syn=17;   

                token[m++]=ch;   

            break;   

       

            default:   

                syn=-1;   

            break;   

            }   

        }   

            token[m++]='\0';   

    }

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

     

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

    实现主要功能的程序段,重要的是程序的注释解释。

        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))//可能是标示符或者变量名       

            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) //找到一个变量名或者关键字,直到遇到空格为止  

            {   

                token[m++]=ch;   

                ch=prog[p++];   

            }               

            p--;   

            syn=10;   

            for(n=0;n<6;n++)    //将识别出来的字符和已定义的标示符作比较

         else if((ch>='0')&&(ch<='9')) //数字   

         {    

            while((ch>='0')&&(ch<='9'))   

            {   

                sum=sum*10+ch-'0'; //将字符串转换成数字  

                ch=prog[p++];   

            }   

            p--;   

            syn=11;数字种别码为11

    1. 4.      运行结果及分析

     

    此结果符合预期。但是却不够完善,只实现了简单的数字和字母的词法分析。

     

    四、        实验总结

      心得体会:词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,

    初次做词法分析时无从下手,后经过看书查资料对其慢慢理解, 勉强是做出了一个不太好的成品 ,

    对于编译程序的学习,我会更加用心的,毕竟我觉得确实有难度,但它确实很有用,比如编译程序

    的结构要如何简洁清晰条理化,编译程序的效率等等的实际问题。

     

     

     

  • 相关阅读:
    各种经典透镜投影模型
    表达式和运算
    数组
    如何使用布尔类型
    如何使用数字类型
    如何使用字符串类型
    如何声明变量,如何给变量赋值
    变量 构造函数 New 关键字
    调用write方法打印语句到浏览器
    MVC中几种常用ActionResult
  • 原文地址:https://www.cnblogs.com/chenguangpeng/p/5960483.html
Copyright © 2011-2022 走看看