Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2019, 00:06   #1
Joesidorov
Пользователь
 
Регистрация: 09.12.2015
Сообщений: 26
По умолчанию лексический анализатор на С++

Всем привет!

помогите пожалуйста справиться с кодом.
скенер неправильно читает литералы (смотри литералы в прикрепленный документ).

Код:
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include <string>
#include <iomanip>

using namespace std;

string mas[1000][2];
int num = 0;
int isKeyword(char buffer[])
{
	char keywords[22][12] = { "constructor", "const", "array", "var", "Begin", "inherited", "for", "do", "new", "ad", "of", "char", "Integer", "PView", "TRect", "Assign", "or", "to", "do", "and", "not", "End" };
	int i, flag = 0;
	for (i = 0; i < 22; i++)
	{
		if (strcmp(keywords[i], buffer) == 0)
		{
			flag = 1;
			break;
		}
	}
	return flag;
}



int main()
{
	char ch, buffer[50] = "\0", buffer2[3] = "\0";
	ifstream fin("programLD1.txt");
	int i = 0, j = 0, k = 0;
	char delimiter[] = "[],:=()^;:#.'";
	bool isdelim, isliteral = false;
	char DoubleD = 0;
	char DD = 0;
	if (!fin.is_open())
	{
		cout << "error while opening the file\n";
		exit(0);
	}
	while (!fin.eof())
	{
		ch = fin.get();
		isdelim = false;
		if (!ch == '=' || !ch == '>')
			DoubleD = 0;
		if (!isdigit(ch))
			DD = 0;
		if (ch == '\'')
		{
			if (isliteral)
			{
				buffer[j] = '\0';
				j = 0;
				mas[num][0] = "Literal";
				mas[num][1] = buffer;
				num++;
			}
			isliteral = !isliteral;
			isdelim = true;
		}
		if (!isalnum(ch) && !(ch == ' ' || ch == '\n') && !isliteral)
		{
			isdelim = true;
		}
		if (isdigit(DD) && isdigit(ch))
		{
			buffer2[k] = '\0';
			k = 0;
			num--;
			mas[num][1].clear();
			buffer2[k++] = DD;
			buffer2[k++] = ch;
			mas[num][0] = "Number";
			mas[num][1] = buffer2;
			num++;
		}
		else if (isdigit(ch) && !(isdelim) && !isliteral)
		{
			DD = ch;
			mas[num][0] = " Number";
			mas[num][1] = ch;
			num++;
		}
		else
			if ((ch == ' ' || ch == '\n' || isdelim) && (j != 0) && !isliteral)
			{
				buffer[j] = '\0';
				j = 0;
				if (isKeyword(buffer) == 1)
				{
					mas[num][0] = "KeyWords";
					mas[num][1] = buffer;
					num++;
				}
				else
				{
					mas[num][0] = "ID";
					mas[num][1] = buffer;
					num++;
				}
			}
		if ((DoubleD == ':'&& ch == '=') || (DoubleD == '<'&& ch == '>'))
		{
			buffer2[k] = '\0';
			k = 0;
			num--;
			mas[num][1].clear();
			buffer2[k++] = DoubleD;
			buffer2[k++] = ch;
			mas[num][0] = "Delimiter";
			mas[num][1] = buffer2;
			num++;
		}
		else if (isdelim == true && ch != EOF)
		{
			if (ch == ':' || ch == '<')
				DoubleD = ch;
			isdelim = false;
			for (i = 0; i < 13; ++i)
			{
				if (ch == delimiter[i])
				{
					mas[num][0] = "Delimiter";
					mas[num][1] = ch;
					num++;
					isdelim = true;
				}
			}
			if (isdelim == false)
			{
				mas[num][0] = "Error";
				mas[num][1] = ch;
				num++;
			}
		}
		if ((isalpha(ch) && !isdelim) || (ch == ' ' && isliteral) || (ch == '-' && isliteral))
		{
			buffer[j++] = ch;
		}
	}
	fin.close();
	cout << '\n' << endl;
	for (int i = 0; i < num; i++)
	{
		cout << mas[i][0] << setw(20) << mas[i][1] << setw(25) << left << endl;
	}
	system("pause");
	return 0;
}
Вложения
Тип файла: txt programLD1.txt (422 байт, 139 просмотров)
Тип файла: doc Lab1.doc (131.0 Кб, 26 просмотров)
Joesidorov вне форума Ответить с цитированием
Старый 29.01.2019, 00:24   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Для начала советую использовать хотя бы С++ string для упрощения кода.

А проблема-то в чем именно?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.02.2019, 11:46   #3
Joesidorov
Пользователь
 
Регистрация: 09.12.2015
Сообщений: 26
По умолчанию

нечитает литералы: ‘%’789/456*123-0.=+
Joesidorov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лексический анализатор ercin1991 Фриланс 2 08.12.2011 11:39
Лексический анализатор ercin1991 Общие вопросы C/C++ 4 05.12.2011 16:34
Лексический анализатор, С++ holy_0dmin Фриланс 4 03.12.2011 02:36
Лексический анализатор С++ EniOk Помощь студентам 1 06.12.2009 15:43