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

    实验一、词法分析实验

    商业软件工程专业 张煌  201506110130

    一、        实验目的

    从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生以{种别码,属性}为格式的结果。

    二、        实验内容和要求

    输入:源程序字符串

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

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

    1.       源程序名:压缩包文件(rarzip)中

    源程序名词法分析.c

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

    链接: http://pan.baidu.com/s/1dFl0Tsl 密码: iuw6

    2.      原理分析及流程图

    存储结构:数组input存输入的字符串,数组output存要输出的字符串

     

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

    {
        //忽略空格回车tab
        while(input[*pos]=='\n'||input[*pos]=='\t'||input[*pos]==' ')(*pos)++;
        //识别出字母
        if(input[*pos]>='A'&&input[*pos]<='z')
        {
            int i=1;
            //识别出一个单词
            for((*pos)++;input[*pos]>='A'&&input[*pos]<='z'||input[*pos]>='0'&&input[*pos]<='9';i++,(*pos)++);
            //判断是标识符还是保留字
            if(!strncmp(&input[*pos]-i,"begin",5))
            {    
                strcat(output,"{1,begin}");
            }
            else if(!strncmp(&input[*pos]-i,"if",2))
            {
                strcat(output,"{2,if}");
            }
            else if(!strncmp(&input[*pos]-i,"then",4))
            {
                strcat(output,"{3,then}");
            }
            else if(!strncmp(&input[*pos]-i,"while",5))
            {
                strcat(output,"{4,while}");
            }
            else if(!strncmp(&input[*pos]-i,"do",2))
            {
                strcat(output,"{5,do}");
            }
            else if(!strncmp(&input[*pos]-i,"end",3))
            {
                strcat(output,"{6,end}");
            }
            else
            {
                strcat(output,"{10,");
                strncat(output,&input[*pos]-i,i);
                strcat(output,"}");
            }
        }
        //识别出数字
        else if(input[*pos]>='0'&&input[*pos]<='9')
        {
            int i=1;
            //识别出无符号整数
            for((*pos)++;input[*pos]>='0'&&input[*pos]<='9';i++,(*pos)++);
            strcat(output,"{11,");
            strncat(output,&input[*pos]-i,i);
            strcat(output,"}");
        }
        //识别出符号
        else 
        {
            switch(input[*pos])
            {
                case '+':
                {
                    strcat(output,"{13,+}");
                    (*pos)++;
                    break;
                }
                case '-':
                {
                    strcat(output,"{14,-}");
                    (*pos)++;
                    break;
                }
                case '*':
                {
                    strcat(output,"{15,*}");
                    (*pos)++;
                    break;
                }
                case '/':
                {
                    strcat(output,"{16,/}");
                    (*pos)++;
                    break;
                }
                case '(':
                {
                    strcat(output,"{27,(}");
                    (*pos)++;
                    break;
                }
                case ')':
                {
                    strcat(output,"{28,)}");
                    (*pos)++;
                    break;
                }
                case '#':
                {
                    strcat(output,"{0,#}");
                    (*pos)++;
                    return 0;
                }
                case ';':
                {
                    strcat(output,"{26,;}");
                    (*pos)++;
                    break;
                }
                case '=':
                {
                    strcat(output,"{25,=}");
                    (*pos)++;
                    break;
                }
                case ':':
                {
                    (*pos)++;
                    if(input[*pos]=='=')
                    {
                        strcat(output,"{18,:=}");
                        (*pos)++;
                    }
                    else
                    {
                        strcat(output,"{17,:}");
                    }
                    break;
                }
                case '<':
                {
                    (*pos)++;
                    if(input[*pos]=='=')
                    {
                        strcat(output,"{21,<=}");
                        (*pos)++;
                    }
                    else if(input[*pos]=='>')
                    {
                        strcat(output,"{22,<>}");
                        (*pos)++;
                    }
                    else
                    {
                        strcat(output,"{20,<}");
                    }
                    break;
                }
                case '>':
                {
                    (*pos)++;
                    if(input[*pos]=='=')
                    {
                        strcat(output,"{24,>=}");
                        (*pos)++;
                    }
    
                    else
                    {
                        strcat(output,"{23,>}");
                    }
                    break;
                }
            }
        }
        return 1;
    }
    1. 4.      运行结果及分析

  • 相关阅读:
    关键字static在C和C++中的区别
    C指针声明解读之左右法则
    各大公司面试题集锦
    C++的const和static的用法
    C++11常用特性总结
    C++多态下的访问修饰符
    #define 宏实现函数功能可能存在的问题
    Qt读写Json
    C/C++ 内存与指针
    C++ delete仍可访问的问题
  • 原文地址:https://www.cnblogs.com/hehe2333/p/5961157.html
Copyright © 2011-2022 走看看