• 实验一


        实验一、词法分析实验

    商业软件工程    陈楚洪   201506110137 

    一、        实验目的

         设计、编制、调试一个词法分析程序,用来识别单词,加深对词法分析原理的理解。

    二、        实验内容和要求

         该程序要实现的是一个单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。并依次输出各个单词的内部编码及单词符号自身值。

    保留字:begin、end、if、while、var等。

    标识符:表示各种名字,如常量名、变量名等。

    常数:3、25、3.1515、TURE等。

    运算符:+、—、*、/、#、<、<=、>、>=、:=

    分界符:逗号,、分号、括号等。

    各种单词符号对应的种别码:

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    :

    17

    if

    2

    :=

    18

    then

    3

    20

    while

    4

    <=

    21

    do

    5

    <> 

    22

    end

    6

    23

    l(l|d)*

    10

    >=

    24

    dd*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

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

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

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

    可执行程序名:×××.exe

    1. 2.      原理分析及流程图

    主要总体设计问题。

    (包括存储结构,主要算法,关键函数的实现等)

     
       

    3.源代码:

    #include<stdio.h>                  /*定义I/O库所用的某些宏和变量*/

    #include<string.h>               /*定义字符串库函数*/

    #include<conio.h>                  /*提供有关屏幕窗口操作函数*/

    #include<ctype.h>                  /*分类函数*/

    char prog[80]={''},

         token[8];                     /*存放构成单词符号的字符串*/

    char ch;

    int syn,                           /*存放单词字符的种别码*/

          n,

        sum,                           /*存放整数型单词*/

        m,p;                           /*p是缓冲区prog的指针,m是token的指针*/

    char *rwtab[6]={"begin","if","then","while","do","end"};

    void scaner(){

        m=0;

        sum=0;

        for(n=0;n<8;n++)

            token[n]='';

        ch=prog[p++];

        while(ch==' ')

            ch=prog[p++];

        if(isalpha(ch))    /*ch为字母字符*/

        {

            while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/

               {

               token[m++]=ch;

               ch=prog[p++];}

            token[m++]='';

            ch=prog[p--];

            syn=10;

            for(n=0;n<6;n++)

                if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/

                      {

                    syn=n+1;

                    break;}}

        else

            if(isdigit(ch))    /*ch是数字字符*/

               {

                while(isdigit(ch))    /*ch是数字字符*/

                      {

                    sum=sum*10+ch-'0';

                    ch=prog[p++];}

                ch=prog[p--];

                syn=11;}

            else

                switch(ch)

               {

                    case'<':m=0;token[m++]=ch;ch=prog[p++];

                            if(ch=='>'){

                                syn=21;

                                token[m++]=ch;}

                            else if(ch=='='){

                                syn=22;

                                token[m++]=ch;}

                                else{

                                     syn=20;

                                     ch=prog[p--];}

                            break;

                    case'>':m=0;token[m++]=ch;ch=prog[p++];

                            if(ch=='='){

                                syn=24;

                                token[m++]=ch;}

                            else{

                                syn=23;

                                ch=prog[p--];}

                            break;

                 case':':m=0;token[m++]=ch;ch=prog[p++];

                         if(ch=='='){

                             syn=18;

                             token[m++]=ch;}

                         else{

                             syn=17;

                             ch=prog[p--];}

                         break;

                 case'+':syn=13;token[0]=ch;break;

                 case'-':syn=14;token[0]=ch;break;

                 case'*':syn=15;token[0]=ch;break;

                 case'/':syn=16;token[0]=ch;break;

                 case'=':syn=25;token[0]=ch;break;

                 case';':syn=26;token[0]=ch;break;

                 case'(':syn=27;token[0]=ch;break;

                 case')':syn=28;token[0]=ch;break;

                 case'#':syn=0;token[0]=ch;break;

                 default:syn=-1;}}

    main()

    {

    p=0;

        printf("please input string: ");

        do {

               ch=getchar();

               prog[p++]=ch;

           }while(ch!='#');

        

    p=0;

        do{

            scaner();

            switch(syn){

                case 11: printf("(%d,%d) ",syn,sum);break;

              //  case -1: printf(" ERROR; ");break;

                default: printf("(%d,%s) ",syn,token);

    }

    }while(syn!=0);

        //getch();

    }

    4.实验结果

     

    四、        实验总结

    通过存储输入的字符串,用循环的方式逐个提取出来与种别码比较,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Luogu P1020 导弹拦截
    MySQL事务隔离级别和实现原理
    classloader加载class文件的原理和机制
    Spring Bean的生命周期只有这四个阶段
    Spring 源码:BeanFactory 简介以及它 和FactoryBean的区别
    开闭原则——面向对象设计原则
    HashSet的实现原理
    装饰器模式(装饰设计模式)详解
    在java中,HashMap 或者HashTable,它们的键值被放满了,会出现什么情况?
    Mybitis 批量插入实践
  • 原文地址:https://www.cnblogs.com/cch-1007/p/5958436.html
Copyright © 2020-2023  润新知