码迷,mamicode.com
首页 > 其他好文 > 详细

实验一:词法分析

时间:2016-10-13 09:25:39      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

实验一、词法分析实验

专业:计算机科学与技术   姓名:罗德广  学号: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数组的字符串一一比较,输出所对应的种别码。

实验一:词法分析

标签:

原文地址:http://www.cnblogs.com/ldg-01/p/5955073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!