mport java.io.*;    
public class Scanner {    
    class OutArr{
    String name;
    String type;
    OutArr(String n,String t){
        name=n;
        type=t;
    }
    OutArr(char n,char t){
        name=String.valueOf(n);
        type=String.valueOf(t);
    }
    OutArr(String n,char t){
        name=n;
        type=String.valueOf(t);
    }
}
     private static final String[] KEY_WORD = { 
          "enum",
        "extern",      
        "float",
        "for",
        "goto",
        "if",
        "int",
        "long",
        "return",
        "signed",
        "static", 
        "switch",
        "typedef",  
        "unsigned",
        "void",        
        "while",        
    };
    int lp=1,st=0;
    int count=0;
    char[] Inbuff=new char[240];      
    OutArr[] oa=new OutArr[1000];  
    String strToken;                
    FileReader fr;                 
    FileWriter fw;           
    public Scanner(String filename) {
        try{
         fr =new FileReader(filename);         
        }catch(IOException e){
            System.out.println("Error");
            e.printStackTrace();
        }
    }    
    FileReader Get(FileReader f){
        int k=1;
        try{  
                      do{             
                            Inbuff[k]=(char)f.read();
                            k++;
                        }while(Inbuff[k]!=(char)-1 && k<239);
        }catch(IOException e){
            System.out.println("Error");
            e.printStackTrace();
        }
        return f;
    }   
    int nextChar(int a){
        a++;
        if(a==Inbuff.length){
            Inbuff[0]=Inbuff[Inbuff.length-1];       
            fr=Get(fr);
            a=0;
        }
        return a;            
    }   
    void readOneWord()  
 {
  int len=Inbuff.length;
              System.out.println(len+"   "+lp); 
  while(Inbuff[lp]==' '||Inbuff[lp]=='\t'||Inbuff[lp]=='\n')
  {
   lp=nextChar(lp);
  } 
  st=lp;
  if(Character.isLetter(Inbuff[lp])){   
   lp=nextChar(lp);
   }
   strToken=new String(Inbuff,st,lp-st);                        
                        for(int i=0;i<16;i++)
                            if(strToken.equals(KEY_WORD[i])){
                                oa[count++]=new OutArr(strToken,"keyword");
                                break;
                            }
                            else if(i==15){
                                 oa[count++]=new OutArr(strToken, "variable");
                                 break;
                            } 
 if(Character.isDigit(Inbuff[lp])){
   int st=lp; 
   boolean isFloat=false;
   lp=nextChar(lp);
   while(lp>0 )   {if(Inbuff[lp]=='.')
    isFloat=true;
    lp=nextChar(lp);
   }
   strToken=new String(Inbuff,st,lp-st);                        
                        if(isFloat)
                            oa[count++]=new OutArr(strToken, "float_digit");                        else
                            oa[count++]=new OutArr(strToken, "int_digit");
  }  
   if(Inbuff[lp]=='\"') 
   {char endc='\"';
   lp=nextChar(lp);
   int st=lp; 
   while(lp>0 )   lp=nextChar(lp);    
   }
 strToken=new String(Inbuff,st,lp-st);
oa[count++]=new OutArr(strToken,"String");  
 switch(Inbuff[lp])
  {
  case ',':
    lp=nextChar(lp);
    oa[count++]=new OutArr(',','-');
    break;
   case ';':
    lp=nextChar(lp);
    oa[count++]=new OutArr(';','-');
    break;
   case ':':
    lp++;
    oa[count++]=new OutArr(':','-');
    break;
                        case '{':
                                lp=nextChar(lp);
    oa[count++]=new OutArr('{','-');
    break;
                        case '}':
                                lp=nextChar(lp);
    oa[count++]=new OutArr('}','-');
    break;
   case '[':
    lp=nextChar(lp);
    oa[count++]=new OutArr('[','-');
    break;
   case ']':
    lp=nextChar(lp);
    oa[count++]=new OutArr(']','-');
    break;
   case '(':
    lp=nextChar(lp);
    oa[count++]=new OutArr('(','-');
    break;
   case ')':
    lp=nextChar(lp);
    oa[count++]=new OutArr(')','-');
    break;
   case '+':
    lp=nextChar(lp);
    if(Inbuff[lp]=='+'){
     oa[count++]=new OutArr("++",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('+','-');
    }
    break;
   case '-':
    lp=nextChar(lp);
    if(Inbuff[lp]=='-'){
     oa[count++]=new OutArr("--",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('-','-');
    }
    break;
   case '*':
    lp=nextChar(lp);
    oa[count++]=new OutArr('*','-');
    break;
   case '/':
    lp=nextChar(lp);
    oa[count++]=new OutArr('/','-');
    break;
   case '%':
    lp=nextChar(lp);
    oa[count++]=new OutArr('%','-');
    break;
   case '=':
    lp=nextChar(lp);
    if(Inbuff[lp]=='='){
     oa[count++]=new OutArr("==",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('=','-');
    }
    break;
   case '>':
    lp=nextChar(lp);
    if(Inbuff[lp]=='='){
     oa[count++]=new OutArr(">=",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('>','-');
    }
    break;
   case '<':
    lp=nextChar(lp);
    if(Inbuff[lp]=='='){
     oa[count++]=new OutArr("<=",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('<','-');
    }
    break;
   case '!':
    lp=nextChar(lp);
    if(Inbuff[lp]=='='){
     oa[count++]=new OutArr("!=",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('!','-');
    }
    break;
   case '&':
    lp=nextChar(lp);
    if(Inbuff[lp]=='&'){
     oa[count++]=new OutArr("&&",'-');
                                        lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('&','-');
    }
    break;
   case '|':
    lp=nextChar(lp);
    if(Inbuff[lp]=='|'){
     oa[count++]=new OutArr("||",'-');
     lp=nextChar(lp);
                                }
    else{
     oa[count++]=new OutArr('|','-');
    }
    break;
                        default:
                               lp=nextChar(lp);}  
                                           
 }     void Out_result(){
        try{
            fw=new FileWriter("/liuzhenjian/a.txt");
            PrintWriter   output=new   PrintWriter(fw);
            for(int i=0;i<=count;i++)              
         output.println(oa[i].name+"\t"+oa[i].type+"\n");            
            count=0;
        }catch(Exception e){
            System.err.println("Error");
        }
    } 
        void Run(){            
                fr=Get(fr);
                int k=0;
               do{
                    readOneWord();
                    k++;
                    if(k==Inbuff.length)
                        k=0;
                    System.out.println(count);
                    if(count==999)                        
                    Out_result();                            
                }while (Inbuff[k] !=(char) -1); 
                try{
                    Out_result();
                    fr.close();
                    fw.close();
                }catch(IOException e){
                    System.out.println("Error");
                    e.printStackTrace();
                }
        }
        public static void main(String[] args){
            Scanner s=new Scanner("/liuzhenjian/a.txt");          
            s.Run();
        }
}