static void extract (SCAN * scan, char buffer [], size_t length) { scanuntil (scan, gcsSpace ".,;"); copytoken (scan, buffer, length); noversion (buffer); return; }
int main(int argc, char *argv[]) { FILE *fin, *fout; if(argc == 1) { // 错误:无输入文件 error_handle(file_exist_error); return 0; } //打开源程序文件 fin = fopen(argv[1],"r"); if(fin == NULL) { open_file_error(); return 0; } //打开文件保存词法分析结果 fout = fopen("temp.txt","w"); if(fout == NULL) { create_file_error(); return 0; } // 建立关键字的哈希表 int i; for(i = 0; i < 38; ++i) createHash(word[i],HashTable); //从源程序文件中取字符进行处理 char ch; unsigned char flag = 1; char str[100]; char *buffer = str; buffer = fgets(str,100,fin); char *begin,*forward; int length; char *end; while(!feof(fin)) { begin = forward = buffer; length = strlen(buffer); end = buffer + length; row = 1; // 记录当前的列号 while(forward < end) { begin = forward; ch = *forward; if( check_ch(ch)==0 ) { error_handle(illegal_ch_error); ++forward; ++row; // 移到下一列 continue; } if((ch == TAB || ch == NEWLINE || ch == SPACE)) { ++forward; ++row; begin = forward; continue; } if(isalpha(ch)) { ++forward; ++row; ch = *forward; // if( check_ch(ch) ==0) // { // error_handle(illegal_ch_error); // --forward; // copytoken(begin,forward); // ++forward; // print_word(token); // continue; // } while(isalnum(ch)&&(++row, ++forward != end)) { ch = *forward; } --forward; --row; copytoken(begin,forward); ++forward; ++row; print_word(token); } else if(isdigit(ch)) { ++forward; ++row; ch = *forward; // if(check_ch(ch)==0) // { // error_handle(illegal_ch_error); // } while(isdigit(ch)&&(++row, ++forward != end)) { ch = *forward; // if( check_ch(ch) == 0) // error_handle(illegal_ch_error); } --forward; --row; copytoken(begin,forward); ++forward; ++row; print_digit(token); } else { switch(ch) { case '*': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(MULTI,0)\n"); break; } if(ch == '*') printf("(EXP,0)\n"); else { --forward; --row; printf("(MULTI,0)\n"); } ++forward; ++row; break; case ':': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(COLON,0)\n"); break; } if(ch == '=') printf("(ASSIGN,0)\n"); else { --forward; --row; printf("(COLON,0)\n"); } ++forward; ++row; break; case '<': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(LT,0)\n"); break; } if(ch == '=') { printf("(LE,0)\n"); } else if(ch == '>') { printf("(NE,0)\n"); } else { --forward; --row; printf("(LT,0)\n"); } ++forward; ++row; break; case '=': printf("(EQ,0)\n"); ++forward; ++row; break; case '>': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(GT,0)\n"); break; } if(ch == '=') printf("(GE,0)\n\n"); else { --forward; --row; printf("(GT,0)\n"); } ++forward; ++row; break; case '+': printf("(PLUS,0)\n"); ++forward; ++row; break; case '-': printf("(MINUS,0)\n"); ++forward; ++row; break; case '/': printf("(REIV,0)\n"); ++forward; ++row; break; case ',': printf("(COMMA,0)\n"); ++forward; ++row; break; case ';': printf("(SEMIC,0)\n"); ++forward; ++row; break; case '(': printf("(LR_BRAC,0)\n"); int flag = 0; // 用于判断括号是否匹配 char* temp; temp = forward; while(++temp != end) { if(ch == '(') ++flag; else if(ch == ')') --flag; if(flag < 0) break; ch = *temp; } if(flag != 0) error_handle(par_not_match); ++forward; ++row; break; case ')': printf("(RR_BRAC,0)\n"); ++forward; ++row; break; case '[': printf("(LS_BRAC,0)\n"); ++forward; ++row; break; case ']': printf("(RS_BRAC,0)\n"); ++forward; ++row; break; case '\'': // printf("(Q_MARK,0)\n"); ++forward; ++row; ch = *forward; while(ch != '\''&& (++row, ++forward != end)) { ch = *forward; if(!check_ch(ch)) error_handle(illegal_ch_error); // ++forward; } // --forward; if(ch == '\'') { copytoken(begin, forward); // 输出字符串 print_str(token); } else if(forward == end) { error_handle(quo_not_match); // 引号不匹配 } ++forward; ++row; break; case '.': printf("(F_STOP,0)\n"); ++forward; ++row; break; case '^': printf("(CAP,0)\n"); ++forward; ++row; break; default: // error_handle(); break; } } } // 再从文件中读入一行数据 buffer = fgets(str,100,fin); ++line; } //关闭源程序和结果文件 fclose(fin); fclose(fout); return 0; }