Как можно исправить недочёты в моём лексическом анализаторе?

Реализую лексический анализатор. Но есть косяки, и не получается от них избавиться. Например, цифра 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 Переменная

Также хотелось бы сделать так, чтобы при вводе неизвестного символа, программа также писала, что это не известный символ.


Ответы (0 шт):