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

    实验目的:编制一个词法分析程序

    实验要求:

    输入:源程序字符串

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

    词法分析程序的主要任务:

    1.对字符串表示的源程序 

    2.从左到右进行扫描和分解

    3.根据词法规则

    4.识别出一个一个具有独立意义的单词符号

    5.以供语法分析之用

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

    单词符号

    种别码

    单词符号

    种别码

    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

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    char charp[80];                   //存放所有输入的字符
    char token[8];                   //单词自身字符串
    char ch;                        //单个字符
    char*rwtab[6]={"begin","if","then","while","do","end"};
    int sym;                      //sym:单词种别码
    int s=0,m=0,i=0,w=0,sum=0;   //sum:整型常数
    void analyze()
    {
        for(i=0;i<8;i++)
    
            token[i]=NULL;
            ch=charp[s++];
        while(ch==' ')
        {
            ch=charp[s];
            s++;
        }
        if((ch>='0'&&ch<='9'))  //分析数字
        {
            while((ch>='0'&&ch<='9'))
                {
                    sum=sum*10+ch-'0';
                    ch=charp[s++];
    
                }
                s--;
                sym=11;
                if(sum>32767)
                    sym=-1;
        }
    
        else if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))   //分析标识符或者变量名
        {
            while((ch>='0'&&ch<='9')||(ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
            {
                token[m++]=ch;
                ch=charp[s++];
            }
                token[m++]='\0';
                s--;
                sym=10;
                for(i=0;i<6;i++)   //将识别出来的字符和已定义的标示符作比较,
                if(strcmp(token,rwtab[i])==0)
                {
                    sym=i+1;
                    break;
                }
        }
        else switch(ch)//分析其他字符
        {
         case'<':m=0;token[m++]=ch;
            ch=charp[s++];
            if(ch=='=')
            {
                sym=21;
                token[m++]=ch;
            }
            else if(ch=='>')
            {
                sym=22;
                token[m++]=ch;
            }
            else
            {
                sym=23;
                s--;
            }
            break;
        case'>':m=0;token[m++]=ch;
           ch=charp[s++];
           if(ch=='=')
           {
               sym=24;
               token[m++]=ch;
           }
           else
           {
               sym=20;
               s--;
           }
           break;
        case':':m=0;token[m++]=ch;
           ch=charp[s++];
           if(ch=='=')
           {
               sym=18;
               token[m++]=ch;
           }
           else
           {
               sym=17;
               s--;
           }
           break;
            case'*':
                sym=13;token[0]=ch;
                break;
            case'/':
                sym=14;token[0]=ch;
                break;
            case'+':
                sym=15;token[0]=ch;
                break;
            case'-':
                sym=16;token[0]=ch;
                break;
            case'=':
                sym=25;token[0]=ch;
                break;
            case';':
                sym=26;token[0]=ch;
                break;
            case'(':
                  sym=27;token[0]=ch;
                  break;
            case')':
                sym=28;token[0]=ch;
                break;
            case'#':
                sym=0;token[0]=ch;
                break;
            case'\n':
                sym=-2;
                break;
            default:
                sym=-1;
                break;
    
        }
    
    }
    
    void main()
    {
        printf("请输入一串字符串(以输入#号作为结束):");
        do
        {
            ch=getchar();    //ch获取键盘输入的字符
            charp[i++]=ch;   //把字符一个个放在charp数组中
        }while(ch!='#');      //输入以#号键结束
    do
    {
      analyze();   //识别单词
      switch(sym)
      {
    
        case -1:
            printf(" 错误 : w %d!\n",w);
            break;
        case -2:
            w=w++;break;
        case 11:
            printf("(%d,%d)\n",sym,sum);
            break;
        default:
            printf("(%d,%s)\n",sym,token);
            break;
      }
    }while(sym!=0);
    }
  • 相关阅读:
    如何保存PDF、Word和Excel文件到数据库中
    C#添加PDF页眉——添加文本、图片到页眉
    C#数组,List,Dictionary的相互转换
    C#向PPT文档插入图片以及导出图片
    【CTSC2018】暴力写挂(边分治,虚树)
    【WC2018】通道(边分治,虚树,动态规划)
    【BZOJ2870】最长道路(边分治)
    【WC2018】州区划分(FWT,动态规划)
    【LOJ#6029】市场(线段树)
    【Hihocoder1413】Rikka with String(后缀自动机)
  • 原文地址:https://www.cnblogs.com/candyxue/p/5937267.html
Copyright © 2011-2022 走看看