词法分析器实验报告

一、 实验目的

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

二、 实验内容和要求

在原程序中输入源代码

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

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

  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("请输入代码,并以串#号键结束:\n");

    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';
}

四.运行结果及分析

posted @ 2016-10-21 17:06  087林金龙  阅读(1462)  评论(1编辑  收藏  举报