⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 词法分析器(编译原理) Java语言词法分析器的设计与实现
💻 C
📖 第 1 页 / 共 3 页
字号:
     ch = character; 
     line1++;
     line2 = line1;
     
     while ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
           inkey[i++] = ch; 
           ch = readchar(); 
           if(i == 12) break; 
     }
     line1 = line1 + i - 1;
     inkey[i] = '\0'; 
     count2 = i;
     if(i < 13) {
          if(ch == '$' || ch == '_' || (ch >= '0' && ch <= '9') ) {
               strcpy(ininden,inkey);      //遇到标识符的字母结束,则为标识符 
               character = ch; 
               identifier(); 
               untread();
          }
          else {
              for(i = 0; i < 50; i++) {
                    if(strcmp(inkey,keyword[i]) == 0) {
                        if( (strcmp(inkey,"true") == 0) || (strcmp(inkey,"false") == 0)) { 
                            sp = "0x105";
                        }
                        else { sp = "0x103";}
                        strcpy(flow.attribute,sp);
                        flow.site = i;
                        total++; 
                        linetotal++; 
                        writefile();
                        untread();                //回退一个单词 
                        break;
                    }
              } 
              if(i == 50) {                       //不是关键字,而是标识符 
                   character = ch;
                   strcpy(ininden,inkey);
                   identifier(); 
                   untread();
              }          
          }               
     }               
     else {
          sp = inkey;
          untread(); 
          error(sp); 
     }
     clean(); 
}
//扫描数字 
void number() {
     char ch,*sp;
     int i = 0; 
     int realnum = 0;      //计算'.'和'e','x'的个数,为零则为整数,超过一个则为错误的单词 
     int havechar = 0;     //判断是否以字母结束 
     ch = character; 
     line1++;
     line2 = line1;
     
     if(ch == '0') {
         innum[i++] = ch; 
         ch = readchar();
         if(ch == 'x' || ch == 'X') {          //为十六进制数 
               innum[i++] = ch; 
               ch = readchar(); 
               while ( (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')) {
                   innum[i++] = ch; 
                   ch = readchar(); 
               }
         }
         else if(ch >= '0' && ch <= '9'){     //'0'后面跟数字为错误单词 
               innum[i++] = ch;
               sp = innum;
               error(sp); 
               return ;
         }           
     }
     else { 
         while ( (ch >= '0' && ch <= '9') || ch == '.' || ch == 'e' ||ch == 'E' || ch == 'L' || ch == 'F' || ch == 'l' || ch == 'f') {
               if(ch == 'e' || ch == 'E' || ch == '.') { 
                     realnum++; 
               }
               innum[i++] = ch; 
               switch (realnum) {
                      case 0: 
                          if(ch == 'L' || ch == 'l') {
                               havechar = 1; 
                          }
                          else if(ch == 'F' || ch == 'f'){   //整数不以'F','f'结尾 
                               i--; 
                          }
                          break;
                      case 1: 
                          if(ch == 'F' || ch == 'f') {
                               havechar = 1; 
                          }
                          else if(ch == 'L' || ch == 'l') {  //实数不以'L','l'结尾 
                               i--; 
                          }
                          break;
                      default : {           //超过两个'e','E','.'为错误单词 
                          sp = innum;
                          if(innum[0] == '.' && (innum[1] == 'e' || innum[1] == 'E' || innum[1] == '.')) { break;}
                          error(sp); 
                          return ;
                      }
               }   
               ch = readchar();        //
         }
     }
     if(innum[0] == '.' && (i == 1 || innum[1] == 'e' || innum[1] == 'E' || innum[1] == '.')) {
         sp = "0x11d";                         //单独一个点号,或者点号后跟着点号,e,E 
         strcpy(flow.attribute,sp); 
         flow.site = 41;
         total++; 
         linetotal++; 
         writefile();
         clean();
         if(innum[1] == 'e' || innum[1] == 'E') {
             untread(); 
             untread();
         }
         if(i == 1) { untread();}
         return ; 
     }
     line1 = line1 + i - 1;
     innum[i] = '\0'; 
     for(i = 0; i < count5; i++) {
         if(strcmp(innum,value[i]) == 0) {      //比较看变量值是否已存在 
             if(realnum == 0) { sp = "0x107";}
             else { 
                 sp = "0x108";
             }
             strcpy(flow.attribute,sp);
             flow.site = i;
             total++; 
             linetotal++; 
             writefile();
             break;
         }
     } 
     if(i == count5) {
         strcpy(value[count5],innum); 
         if(realnum == 0) { sp = "0x107";}
         else { 
              sp = "0x108";
         } 
         strcpy(flow.attribute,sp); 
         flow.site = i;
         total++; 
         linetotal++; 
         writefile();
         count5++;
     }
     if(havechar == 0) { untread();}      //以字母结束时,最后一个字符可以被处理,就不用回退了 
     clean();      
}
//扫描注释 
void explain(int a) {
      char innote[20],ch,ch1,*sp;
      int i = 0; 
      sp = "0x101"; 
      strcpy(flow.attribute,sp);
      ch = readchar(); 
      line1++; 
      line2 = line1; 
      
      while(1) {
               line1++; 
               innote[i++] = ch;
               if(ch == ' ' || ch == '\n') {//以空格和回车符为注释中单词的结束标志,若两单词连在一起,则分辨不出 
                     if(ch == 'a') { break;} 
                     linetotal++;
                     total++; 
                     innote[i-1] = '\0'; 
                     strcpy(note[count6],innote);
                     flow.site = count6;
                     writefile(); 
                     i = 0;
                     count6++;
                     line2 = line1;
                     if(ch == '\n') { 
                           row++;
                           linetotal = 0;
                           line1 = 0;
                           if(a == 1) { break;}
                     } 
               } 
               else if(ch == '*') {
                     line2 = line1; 
                     ch = readchar();
                     line1++;
                     innote[i++] = ch;
                     if(ch == '/') {  
                           innote[i-1] = '\0'; 
                           strcpy(note[count6],innote);
                           flow.site = 2;
                           total++;
                           linetotal++;
                           writefile(); 
                           count6++; 
                           break;
                     }
               }
               if(i == 50) {
                    printf("the string is too long,please write more blank space."); 
                    exit(0) ;
               } 
               ch = readchar(); 
      }  
}
//以下几个是扫描运算符的函数 
void op1(char a) { 
     char ch,*sp; 
     int i;
     if(a == '+') { i = 0;} 
     else { i = 3;} 
     line1++;
     line2 = line1;
     ch = readchar();
                     
     if(ch == '=') { 
         flow.site = 3 + i; 
         sp = "0x110";
     } 
     else if(ch == '+' || ch == '-'){ 
         sp = "0x11c";
         flow.site = 2 + i; 
         untread(); 
     } 
     else {
         untread();
         untread();           //回退到'+'前的字符 
         untread(); 
         ch = readchar();
                              
         flow.site = 4 + i;
         if(ch == ' ' || ch == '(') {            //若是空格或左括号,则为正号 
             sp = "0x11c";
             ch = readchar();                 //跳过刚读过的字符 
             ch = readchar(); 
         }
         else {
             sp = "0x11a";
             ch = readchar();
             ch = readchar(); 
         }
     }
     strcpy(flow.attribute,sp);
     total++;
     linetotal++;
     writefile();   
} 

void op2(char a) { 
     char ch,*sp; 
     int i,j;
     switch (a){
            case '*': i = 0; break; 
            case '/': i = 2; break; 
            case '%': i = 4; break;
            case '^': i = 6; break;
            case '&': i = 8; break;
            case '|': i = 10; break;
            case '!': i = 12; break; 
     }
     line1++;
     line2 = line1;
     ch = readchar();
                     
     if(a == '/' && (ch == '/' || ch == '*')) { //为注释 
           line1++; 
           sp = "0x101"; 
           strcpy(flow.attribute,sp); 
           if(ch == '/') { 
                 flow.site = 0;
                 j = 1; 
           } 
           else { 
                flow.site = 1;
                j = 0; 
           } 
           total++;
           linetotal++;
           writefile(); 
           explain(j);
           return ;
     } 
     if(ch == '=') { 
         flow.site = 8 + i; 
         sp = "0x110";
         line1++; 
     } 
     else if(a == '&' || a == '|'){     //&&与||
             if(a == '&') { 
                  sp = "0x113";
                  flow.site = 22; 
             }
             else { 
                  sp = "0x112";
                  flow.site = 23; 
             }  
             line1++; 
     } 
     else {
         switch (a) {
                case '*':
                case '/':
                case '%': sp = "0x11b"; break;
                case '&': sp = "0x116"; break;
                case '^': sp = "0x115"; break;
                case '|': sp = "0x114"; break;
                case '!': sp = "0x11c"; break; 
         }
         flow.site = 9 + i; 
         untread();
     }
     strcpy(flow.attribute,sp);
     total++;
     linetotal++;
     writefile();   
} 

void op3(char a) { 
     char ch,*sp; 
     int i; 
     if(a == '<') { i = 6;}
     else { i = 0;} 
     line1++;
     line2 = line1;
     ch = readchar();
     line1++; 
     
     if(ch == '=') {
         sp = "0x118";
         flow.site = 25 + i;
     }
     else if(ch == '>' || ch == '<') {
             ch = readchar();
             line1++;
             if(ch == '=') {
                 sp = "0x110";
                 flow.site = 27 + i;
             }
             else if(ch == '>') {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -