#c
Вопрос:
Я разрабатывал простой лексический анализатор на языке Си, код для которого приведен ниже.
int isOperator(char str) { if(str == ' ' || str == '-' || str == '*' || str == '/' || str == '=') return 1; return 0; } char *subString(char *str, int k, int j) { int i = 0; char *subStr =(char*)malloc(sizeof(char) * (k - j 2)); while(k lt;= j) { subStr[i ] = str[k ]; } subStr[k] = ''; return subStr; } int identify(char *str, int k) { int j = k, len, i; while(str[j] != ' ' amp;amp; str[j] != '') { j ; } char *subStr = subString(str, k, j - 1); if(!strcmp(subStr, "int") || !strcmp(subStr, "while") || !strcmp(subStr, "float") || !strcmp(subStr, "for")) { printf("%s (Keyword)n", subStr); return (j - k); } else { len = strlen(subStr); for(i = 0; i lt; len; i ) if(!isdigit(subStr[i])) { printf("%s (Identifier)n", subStr); return (j - k); } printf("%s (Integer)n", subStr); return (j - k); } return 0; } void analyzeTokens(char *str) { int i = 0; while(i lt; strlen(str)) { if(str[i] == ' ') i ; else if(isOperator(str[i])) { printf("%c (Operator)n", str[i]); i ; } else { i = i identify(str, i) 1; } } } void main() { char *buffer, *subStr; char buff[255]; int len, temp; size_t buffsize = 0; ssize_t read; FILE *fp; fp = fopen("~/lexin.txt", "r"); if(fp == NULL) printf("File does not exists"); else { while((read = getline(amp;buffer, amp;buffsize, fp)) != -1) { printf("nParsing line %sn", buffer); analyzeTokens(buffer); } } }
Если я напрямую предоставляю анализируемый текст вместо чтения из .txt
файла, вывод отображается как ожидалось, но проблема возникает, когда я читаю несколько строк из файла. Вывод, когда я читаю из файла lexin.txt
, выглядит следующим образом
Parsing line int a = b 4 int (Keyword) a (Identifier) = (Operator) b (Identifier) (Operator) 4 (Identifier) Parsing line a = b * 3 a (Identifier) = (Operator) b (Identifier) * (Operator) 3 (Integer)
lexin.txt
int a = b 4 a = b * 3
Каждая строка за вычетом последней анализируется неправильно ( 4 помечены как идентификатор ) со странной новой строкой, разделяющей 4
и (Identifier)
. Я убедился, что файл не содержит ненужных пробелов и вкладок. Мы будем признательны за любую помощь в решении этой проблемы.