• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Написать Интерпретатор Программного Языка(собственного)+оплата

  • Автор темы Kauperwud
  • Дата начала
K

Kauperwud

Здраствуйте!
Ребят, кто хорошо разбирается в C++ помогите пожалуйста с реализацией данного задания!!!
Пожалуйста, очень надо. сроки поджимают.

Есть готовый код, но там считывается код с клавиатуры и записывается в фаил.
Как мне сделать, чтобы считывался код с клавиатуры и сразу исполнялся?

Задание
Написать интерпретатор программного языка (далее называемого В.*) Программа должна считывать код на языке В.* с клавиатуры и исполнять этот код

Синтаксис языка:
• Программная строка начинается с символа «:» (двоеточие), строка с комментарием
начинается с символа «-» (минус).
• Строка может содержать только одну операцию.
• Переменные не декларируются заранее, их тип определяется при первом использовании.
• Типы данных $ – строка, % – число с плавающей запятой (вводятся с запятой а не с
точкой), @ – целое число.
• Переменные могут быть преобразованы временно в другой тип, если при их последующем
использовании они обозначены как другой тип данных.
• Каждый тип данных должен уметь преобразовываться в другой (например число в строку,
или целое число в число с плавающей запятой).
• Операция > может означать:
◦ Ввод с клавиатуры, если она является первой после :
◦ Вывод на экран, если она является последней на строке.
◦ Запись данных из переменной или константы слева в переменную с права.
• Константы пишутся в одинарных кавычках (вне зависимости от типа данных).
• Операция & – это операция «наоборот»
◦ переписывает строку в обратном порядке символов в ней
◦ с численными переменными она меняет их значение с положительного на
отрицательное
• Программа заканчивается строкой начинающейся с «^».
Пример программы на языке :
- Это пример программы
- считываем строку с клавиатуры
:>$a
- переписываем строку задом на перёд
:&a
- выводим строку на экран
:a>
- записываем строку из двух пробелов в переменную s
:' '>$s
- выводим пробелы на экран
:s>
- записываем длину строки a в чело-численную переменную b
:#a>@b
- выводим значение b на экран
:b>
- записываем число 1,8 в переменную с плавающей запятой
:'1,8'>%c
- выводим на экран
:c>
- выводим на экран переменную преобразованную в целое число
:mad:c>
^
Код:
#include <iostream>
#include <string>
using namespace std;

void type(char *c, int number_begin, int number_end, FILE *file);
void name(char *c, int number_begin, int number_end, FILE *file);
int check_1(char *c, int number_begin, int number_end);
int check_2(char *c, int number_begin, int number_end, int number, char *mas_name);
char write_name(char *c, int number_begin, int number_end, int number);

