Я написал программу для анализатора lex (небольшой код), которая будет определять ключевые слова, идентификаторы и константы. Я беру строку (исходный код C как строку), а затем преобразовываю ее в слова.Программа Lexical Analyzer C для идентификации токенов
#include <stdio.h>
#include <conio.h>
#include <string.h>
char symTable[5][7] = { "int", "void", "float", "char", "string" };
int main() {
int i, j, k = 0, flag = 0;
char string[7];
char str[] = "int main(){printf(\"Hello\");return 0;}";
char *ptr;
printf("Splitting string \"%s\" into tokens:\n", str);
ptr = strtok(str, "(){};""");
printf("\n\n");
while (ptr != NULL) {
printf ("%s\n", ptr);
for (i = k; i < 5; i++) {
memset(&string[0], 0, sizeof(string));
for (j = 0; j < 7; j++) {
string[j] = symTable[i][j];
}
if (strcmp(ptr, string) == 0) {
printf("Keyword\n\n");
break;
} else
if (string[j] == 0 || string[j] == 1 || string[j] == 2 ||
string[j] == 3 || string[j] == 4 || string[j] == 5 ||
string[j] == 6 || string[j] == 7 || string[j] == 8 ||
string[j] == 9) {
printf("Constant\n\n");
break;
} else {
printf("Identifier\n\n");
break;
}
}
ptr = strtok(NULL, "(){};""");
k++;
}
_getch();
return 0;
}
С приведенным выше кодом я могу определить ключевые слова и идентификаторы, но я не смог получить результат для чисел. Я пробовал использовать strspn()
, но безрезультатно. Я даже заменил 0,1,2...,9
на '0','1',....,'9'
.
Любая помощь будет оценена по достоинству.
В чем именно заключается эта длинная цепочка логических-ИЛИ-терминов, которые должны выполняться? И почему вы проверяете значения 'int' на строку, которую вы просто (странно) скопировали из вашего' symTable [] '? Я думаю, что ['isdigit()'] (http://en.cppreference.com/w/c/string/byte/isdigit) находится в меню этой задачи. – WhozCraig
Для переносных программ не используйте файлы заголовков, которые не являются стандартными. И.Е. не используйте 'conio.h' Вместо' _getch() 'используйте это:' int ch; while ((ch = getchar())! = EOF && '\ n'! = Ch); getchar(); ' – user3629249
для удобства чтения и понимания, 1) следовать аксиоме: * только один оператор в строке и (самое большее) одно объявление переменной для каждого оператора. * 2) имена переменных должны указывать на« контент »или« использование » '(или лучше, оба). 3) при компиляции всегда включайте все предупреждения, затем исправьте эти предупреждения. 4) отдельные блоки кода (для if, else, while, do ... while, switch, case, default) через пустую строку – user3629249