• 词法分析程序


    词法分析:

    编制一个词法分析程序

    对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息。

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

    #include<stdio.h>
    #include<string.h>
    char str[100];
    char take[8];//存放单词符号的字符串
    int sum;//存放整数型单词
    char ch;
    int zbm;//存放单词字符的种别码
    int i,p,m=0;//p是缓冲区str的指针,m是take的指针
    char *keyword[8]={"begin","if","then","while","do","end","l(l|d)*","dd*"};
    void scanner()//词法扫描程序
    {
    
       /* for(i=0;i<8;i++)
        {
            take[i]=NULL;
        }
        ch=str[p++];*/
        m=0;
        while(ch==' ')
        {
            ch=str[p++];
    
        }
        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标识符或者是变量名
        {
            m=0;
            while(ch>='0'&&ch<='9'||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
            {
                take[m++]=ch;
                ch=str[p++];
            }
            take[m++]='';
            p--;
            zbm=10;
            for(i=0;i<6;i++)//将识别出的字符和已定义的标符进行比较
                if(strcmp(keyword[i],take==0))
            {
                zbm=i+1;
                break;
            }
        }
        else if(ch>='0'&&ch<='9')
        {
            sum=0;
            while(ch>='0'&&ch<='9')
            {
                sum=sum*10+ch-'0';
                ch=str[p++];
            }
            p--;
            zbm=11;
        }
        else
        {
            switch(ch)
            {
                case '+':
                    zbm=13;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case '-':
                    zbm=14;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case '*':
                    zbm=15;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case '/':
                    zbm=16;
                    take[0]=ch;
                    ch=str[p++];
                    break;
    
    
                case '<':
                    m=0;
                    take[m++]=ch;
                    ch=str[p++];
                    if(ch=='>')
                    {
                        zbm=21;
                        take[m++]=ch;
                    }
                    else if(ch=='=')
                    {
                        zbm=22;
                    take[m]=ch;
                    }
                    else
                        zbm=20;
                    break;
                case '>':
                    take[0]=ch;
                    ch=str[p++];
                    if(ch=='=')
                    {
                        zbm=24;
                    take[0]=ch;
                    }
                    else
                        zbm=23;
                    break;
                case ':':
                    take[0]=ch;
                    ch=str[p++];
                    if(ch=='=')
                    {
                        zbm=18;
                    take[m++]=ch;
                    ch=str[p++];
                    }
                    else
                        zbm=17;
                    break;
    
                case '=':
                    zbm=25;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case ';':
                    zbm=26;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case '(':
                    zbm=27;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case ')':
                    zbm=28;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                case '#':
                    zbm=0;
                    take[0]=ch;
                    ch=str[p++];
                    break;
                default:
                    zbm=-1;
    
            }
        }
    }
    main()
    {
    
        int n,i;
        printf("----------------------------------------
    ");
        printf("	编制一个词法分析程序
    
    ");
        printf("	要求:
    ");
        printf("	输入:源程序字符串
    ");
        printf("	输出:二元组(种别,单词本身)
    ");
        printf("----------------------------------------
    
    ");
    
    
        printf("请输入您要输入的字符:
    ");
        do//输入一段字符串
        {
            ch=getchar();
            str[p++]=ch;
        }while(ch!='#');
        p=0;
        ch=str[0];
        if(ch>='0'&&ch<='9')
            printf("错误!
    ");
        else
        {
            do
            {
                scanner();
                switch(zbm)
                {
                case 11:
                    printf("(%d,%d)
    ",11,sum);
                    break;
                case -1:
                    printf("错误!
    ");
                    break;
                default:
                    printf("(%d,%s)
    ",zbm,take);
                }
            }while(zbm!=0);
        }
    }
    

      

      

  • 相关阅读:
    [科普]DNS相关的攻击介绍
    php过滤函数
    robots.txt 文件指南
    【转】mysql函数
    java入门篇17 -- JDBC编程
    java入门16 -- http编程
    java入门篇14 --- tcp/udp
    java入门篇13 -- 多线程
    java入门篇12 --- IO操作
    java入门篇11 --- 集合
  • 原文地址:https://www.cnblogs.com/zhiling123/p/5925173.html
Copyright © 2020-2023  润新知