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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 20:13   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию Выделение лексем

Написать программу, использующую механизм управления при помощи таблиц (управление осуществляется данными!).
Нужно выделить следующие типы лексем:
Целое число со знаком
Вещественное число со знаком
Скобка

Ориентировочная схема работы главного цикла программы:
1. Ввод символа из файла
2. Переход автомата в новое состояние в зависимости от введенного символа и текущего состояния
3. Вывод символа в выходной файл, либо другое действие (в зависимости от задания)

Перевод автомата в новое состояние (п. 2) и выбор действия для выполнения (п. 3) могут быть реализованы несколькими способами. От способа реализации зависит максимальный балл за выполнение работы:
1. Выбор действия и состояния с помощью ветвлений (if, switch) – 60%
2. Выбор состояния с помощью таблицы (массива), а действия с помощью ветвления – 80%
3. Выбор состояния и действия с помощью таблиц (для действий используются указатели на функции) – 100%

Чуть позже узнал, что есть очень важные ограничения на реализацию:
программа может запоминать только текущее состояние и последний введенный символ. Не должны использоваться никакие дополнительные массивы или переменные для хранения введенных данных.


После ограничений пришлось удалить весь код и набросать этот:
Код:
#include <iostream>
#include <conio.h>
#include <fstream>

const enum CLASS {
	C_NUMBER, C_SIGN, C_BRACE, C_DOT, C_OTHER
};

const enum STATE {
	S_BEGIN, S_INTEGER, S_REAL, S_ERROR_1, S_ERROR_2, S_BRACE
};

using namespace std;

CLASS ReturnClass(char X) { // функция для определения класса
	if ((X >= '0') && (X <= '9'))
		return C_NUMBER;
	if (X == '-' || X == '+')
		return C_SIGN;
	if (X == '.')
		return C_DOT;
	if ((X == '(') || (X == ')') || (X == '[') || (X == ']') || (X == '{') ||
		(X == '}'))
		return C_BRACE;
	return C_OTHER;
}

char* ReturnAnalyze(STATE X) { // функция для возвращения анализа статуса
	switch (X) {
	case S_BEGIN:
		return "Error";
	case S_INTEGER:
		return "Integer with sign";
	case S_REAL:
		return "Real with sign";
	case S_ERROR_1:
		return "Error";
	case S_ERROR_2:
		return "Error";
	case S_BRACE:
		return "Brace";
	}
	return "";
}

int Table[6][5] = { // таблица переходов
	{1, 4, 5, 3, 0}, {1, 0, 0, 2, 0}, {2, 0, 0, 0, 0}, {2, 0, 0, 0, 0},
	{1, 0, 0, 2, 0}, {1, 0, 5, 2, 0}};

int main() {
	FILE *fInput;
	ofstream fOut;
	int State = 0;
	char X = ' ';
	fInput = fopen("C:\\input.txt", "rt"); // открываем файл в режиме чтения
	fOut.open("C:\\output.txt", ios_base::out); // файл для записи
	if (fInput && fOut) { // если файл открыт успешно
		// пока не конец файла посимвольно читаем
		while ((X = fgetc(fInput)) != EOF) {
			if (X != '\n') {
				// определяем состояние
				State = Table[State][ReturnClass(X)];
				cout << "Char: " << X << " Code: " << (int)
					X << " State: " << State << " Analyze: " << ReturnAnalyze((STATE)State) << endl;
			}
		}
	}
	else
		fOut << "Error: File could not be read";
	fOut.close(); // закрываем файл
	fclose(fInput); // закрываем файл
	cout << "Press any key to close...";
	getch();
	return 0;
}
Помогите разобраться, как мне полностью выделить лексему, например, несколько 123 - как целое со знаком, а не по отдельности, как 1 - целое со знаком, 2 - целое со знаком, 3 - целое со знаком.
Возможно Я Быдлокодер ©.

Последний раз редактировалось Stilet; 03.12.2014 в 20:47.
t2skler вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование лексем (ошибки) Lifeda92 Общие вопросы C/C++ 2 03.05.2014 22:27
assembler распознование лексем bulterier Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 19.01.2013 12:35
составить словарь лексем bestnicer Помощь студентам 12 29.05.2012 14:02
Разбивка на лексемы и состовление из лексем строк Corvette Общие вопросы C/C++ 3 28.04.2012 13:47
сравнение лексем MasterSporta Общие вопросы C/C++ 2 13.02.2012 15:50