实验一:词法分析

实验一、词法分析实验

专业:计算机科学与技术   姓名:罗德广  学号:201506110204

一、实验目的

  用C语言实现简单的词法分析程序;设计一个词法分析程序,加深对词法分析原理的理解 。

二、实验内容和要求

    编写一个词法分析程序,使其能够识别对应的单词符号,并以(单词符号        种别码)的形式输出。

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

 

1.源程序名:压缩包文件(rar或zip)中源程序名 词法分析.c

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

2.原理分析及流程图

 

 

 

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

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

#include <stdio.h>
#include <string.h>
char a[80],s[8],ch;
int q,p,m,n,sum;
char *l[6]={"begin","if","then","while","do","end"};
//定义数组l,用于存放关键字
void scaner(void);
main()
{
    p=0;
    printf("\n请输入一个字符串(以'#'结尾):\n");
    do{
            scanf("%c",&ch);
            a[p++]=ch;
    }while(ch!='#');
    p=0;
    do{
            scaner();
            switch(q)
            {
                case 11:
                   printf("( %-10d%5d )\n",sum,q);
                break;
                case -1:
                    printf("输入错误!\n");
                    //getch();
                    return 0;
                break;
                default:
                printf("( %-10s%5d )\n",s,q);
                break;
            }
        }while(q!=0);
    //getch();
 }
void scaner(void)//利用循环进行字符串的识别和比较
{
    sum=0;
    for(m=0;m<8;m++)
        s[m++]= NULL;
        ch=a[p++];
        m=0;
    while((ch==' ')||(ch=='\n'))
        ch=a[p++];
    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
     {
        while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
        {
            s[m++]=ch;
            ch=a[p++];
        }
        p--;
        q=10;
        for(n=0;n<6;n++)
        if(strcmp(s,l[n])==0)
        {
            q=n+1;
            break;
        }
     }
     else if((ch>='0')&&(ch<='9'))
     {
        while((ch>='0')&&(ch<='9'))
        {
            sum=sum*10+ch-'0';
            ch=a[p++];
        }
        p--;
        q=11;
    }
    else
    {
        switch(ch)
        {
        case '<':
            s[m++]=ch;
            ch=a[p++];
            if(ch=='=')
            {
                q=22;
                s[m++]=ch;
            }
            else
            {
                q=20;
                p--;
            }
        break;
        case '>':
            s[m++]=ch;
            ch=a[p++];
            if(ch=='=')
            {
                q=24;
                s[m++]=ch;
            }
            else
            {
                q=23;
                p--;
            }
        break;
        case '+':
            s[m++]=ch;
            ch=a[p++];
            if(ch=='+')
            {
                q=17;
                s[m++]=ch;
            }
            else
            {
                q=13;
                p--;
            }
        break;
        case '-':
            s[m++]=ch;
            ch=a[p++];
            if(ch=='-')
            {
                q=29;
                s[m++]=ch;
            }
            else
            {
                q=14;
                p--;
            }
        break;
        case '!':
            ch=a[p++];
            if(ch=='=')
            {
                q=21;
                s[m++]=ch;
            }
            else
            {
                q=31;
                p--;
            }
        break;
        case '=':
            s[m++]=ch;
            ch=a[p++];
            if(ch=='=')
            {
                q=25;
                s[m++]=ch;
            }
            else
            {
                q=18;
                p--;
            }
        break;
        case '*':
            q=15;
            s[m++]=ch;
        break;
        case '/':
            q=16;
            s[m++]=ch;
        break;
        case '(':
            q=27;
            s[m++]=ch;
        break;
        case ')':
            q=28;
            s[m++]=ch;
        break;
        case '{':
            q=5;
            s[m++]=ch;
        break;
        case '}':
            q=6;
            s[m++]=ch;
        break;
        case ';':
            q=26;
            s[m++]=ch;
        break;
        case '\"':
            q=30;
            s[m++]=ch;
        break;
        case '#':
            q=0;
            s[m++]=ch;
        break;
        case ':':
            q=17;
            s[m++]=ch;
        break;
        default:
            q=-1;
        break;
        }
    }
        s[m++]='\0';
}

 

 

4.运行结果及分析

 

四、实验总结

数组a存放键盘输入的字符,数组l存放关键字。通过判断空格键来用数组s存放前面的字符,若前面的字符既出现字母又出现数字,则是标识符。反之就是关键字。然后通过数组s的字符串与前面定义l数组的字符串一一比较,输出所对应的种别码。

posted on 2016-10-13 07:58  204罗德广  阅读(142)  评论(6编辑  收藏  举报