Jhisong Kim Ответов: 3

Я хочу преобразовать свою программу C++ в C


Я сделал простой предсказательный парсер и попробовал его спрятать в C.
Но продолжайте цепляться за логические ошибки. Могу я попросить его о помощи?

<pre>#include<iostream>
#include<string>
#include<deque>
using namespace std;
int n, n1, n2;
int getPosition(string arr[], string q, int size)
{
	for (int i = 0; i < size; i++)
	{
		if (q == arr[i])
			return i;
	}
	return -1;
}
int main()
{
	string prods[10], first[10], follow[10], nonterms[10], terms[10];
	string pp_table[20][20] = {};
	cout << "Enter the number of productions : ";
	cin >> n;
	cin.ignore();
	cout << "Enter the productions" << endl;
	for (int i = 0; i < n; i++)
	{
		getline(cin, prods[i]);
		cout << "Enter first for " << prods[i].substr(3) << " : ";
		getline(cin, first[i]);
	}
	cout << "Enter the number of Terminals : ";
	cin >> n2;
	cin.ignore();
	cout << "Enter the Terminals" << endl;
	for (int i = 0; i < n2; i++)
	{
		cin >> terms[i];
	}
	terms[n2] = "$";
	n2++;
	cout << "Enter the number of Non-Terminals : ";
	cin >> n1;
	cin.ignore();
	for (int i = 0; i < n1; i++)
	{
		cout << "Enter Non-Terminal : ";
		getline(cin, nonterms[i]);
		cout << "Enter follow of " << nonterms[i] << " : ";
		getline(cin, follow[i]);
	}

	cout << endl;
	cout << "Grammar" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << prods[i] << endl;
	}

	for (int j = 0; j < n; j++)
	{
		int row = getPosition(nonterms, prods[j].substr(0, 1), n1);
		if (prods[j].at(3) != '#')
		{
			for (int i = 0; i < first[j].length(); i++)
			{
				int col = getPosition(terms, first[j].substr(i, 1), n2);
				pp_table[row][col] = prods[j];
			}
		}
		else
		{
			for (int i = 0; i < follow[row].length(); i++)
			{
				int col = getPosition(terms, follow[row].substr(i, 1), n2);
				pp_table[row][col] = prods[j];
			}
		}
	}
	//Display Table
	for (int j = 0; j < n2; j++)
		cout << "\t" << terms[j];
	cout << endl;
	for (int i = 0; i < n1; i++)
	{
		cout << nonterms[i] << "\t";
		//Display Table
		for (int j = 0; j < n2; j++)
		{
			cout << pp_table[i][j] << "\t";
		}
		cout << endl;
	}
	//Parsing String
	char c;
	do {
		string ip;
		deque<string> pp_stack;
		pp_stack.push_front("$");
		pp_stack.push_front(prods[0].substr(0, 1));
		cout << "Enter the string to be parsed : ";
		getline(cin, ip);
		ip.push_back('$');
		cout << "Stack\tInput\tAction" << endl;
		while (true)
		{
			for (int i = 0; i < pp_stack.size(); i++)
				cout << pp_stack[i];
			cout << "\t" << ip << "\t";
			int row1 = getPosition(nonterms, pp_stack.front(), n1);
			int row2 = getPosition(terms, pp_stack.front(), n2);
			int column = getPosition(terms, ip.substr(0, 1), n2);
			if (row1 != -1 && column != -1)
			{
				string p = pp_table[row1][column];
				if (p.empty())
				{
					cout << endl << "String cannot be Parsed." << endl;
					break;
				}
				pp_stack.pop_front();
				if (p[3] != '#')
				{
					for (int x = p.size() - 1; x > 2; x--)
					{
						pp_stack.push_front(p.substr(x, 1));
					}
				}
				cout << p;
			}
			else
			{
				if (ip.substr(0, 1) == pp_stack.front())
				{
					if (pp_stack.front() == "$")
					{
						cout << endl << "String Parsed." << endl;
						break;
					}
					cout << "Match " << ip[0];
					pp_stack.pop_front();
					ip = ip.substr(1);
				}
				else
				{
					cout << endl << "String cannot be Parsed." << endl;
					break;
				}
			}
			cout << endl;
		}
		cout << "Continue?(Y/N) ";
		cin >> c;
		cin.ignore();
	} while (c == 'y' || c == 'Y');
	return 0;
}







Надеюсь получить положительный ответ!

Что я уже пробовал:

Не загружал свои испытания, так как это не работает

jeron1

Было бы очень полезно, если бы Вы были более конкретны в своем вопросе. Каков ваш ожидаемый результат по сравнению с тем, что на самом деле происходит для данного входного сигнала. Возможно, сузить область действия до определенного фрагмента кода, с которым у вас возникли проблемы.

0x01AA

Заменять cout с чем-то вроде printf и то же самое для cin и вы закончили, я думаю...

Member 14732673

В простом c нет cout или cin. Используйте printf и scanf.
Также необходимо удалить все библиотеки c++.

0x01AA

Что происходит в случае deque не все так просто ;)

Rick York

Это C++ - у вас есть гораздо больше, чем просто логические ошибки, если вы хотите использовать его C.

3 Ответов

Рейтинг:
27

OriginalGriff

Поскольку C-это подмножество C++, которое вообще не включает классы (поскольку добавление классов к C было тем, что создало исходный C++), оно не включает строки, универсалии, стеки или любые другие тонкости, которые заставляют этот код работать вообще.

Дублирование их в C было бы сложной задачей и не привело бы к получению "хорошего кода C" в конце - это привело бы к большому, неуклюжему куску кода, который не будет хорошо работать и не будет легко обслуживаться. И это будет огромная задача.

Вместо того чтобы искать случайный код на другом языке и пытаться заставить его работать в вашей реальной цели, я настоятельно рекомендую вам перечитать свой вопрос домашнего задания и начать писать свой собственный код, чтобы выполнить его. Это будет быстрее, а также производить лучший код ...


0x01AA

Но разве код почти не C отдельно от cin/cout?

OriginalGriff

Ах, тогда ты видел и другие вещи! :смеяться:

0x01AA

Да, Сэр :-О :)

Рейтинг:
2

steveb

В этом нет абсолютно никакого преимущества


Рейтинг:
0

KarstenK

Ваш найденный код может показать вам логический поток, но "преобразование" этого (каким-то образом "украденного") кода не будет работать, потому что C++ предоставляет некоторые классы и функции, которые не "1:1 переводятся" в C.

Советы моих товарищей верны, но мне интересно, какие ошибки вы допустили?

До тех пор, пока я не порекомендую вам хороший Узнать с учебник Интересно, что он также объясняет некоторые технологии, которые вам понадобятся для решения вашей домашней работы. :-O