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

    #include<stdio.h>
    #include<string.h>//strcmp()用于比较两个字符串
    #include<conio.h>//getch()
    #define max 200
    char pro[max], lin[20];
    int  n,i,syn;
    char   *word[6]={ "begin", "if" , "then", "while", "do" ,"end" };   // 关键字,特殊标识符
    char   ch ;
    scaner( )

        int j=0;
        for ( n=0; n<20; n++ ) 
            lin[n]=NULL;                                //临时数组初始化
        ch=pro[i++];                                    //读取字符串
        while (ch==' ')                                 //判断,跳过空字符  
            ch=pro[i++];       //读取整个单词
        if  ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))   //判断是否是字母或数字
        { 
            if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))                   //判断标示符和特殊关键字                      
            {
                lin[j++]=ch;
                ch=pro[i++];   //pro[i++]空,关键字
                while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))//判断标识符
                { 
                    lin[j++]=ch;
                    ch=pro[i++];   
                }
                lin[j]='';   //结束标志,回车
                i--;
                syn=10;        //单词种别码
                for (n=0;n<6 ;n++ )
                    if(strcmp(lin,word[n])==0) //查找关键字表是否符合
                    {      
                        syn=n+1;
                        break ;
                    }
            }
            else               //判断数字
            {  
                while (ch>=48&&ch<=57)
                { 
                    lin[j++]=ch;
                    ch=pro[i++];  
                }
                i--;
                lin[j]='';
                syn=11;
            }
        }
        else           //判断其它符号
        {
                        //判断<,<=,<>
            if(ch=='<') 
            {
                lin[j++]=ch;
                ch=pro[i++];
                if (ch=='>')
                {  
                    syn=21;
                    lin[j++]=ch;
                    lin[j]='';
                }
                else if(ch=='=')
                {  
                    syn=22;
                    lin[j++]=ch;
                    lin[j]='';
                }
                else 
                { 
                    syn=20;
                    lin[j]='';
                    i--;
                }
            } 
                       ///判断>,>=
            else if(ch=='>')
            {
                lin[j++]=ch;
                ch=pro[i++];
                if (ch=='=')
                {
                    syn=24;
                    lin[j++]=ch;
                    lin[j]='';
                }
                else 
                { 
                    syn=23;
                    lin[j]='';
                    i--;
                }
            }
                       //判断 :,:=
            else if(ch==':')
            {
                lin[j++]=ch;
                ch=pro[i++];
                if (ch=='=')
                { 
                    syn=18;
                    lin[j++]=ch;
                    lin[j]='';
                }
                else 
                { 
                    syn=17;
                    lin[j]='';
                    i--;
                } 
            }
                      ///判断其它符号
            else if(ch=='+')
            {
                syn=13; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch=='-')
            {
                syn=14; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch=='*')
            {
                syn=15; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch=='/')
            {
                syn=16; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch=='=')
            {
                syn=25; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch==';')
            {
                syn=26; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch=='(')
            {
                syn=27; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch==')')
            {
                syn=28; 
                lin[j++]=ch;
                lin[j]='';
            }
            else if(ch=='#')
            {
                syn=0; 
                lin[j++]=ch;
                lin[j]='';
            }
            else
                syn=-1;      
    }
    return syn;
    }
    void read()   //定义从文件读入数据函数
    {
        int k;
        for(k=0;k<max-1;k++)
        {
            scanf("%c",&pro[k]);
        }
        pro[k]='';
    }
    void main()
    {      
        int i=0 ;
       printf( "Please input source code: " );
       do{
           ch=getchar();//读入字符串
           pro[i++]=ch;
       }while(ch!='#');//将所读字符串存入数组pro[],直到遇到#
       i=0;

       do
       {     
           scaner();
           switch(syn)
           { 
           case 11:   printf ("(%d,%s) ",syn,lin); 
               break;
           case -1:  printf("错误符号 ");
               break;     
           default:   printf ("(%d,%s) ",syn,lin);
           }
       } while (syn!=0);
       getch();
    }

  • 相关阅读:
    开发基于键值对形式的语言管理器LauguageManager
    基于Json(键值对)配置文件的配置管理器
    Unity换装效果
    技能冷却效果的制作
    c#中的反射
    委托和事件的区别
    字典
    有序列表
    链表

  • 原文地址:https://www.cnblogs.com/queenjuan/p/4882325.html
Copyright © 2011-2022 走看看