• 算法分析实验报告词法分析器


    实验一、词法分析实验

    商业软件工程专业   李锦旭  学号201506110131

    一、 实验目的

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

    二、 实验内容和要求

    在原程序中输入源代码

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

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

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

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

    输出形式:

    • 二元式

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

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

    – 整数码

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

    – 标识符token、常数sum

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

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

    1. 源程序名:

    可执行程序名:

    1. 原理分析及流程图

           

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

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

    void judge()
    {
        for (x = 0; x < 10; x++)    //初始化token数组
        {
            token[x] = NULL;
        }
        ch = str[i];
        while (ch == ' ')    //忽视空格
        {
            i++;
            ch = str[i];
        }
        x = 0;
        i++;
        if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))        //访问到字母
        {
            while (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')) || ((ch >= '0') && (ch <= '9')))
            {
                token[x] = ch;
                x++;
                ch = str[i];
                i++;
            }
            i--;
            typenum = 10;
            for (n = 0; n < 6; n++)           //判断是否是关键字
            {
                if (strcmp(token, word[n]) == 0)
                {
                    typenum = n + 1;
                    break;
                }
            }
        }
        else if ((ch >= '0') && (ch <= '9'))        //访问到数字
        {
            while ((ch >= '0') && (ch <= '9'))
            {
                token[x] = ch;
                x++;
                ch = str[i];
                i++;
            }
            i--;
            typenum = 11;
        }
        else
        {
            switch (ch)
            {
            case '<':
                token[x] = ch;
                x++;
                ch = str[i];
                i++;
                if (ch == '=')
                {
                    typenum = 21;
                    token[x] = ch;
                    x++;
                }
                else if (ch == '>')
                {
                    typenum = 22;
                    token[x] = ch;
                    x++;
                }
                else
                {
                    typenum = 20;
                    i--;
                }
                break;
            case '>':
                token[x] = ch;
                x++;
                ch = str[i];
                i++;
                if (ch == '=')
                {
                    typenum = 24;
                    token[x] = ch;
                    x++;
                }
                else
                {
                    typenum = 23;
                    i--;
                }
                break;
            case '+':  
                typenum = 13;
                token[x] = ch;
                x++;
                break;
            case '-':
                typenum = 14;
                token[x] = ch;
                x++;
                break;
            case '=':
                typenum = 25;
                token[x] = ch;
                x++;
                break;
            case '*':
                typenum = 15;
                token[x] = ch;
                x++;
                break;
            case '(':
                typenum = 27;
                token[x] = ch;
                x++;
                break;
            case ')':
                typenum = 28;
                token[x] = ch;
                x++;
                break;
    
            case ';':
                typenum = 26;
                token[x] = ch;
                x++;
                break;
            case '/':
                typenum = 16;
                token[x] = ch;
                x++;
                break;
            case '#':
                typenum = 0;
                token[x] = ch;
                x++;
                break;
            case ':':
                token[x] = ch;
                x++;
                ch = str[i];
                i++;
                if (ch == '=')
                {
                    typenum = 18;
                    token[x] = ch;
                    x++;
                }
                else
                {
                    typenum = 17;
                    i--;
                }
                break;
            default:
                typenum = -1;
                break;
            }
        }
    }
    1. 运行结果及分析

    输入源代码:begin x:=9: if x>9 then x:=2*x; end #

    结果分析:词法分析器正常运行,分析结果正确

    四、        实验总结

     通过编写出一个简易的词法分析程序,对自己的编程能力有了一个更好的理解了。

  • 相关阅读:
    进程、线程、协程
    python垃圾回收机制
    python变量存储和深浅拷贝
    Linux常用命令
    二叉树四种遍历,节点个数,深度
    装饰器
    ArrayList、Vector
    集合、Collection、迭代器、List
    卖票
    关于Thread和Runnable
  • 原文地址:https://www.cnblogs.com/131li/p/5961085.html
Copyright © 2020-2023  润新知