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

    1.词法分析程序的功能:

    输入:所给文法的源程序字符串。

    输出:二元组构成的序列。

    其中:syn为单词种别码。

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


    2.符号与种别码的对照表

    3.词法规则

    <字母> A a|b|c|……y|z
    <数字>
    A→1|2|3|4|5|6|7|8|9
    S→A|SA|SA0
    <整数常数>
    A→1|2|3|4|5|6|7|8|9
    S→A|SA|SA0
    <标识符>
    A→a|b|c|……y|z
    B→0|1|2|3|4|5|6|7|8|9
    S→A|SB
    <关键字>
    S→if|else|while|do|for|int|char|……
    <运算符>
    S→+|-|x|/|=|#|<|>|<=|>=|:=
    <界符>
    S→(|)|,|;|.

    4.源代码与调试程序截图

    #include <stdio.h>    
    #include <string.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");    
                        //getch();    
                        return 0;    
                    break;    
                        
                    default:     
                    printf("( %-10s%5d )\n",token,syn);    
                    break;    
                }    
            }while(syn!=0);    
        return 0;//getch();    
     }    
        
    void scaner()    
    {      
        sum=0;    
        for(m=0;m<8;m++)    
            token[m]=0;    
            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';    
    } 
  • 相关阅读:
    jsonp与promise封装
    屏幕自适应问题与tab状态更新数据问题
    插槽问题
    如何封装一个组件
    在url中带参数
    vuex中mapGetters,mapActions
    eventBus 与 this.$emit
    4.24上交作业
    4.23作业
    4.17作业
  • 原文地址:https://www.cnblogs.com/chenguangpeng/p/5925044.html
Copyright © 2011-2022 走看看