实验一.词法分析实验 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.      运行结果及分析

原文地址:https://www.cnblogs.com/hehe2333/p/5961157.html