Как можно исправить недочёты в моём лексическом анализаторе?
Реализую лексический анализатор. Но есть косяки, и не получается от них избавиться. Например, цифра 5 выводится два раза. Один раз как "Цифра", а другой как "Переменная". Оператор присваивания выводится как "=", а должен как ":=". Подскажите, пожалуйста, как можно исправить программу.
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
using namespace std;
int isKeyword(char buffer[]) {
char keywords[5][13] = { "Var", "Begin","End","Integer","Long Integer"};
int i, flag = 0;
for (i = 0; i < 5; ++i) {
if (strcmp(keywords[i], buffer) == 0) {
flag = 1;
break;
}
}
return flag;
}
int main() {
setlocale(LC_ALL, "Russian");
char ch;
char buffer[30];
char operators[] = "+-*/";
char separators[] = ",;:()";
char assignment[3] = { ':=' };
char numeral[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
ifstream fin("d:\\1\\input.txt");
int i, j = 0;
if (!fin.is_open()) {
cout << "Ошибка при открытии файла\n";
_getch();
return 0;
}
while (!fin.eof()) {
ch = fin.get();
for (i = 0; i < 10; i++) {
if (ch == operators[i]) {
cout << ch << " Бинарный оператор\n";
} else if (ch == separators[i]) {
cout << ch << " Разделитель\n";
} else if (ch == numeral[i]) {
cout << ch << " Цифра\n";
} else if (ch == assignment[i]) {
cout << ch << " Оператор присваивания\n";
}
}
if (isalnum(ch)) {
buffer[j++] = ch;
}
else if ((ch == ' ' || ch == '\n') && (j != 0)) {
buffer[j] = '\0';
j = 0;
if (isKeyword(buffer) == 1)
cout << buffer << " Ключевое слово\n";
else
cout << buffer << " Переменная\n";
}
}
fin.close();
_getch();
return 0;
}
Файл для считавания:
Var a, b, c: Integer;
Begin
a := b + 5;
c := a * b;
End
Что получаю на выходе:
Var Ключевое слово
, Разделитель
a Переменная
, Разделитель
b Переменная
: Разделитель
c Переменная
; Разделитель
Integer Ключевое слово
Begin Ключевое слово
a Переменная
: Разделитель
= Оператор присваивания
b Переменная
+ Бинарный оператор
5 Цифра
; Разделитель
5 Переменная
c Переменная
: Разделитель
= Оператор присваивания
a Переменная
* Бинарный оператор
; Разделитель
b Переменная
Также хотелось бы сделать так, чтобы при вводе неизвестного символа, программа также писала, что это не известный символ.