• 词法分析程序


    词法分析:

    编制一个词法分析程序

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

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

    #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);
        }
    }
    

      

      

  • 相关阅读:
    Fiddler无法抓取HTTPS的问题,Fiddler证书无法安装终极解决方案,
    锤子手机做appium自动化测试时,运行脚本总是弹出警告框的问题
    jmeter4+win10+jdk1.8环境下,jmeter输入中文就卡死的问题
    jenkins构建邮件自动发送,测试邮件发送成功,构建项目邮件发送不成功的问题
    Jenkins安装部署
    Appium中wait_activity的使用以及XPATH定位
    Appium连接夜神模拟器,模拟手势点击(tap)
    Appium如何查看webview上元素
    Appium启动淘宝APP,输入搜索内容
    Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't
  • 原文地址:https://www.cnblogs.com/zhiling123/p/5925173.html
Copyright © 2020-2023  润新知