int main()
{
char c[50];
int b=1, help, number=0;
char *mas_name = new char [number];
FILE *file;
while (b == 1)
{
cout << "Vvedite adres faila: ";
cin.getline(c, 50);
if ((file = fopen(c, "w")) == 0)
{
cout << "Povtorite vvod" << "\n";
b=1;
}
else
b=0;
}
fputs("#include <iostream>\n" "#include <string>\n" "using namespace std;\n\n" "int main()\n" "{\n", file); 
do
{
cout << "VVedite comandy: ";
cin.getline(c, 50);
b = strlen(c);
if (b == 1 && c[0] == '^')
{
fputs("system (\"PAUSE\");\n" "return 0;\n" "}", file);
return 0;
}
else
{
if (c[0] != '-')
{
if (c[0] == ':')					
{
if (c[1] == '>')
{
help = check_1(c, 1, b);
if (help == 1)
{
type(c, 1, b, file);
fputs(" ", file);
name(c, 1, b, file);
help = check_2(c, 1, b, number, mas_name);
if (help == 1)
{
fputs("[50]", file);
}
fputs (";\n", file);
}
fputs("cin >> ", file);
name(c, 1, b, file);
fputs (";\n", file);
number = number + 1;
mas_name[number] = write_name(c, 1, b, number);
}
else if (c[b-1] == '>')
{
help = check_1(c, 1, b);
if (help == 1)
{
name(c, 1, b, file);
fputs(" = (", file);
type(c, 1, b, file);
fputs(") ", file);
name(c, 1, b, file);
fputs(";\n", file);
}
else
{
fputs("cout << ", file);
name(c, 0, b, file);
fputs(";\n", file);
}
}
else
{
for (int i=1; i<b; i++)
{
if (c[i] == '>')
{
int number_c = i;
help = check_2(c, number_c, b, number, mas_name);
if (help == 0)
{
help = check_1(c, i, b);
if (help == 1)
{
type(c, number_c, b, file);
fputs(" ", file);
}
name(c, i, b, file);
number = number + 1;
mas_name[number] = write_name(c, 1, b, number);
fputs(" = ", file);
for (int i=1; i<b; i++)
{
if (c[i] == '#')
{
fputs("strlen(", file);
name(c, i, number_c, file);
fputs(");\n", file);
}
else if (c[i] == '\'')
{
i=i+1;
while (c[i] != '\'')
{
if (c[i] == ',')
{
fputs(".", file);
i=i+1;
}
else
{
fprintf(file, "%c", c[i]);
i=i+1;
}
}
fputs(";\n", file);
}
else
{
help = check_2(c, 1, b, number, mas_name);
if (c[i] == '&' && help == 0)
{
fputs("- ", file);
name(c, i, number_c, file);
fputs(";\n", file);
}
}
}
}
else
{
help = check_1(c, number_c, b);
if (help == 1)
{
for (int i=1; i<b; i++)
{
if (c[i] == '\'')
{
type(c, number_c, b, file);
fputs(" ", file);
name(c, number_c, b, file);
fputs("[50];\n", file);
fputs("strcpy(", file);
name(c, number_c, b, file);
fputs(", \"", file);
i=i+1;
while (c[i] != '\'')
{
fprintf(file, "%c", c[i]);
i=i+1;
}
fputs("\");\n", file);
}
}
}
else
{
for (int i=1; i<b; i++)
{
if (c[i] == '\'')
{
fputs("strcpy(", file);
name(c, number_c, b, file);
fputs(", \"", file);
i=i+1;
while (c[i] != '\'')
{
fprintf(file, "%c", c[i]);
i=i+1;
}
fputs("\");\n", file);
}
}
}
}
}
}
help = 0;
for (int i=1; i<b; i++)
{
if (c[i] == '>')
{
help = 1;
}
}
if (help == 0)
{
help = check_2(c, 1, b, number, mas_name);
if (c[1] == '&' && help == 1)
{
fputs("for (int i=0; i<=((strlen(", file);
name(c, 1, b, file);
fputs(")/2)-1); i++)\n" "{\n", file);
fputs("int buf = ", file);
name(c, 1, b, file);
fputs("[i];\n", file);
name(c, 1, b, file);
fputs("[i] = ", file);
name(c, 1, b, file);
fputs("[strlen(", file);
name(c, 1, b, file);
fputs(")-i-1];\n", file);
name(c, 1, b, file);
fputs("[strlen(", file);
name(c, 1, b, file);
fputs(")-i-1] = buf;\n}\n", file);
}
else
{
help = check_1(c, 1, b);
if (help == 1)
{
type(c, 1, b, file);
fputs(" ", file);
name(c, 1, b, file);
fputs(";\n", file);
number = number + 1;
mas_name[number] = write_name(c, 1, b, number);
}
}
}
}
}
}
else
{
cout << "Error! (An invalid command)" << "\n";
}
}
}
while (1);
fclose(file);
system ("PAUSE");
return 0;
}
void type(char *c, int number_begin, int number_end, FILE *file)
{
for (int i=number_begin; i<number_end; i++)
{
if (c[i] == '@')
{
fputs("int", file);
}
if (c[i] == '$')
{
fputs("char", file);
} 
if (c[i] == '%')
{
fputs("float", file);
}
}
}
void name(char *c, int number_begin, int number_end, FILE *file)
{
for (int i=number_begin; i<=number_end; i++)
{
if (c[i] == '@' || c[i] == '$' || c[i] == '%')
{
i=i+1;
while (c[i] != '>' && i < number_end)
{
fprintf(file, "%c", c[i]);
i=i+1;
}
}
else if (c[i] == ':' || c[i] == '#' || c[i] == '&' || c[i] == '>')
{
if (c[i+1] == '@' || c[i+1] == '$' || c[i+1] == '%')
{
continue;
}
else
{
i=i+1;
while (c[i] != '>' && i < number_end)
{
fprintf(file, "%c", c[i]);
i=i+1;
}
}
}
}
}
int check_1(char *c, int number_begin, int number_end)
{
int help = 0;
for (int i=number_begin; i<number_end; i++)
{
if (c[i] == '@' || c[i] == '$' || c[i] == '%')
{
help = 1;
}
}
return help;
}
int check_2(char *c, int number_begin, int number_end, int number, char *mas_name)
{
int help = 0;
for (int i=number_begin; i<number_end; i++)
{
if (c[i] == '$')
{
help = 1;
}
}
char str[20];
int k=0;
for (int i=number_begin; i<=number_end; i++)
{
if (c[i] == '$')
{
i=i+1;
while (c[i] != '>' && i < number_end)
{
str[k] = c[i];
i=i+1;
k=k+1;
}
str[k] = NULL;
}
else if (c[i] == ':' || c[i] == '#' || c[i] == '&' || c[i] == '>')
{
if (c[i+1] == '$')
{
continue;
}
else
{
i=i+1;
while (c[i] != '>' && i < number_end)
{
str[k] = c[i];
i=i+1;
k=k+1;
}
str[k] = NULL;
}
}
}
for (int i=1; i<=number; i++)
{
if (mas_name[i] == *str)
{
help=1;
}
}
return help;
}
char write_name(char *c, int number_begin, int number_end, int number)
{
char str[20];
int k=0;
for (int i=number_begin; i<number_end; i++)
{
if (c[i] == '$')
{
i=i+1;
while (c[i] != '>' && i < number_end)
{
str[k] = c[i];
i=i+1;
k=k+1;
}
str[k] = NULL;
}
}
return *str;
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!