• 词法分析


    实验一、词法分析实验

    商业软件工程专业   刘伟锋  201506110086

    一、 实验目的

    通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

    二、 实验内容和要求

    在原程序中输入源代码

    • 对字符串表示的源程序  
    • 从左到右进行扫描和分解
    • 根据词法规则
    • 识别出一个一个具有独立意义的单词符号
    • 以供语法分析之用
    • 发现词法错误,则返回出错信息

    在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

    1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
    2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
    3. 运算符:+、-、*、/、=、>、<、>=、<=、!=
    4. 分隔符:,、;、{、}、(、)
    5. 常数,例:123

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

     

    输出形式:

    • 二元式

    – (单词种别,单词自身的值)

    • 单词种别,表明单词的种类,语法分析需要的重要信息

    – 整数码

    • 关键字、运算符、界符:一符一码
    • 标识符:10, 常数:11
    • 单词自身的值

    – 标识符token、常数sum

    – 关键字、运算符、界符token

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

           

     1.源程序

    复制代码
    #include <stdio.h>
    #include <string.h>
    
    char string[80],simbol[8],ch;
    int wordID,index,m,n,sum;
    char *rwtab[6]={"begin","if","then","while","do","end"};
    
    void scaner(void);
    
    main()
    {
        int index=0;
     printf("输入代码串(#号结束):");
    
        do{
                scanf("%c",&ch);
                string[index++]=ch;
        }while(ch!='#');
    
        index=0;
        do{
                scaner();
                switch(wordID)
                {
                    case 11:
                        printf("( %-10d%5d )\n",sum,wordID);
                    break;
    
                    case -1:
                        printf("错误\n");
                        return 0;
                    break;
    
                    default:
                    printf("( %-10s%5d )\n",simbol,wordID);
                    break;
                }
            }while(wordID!=0);
     return 0;
     }
    
    void scaner(void)
    {
        sum=0;
    
        for(m=0;m<8;m++)
            simbol[m++]= NULL;
    
            ch=string[index++];
            m=0;
    
        while((ch==' ')||(ch=='\n'))
            ch=string[index++];
    
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))//判断输入的字符是否为英文字母
         {
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
            {
                simbol[m++]=ch;
                ch=string[index++];
            }
            index--;
            wordID=10;
    
            for(n=0;n<6;n++)
            if(strcmp(simbol,rwtab[n])==0)
            {
                wordID=n+1;
                break;
            }
         }
         else if((ch>='0')&&(ch<='9'))//判断输入的字符是否为数字
         {
            while((ch>='0')&&(ch<='9'))
            {
                sum=sum*10+ch-'0';
                ch=string[index++];
            }
            index--;
            wordID=11;
        }
        else
        {
            switch(ch)//通过循环判断输入的字符是否为运算符
            {
            case '<':
                simbol[m++]=ch;
                ch=string[index++];
                if(ch=='=')
                {
                    wordID=22;
                    simbol[m++]=ch;
                }
                else
                {
                    wordID=20;
                    index--;
                }
            break;
    
            case '>':
                simbol[m++]=ch;
                ch=string[index++];
                if(ch=='=')
                {
                    wordID=24;
                    simbol[m++]=ch;
                }
                else
                {
                    wordID=23;
                    index--;
                }
            break;
    
            case '+':
                simbol[m++]=ch;
                ch=string[index++];
                if(ch=='+')
                {
                    wordID=17;
                    simbol[m++]=ch;
                }
                else
                {
                    wordID=13;
                    index--;
                }
            break;
    
            case '-':
                simbol[m++]=ch;
                ch=string[index++];
                if(ch=='-')
                {
                    wordID=29;
                    simbol[m++]=ch;
                }
                else
                {
                    wordID=14;
                    index--;
                }
            break;
    
            case '!':
                ch=string[index++];
                if(ch=='=')
                {
                    wordID=21;
                    simbol[m++]=ch;
                }
                else
                {
                    wordID=31;
                    index--;
                }
            break;
    
            case '=':
                simbol[m++]=ch;
                ch=string[index++];
                if(ch=='=')
                {
                    wordID=25;
                    simbol[m++]=ch;
                }
                else
                {
                    wordID=18;
                    index--;
                }
            break;
    
            case '*':
                wordID=15;
                simbol[m++]=ch;
            break;
    
            case '/':
                wordID=16;
                simbol[m++]=ch;
            break;
    
            case '('://判断输入的字符是否为分隔符
                wordID=27;
                simbol[m++]=ch;
            break;
    
            case ')':
                wordID=28;
                simbol[m++]=ch;
            break;
    
            case '{':
                wordID=5;
                simbol[m++]=ch;
            break;
    
            case '}':
                wordID=6;
                simbol[m++]=ch;
            break;
    
            case ';':
                wordID=26;
                simbol[m++]=ch;
            break;
    
            case '\"':
                wordID=30;
                simbol[m++]=ch;
            break;
    
            case '#':
                wordID=0;
                simbol[m++]=ch;
            break;
    
            case ':':
                wordID=17;
                simbol[m++]=ch;
            break;
    
            default:
                wordID=-1;
            break;
            }
        }
            simbol[m++]='\0';
    }
    复制代码

    四.运行结果及分析

    输入“printf("hello!world#")”

    测试结果如下图

  • 相关阅读:
    十一、GUI设计-记事本程序
    十、GUI编程
    OSI七层模型中各层的数据名称
    使用了frame的页面如何整体进行跳转,而不是仅frame跳转
    MySQL脏读、不可重复读、幻读
    博客园后台搜索自己的博客
    完整的ELK+filebeat+kafka笔记
    InnoDB引擎中的索引与算法
    Docker pull下载出现 error pulling image configuration:
    多台服务器通过docker搭建ELK集群
  • 原文地址:https://www.cnblogs.com/AMINOAC/p/5985043.html
Copyright © 2020-2023  润新知