• 词法分析


    #include<stdio.h>     //包含库所用的某些宏和变量

    #include<stdlib.h>    //包含库

    #include<string.h>    //包含字符串处理库

    #define _KEY_WORD_END "waiting for your expanding"     //定义关键字结束标志

    typedef struct 

    {

             int typenum; 

             char * word;

    }WORD;

    char input[255];      //输入换缓冲区

    char token[255]="";   //单词缓冲区

    int p_input;          //输入换缓冲区指针

    int p_token;          //单词缓冲区指针

    char ch;              //当前所读的字符

    char *rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};        //C语言关键字

    WORD * scaner();    //词法扫描函数,获得关键字

    main()

             int over=1; 

             WORD *oneword; 

             oneword=(WORD *)malloc(sizeof(WORD)); 

             printf("输入源代码(以 #结束):");   //读入源程序字符串到缓冲区,以#结束,允许多行输入   

             scanf("%[^#]s",input);                        

             p_input=0; 

             printf("Your words:%s ",input);

             while(over<1000&&over!=-1) 

            {  

                   oneword=scaner();  

                   printf("单词符号:%s 种别码:%d ",oneword->word,oneword->typenum);  

                   over=oneword->typenum; 

            }

    }


    char m_getch()

                ch=input[p_input];

                p_input=p_input+1;

                return (ch);

    }

    //去掉空白字符

    void getbc()

            while(ch==' '||ch==10)

           { 

            ch=input[p_input]; 

            p_input=p_input+1; 

            }

    }

    //拼接单词

    void concat()

            token[p_token]=ch; 

            p_token=p_token+1;

            token[p_token]='';

    }

    //判断是否字母

    int letter()

             if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

                     return 1; 

             else

                     return 0;

    }

    //判断是否数字

    int digit()

             if(ch>='0'&&ch<='9')  

                     return 1; 

             else  

                     return 0;

    }

    //检索关键字表格

    int reserve()

    {

            int i=0; 

            while(strcmp(rwtab[i],_KEY_WORD_END)) 

            {  

                   if(!strcmp(rwtab[i],token))  

                  {   

                            return i+1; 

                  } 

                   i=i+1;

            } 

            return 10;

    }

    //回退一个字符

    void retract()

           p_input=p_input-1;

    }
    WORD *scaner()

             WORD *myword ;

             myword=(WORD *)malloc(sizeof(WORD));

             myword->typenum=10;

             myword->word=""; 

             p_token=0; 

             m_getch(); 

             getbc();

             if(letter()){ 
                 while(letter()||digit()){    

                     concat();   

                     m_getch();

                 }  

                 retract();     

                 myword->typenum=reserve();   

                 myword->word=token;

                 return(myword); 

             }
             else if(digit()){  

                 while(digit()) 

                       {  

                               concat(); 

                               m_getch(); 

                         } 

                          retract(); 

                          myword->typenum=20;  

                          myword->word=token; 

                          return(myword);

                 } 

                  else 

                 { 

                          switch(ch)  

                         {  
                          case '+':  

                              myword->typenum=13;      

                              myword->word="+";   

                              return(myword);    
                             
                              break; 

                          case '-':  

                              myword->typenum=14; 

                              myword->word="-";        

                              return(myword);   

                              break;  

                          case '*':  

                              myword->typenum=15;    

                              myword->word="*";  

                              return(myword); 

                              break;

                          case '/':   

                              myword->typenum=16; 

                              myword->word="/";  

                              return(myword);  

                              break; 

                          case ':':  m_getch();

                              if(ch=='='){

                                  myword->typenum=18;    

                                  myword->word=">=";    

                                  return(myword);

                              }

                              retract();  

                              myword->typenum=17;   

                              myword->word=":";  

                              return(myword); 

                              break;

                          case '<':  m_getch();

                              if(ch=='='){

                                  myword->typenum=21;    

                                  myword->word="<=";    

                                  return(myword);
                               
                              }
                             
                              else if(ch=='>'){

                                  myword->typenum=22;    

                                  myword->word="<>";    

                                  return(myword);
                                 
                              }

                              retract(); 

                              myword->typenum=20;  

                              myword->word="<";  

                              return(myword); 

                              break;
                                 
                          case '>':  m_getch();

                              if(ch=='='){

                                  myword->typenum=24;    

                                  myword->word=">=";    

                                  return(myword);

                              }

                              retract();
                                 
                              myword->typenum=23;    

                              myword->word=">";    

                              return(myword);     

                              break;
                             
                          case '=':  

                              myword->typenum=25;    

                              myword->word="=";  

                              return(myword); 

                              break;

                          case ';': 

                              myword->typenum=26;  

                              myword->word=";"; 

                              return(myword);   

                              break;
                                 
                          case '(':  

                              myword->typenum=27;    

                              myword->word="(";  

                              return(myword); 

                              break;

                          case ')':  

                              myword->typenum=28;    

                              myword->word=")";  

                              return(myword); 

                              break;
                         
                          case '#':  

                              myword->typenum=0; 

                              myword->word="OVER";   

                              return(myword);  

                              break;

                          default:  

                                      myword->typenum=-1;     

                                      myword->word="ERROR";  

                                      return(myword);

                                     }

                      } 

    }

  • 相关阅读:
    AIX下的ha高可用集群cluster
    触发redo写的几个条件
    Oracle Internals Notes Redo Write Triggers
    触发写Redo&nbsp;Log的条件
    [Oracle]理解undo表空间
    MySQL数据备份之mysqldump使用
    Orabbix无法获取Oracle DB Size和DB Files Size的解决方法
    ES5和ES6那些你必须知道的事儿(三)
    ES5和ES6那些你必须知道的事儿(二)
    ES5和ES6那些你必须知道的事儿(一)
  • 原文地址:https://www.cnblogs.com/iamCarson/p/4901321.html
Copyright © 2020-2023  润新知