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

实验一、词法分析实验

商业软件工程专业   李锦旭  学号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 #

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

四、        实验总结

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

原文地址:https://www.cnblogs.com/131li/p/5961085.html