zoukankan      html  css  js  c++  java
  • 词法分析

    实验一、词法分析实验

    专业  商软二班    姓名  罗肖凤   学号  201504040262

    一、        实验目的

    通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言进行扫描过程中将其分解为各类单词的词法分析方法。

      

    二、        实验内容和要求

    (1)    输入:源程序字符串。

    (2)    输出:二元组(种别,单词本身)。

    (3)   选择高级语言(C语言),编制它的词法分析程序

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

     

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

    可执行程序名:

    词法分析.exe

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

                         

    待分析的简单词法

    (1)    关键字:begin  if  then  while  do  end  所有的关键字都是小写。

    (2)    运算符和界符::= + - * / < <= > >= ; ( ) #

    (3)    空格有空白、制表符和换行符组成

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

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    17

    if

    2

    : =

    18

    then

    3

    20

    while

    4

    <> 

    21

    do

    5

    <=

    22

    end

    6

    23

    letter (letter | digit)*

    10

    >=

    24

    digit digit*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

    主要总体设计问题。

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

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

    主要功能:输入:所给文法的源程序字符串。

              输出:二元组(syn,token或sum)构成的序列。

              其中:syn为单词种别码;

                    token为存放的单词自身字符串;

                    sum为整型常数

    主要程序:

    #include <stdio.h>  
    #include <string.h>  
    #include<stdlib.h>  
    char prog[80],token[8],ch;  
    int syn,p,m,n,sum;  
    char *rwtab[6]={"begin","if","then","while","do","end"};  
       
    void scaner();  
      
    void main()  
    {  
        p=0;  
        printf("\n please input a string(end with'#'):\n");  
          
        do{  
                scanf("%c",&ch);  
                prog[p++]=ch;  
        }while(ch!='#');  
          
        p=0;  
        do{  
                scaner();  
                switch(syn)  
                {  
                    case 11:  
                        printf("( %-10d%5d )\n",sum,syn);  
                    break;  
                      
                    case -1:  
                        printf("you have input a wrong string\n");    
                        getchar(); 
                   exit(0);  
                      
                    default:   
                    printf("( %-10s%5d )\n",token,syn);  
                    break;  
                }  
            }while(syn!=0);
        getchar();
     }  
      
    void scaner()  
    {    
        sum=0;  
          
        for(m=0;m<8;m++)  
            token[m++]=NULL;  
          
            ch=prog[p++];  
            m=0;  
              
        while((ch==' ')||(ch=='\n'))  //如果字符是空格或者回车,跳过
            ch=prog[p++];  
          
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  //可能是标示符或者变量名或数字 
         {   
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
                //找到一个变量名或者关键字,直到遇到空格为止
           
            {
                token[m++]=ch;  
                ch=prog[p++];  
            }  
              
            p--;  
            syn=10;  
      
            for(n=0;n<6;n++)  
            if(strcmp(token,rwtab[n])==0)  
            {   
                syn=n+1;  
                break;  
            }  
         }  
         else if((ch>='0')&&(ch<='9'))  
         {   
            while((ch>='0')&&(ch<='9'))  
            {  
                sum=sum*10+ch-'0';  
                ch=prog[p++];  
            }  
            p--;  
            syn=11;  
        }  
        else   
        {  
            switch(ch)  
            {  
            case '<':token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=22;  
                    token[m++]=ch;  
                }  
                else  
                {    
                    syn=20;  
                    p--;  
                }  
            break;  
      
            case '>':token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=24;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=23;  
                    p--;  
                }  
            break;  
      
            case '+':token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='+')  
                {  
                    syn=17;  
                    token[m++]=ch;  
                }  
                else  
                {  
                    syn=13;  
                    p--;  
                }  
            break;  
      
            case '-':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='-')  
                {  
                    syn=29;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=14;  
                    p--;  
                }  
            break;  
      
            case '!':  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=21;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=31;  
                    p--;  
                }  
            break;  
      
            case '=':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=25;  
                    token[m++]=ch;  
                }  
                else  
                {  
                    syn=18;  
                    p--;  
                }  
            break;  
      
            case '*':  
                syn=15;  
                token[m++]=ch;  
            break;  
      
            case '/':  
                syn=16;  
                token[m++]=ch;  
            break;  
      
            case '(':   
                syn=27;  
                token[m++]=ch;  
            break;  
      
            case ')':  
                syn=28;  
                token[m++]=ch;  
            break;  
      
            case '{':   
                syn=5;  
                token[m++]=ch;  
            break;  
      
            case '}':   
                syn=6;  
                token[m++]=ch;  
            break;  
      
            case ';':  
                syn=26;  
                token[m++]=ch;  
            break;  
      
            case '\"':  
                syn=30;  
                token[m++]=ch;  
            break;  
      
            case '#':   
                syn=0;  
                token[m++]=ch;  
            break;  
      
            case ':':  
                syn=17;  
                token[m++]=ch;  
            break;  
      
            default:  
                syn=-1;  
            break;  
            }  
        }  
            token[m++]='\0';  
    } 
    1. 4.     运行结果及分析

    四、        实验总结

      由于是第一次做编译,所以此次实验对于我来说挺难的,我通过上网摸索以及跟同学讨论渐渐的了解了如何设计、编制并调试词法分析程序,加深对词法分析原理的理解。

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序
    BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化
    BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS
    BZOJ_2726_[SDOI2012]任务安排_斜率优化+二分
    BZOJ_1406_[AHOI2007]密码箱_枚举+数学
    哈希表(Hash table)
    算法分析方法之平摊分析(Amotized Analysis)
    数据库视图功能的使用
    不基于比较的排序算法:Counting-sort和Radix-sort
    QuickSort(快速排序)的JAVA实现
  • 原文地址:https://www.cnblogs.com/XiaoFengLuo/p/5971018.html
Copyright © 2011-2022 走看看