编译原理 词法分析程序
来源:互联网 发布:导航触摸屏校正软件 编辑:程序博客网 时间:2024/05/29 18:47
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#define KEYWORD_NUM 9typedef struct {int code;char* value[20];} Tuple;const char keyword[KEYWORD_NUM][20] = { "if", "else", "int", "for", "while", "do", "return", "break", "continue" };bool is_keyword(char* str){for (int i = 0; i < KEYWORD_NUM; i++){if (strcmp(keyword[i], str) == 0){return true;}}return false;}int main(){// char filename[20];// printf("Input A Filename: ");// scanf("%s", filename);FILE* fp = fopen("Code.txt", "r");if (fp == NULL){printf("Open File Error\n");exit(0);}char buffer[20];int cursor = 0;char c;Tuple tuples[100];int num = 0;while (!feof(fp)){c = fgetc(fp);if (isalpha(c)){buffer[cursor++] = c;c = fgetc(fp);while (isalpha(c) || isdigit(c)){buffer[cursor++] = c;c = fgetc(fp);}buffer[cursor] = '\0';cursor = 0;fseek(fp, -1, SEEK_CUR);if (is_keyword(buffer)){tuples[num].code = 1;strcpy((char*)tuples[num++].value, buffer);}else{tuples[num].code = 2;strcpy((char*)tuples[num++].value, buffer);}}else if (isdigit(c)){buffer[cursor++] = c;c = fgetc(fp);while (isdigit(c)){buffer[cursor++] = c;c = fgetc(fp);}buffer[cursor] = '\0';cursor = 0;fseek(fp, -1, SEEK_CUR);tuples[num].code = 3;strcpy((char*)tuples[num++].value, buffer);}else if (c == '='){buffer[cursor++] = c;c = fgetc(fp);if (c == '='){buffer[cursor++] = c;}else{fseek(fp, -1, SEEK_CUR);}buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == '+'){buffer[cursor++] = c;buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == '-'){buffer[cursor++] = c;buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == '*'){buffer[cursor++] = c;c = fgetc(fp);if (c == '*'){buffer[cursor++] = c;}else{fseek(fp, -1, SEEK_CUR);}buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == '/'){buffer[cursor++] = c;buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == '>'){buffer[cursor++] = c;c = fgetc(fp);if (c == '='){buffer[cursor++] = c;}else{fseek(fp, -1, SEEK_CUR);}buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == '<'){buffer[cursor++] = c;c = fgetc(fp);if (c == '='){buffer[cursor++] = c;}else{fseek(fp, -1, SEEK_CUR);}buffer[cursor] = '\0';cursor = 0;tuples[num].code = 4;strcpy((char*)tuples[num++].value, buffer);}else if (c == ','){buffer[cursor++] = c;buffer[cursor] = '\0';cursor = 0;tuples[num].code = 5;strcpy((char*)tuples[num++].value, buffer);}else if (c == '('){buffer[cursor++] = c;buffer[cursor] = '\0';cursor = 0;tuples[num].code = 5;strcpy((char*)tuples[num++].value, buffer);}else if (c == ')'){buffer[cursor++] = c;buffer[cursor] = '\0';cursor = 0;tuples[num].code = 5;strcpy((char*)tuples[num++].value, buffer);}// printf("%c", c);}for (int i = 0; i < num; i++){printf("< %d, %s >\n", tuples[i].code, tuples[i].value);}fclose(fp);fp = fopen("middle_code.txt", "w");for (i = 0; i < num; i++){fprintf(fp, "<%d, %s>\n", tuples[i].code, tuples[i].value);}fclose(fp);return 0;}
阅读全文