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

Тема в разделе "C/C++/C#", создана пользователем Kauperwud, 20 дек 2011.

  1. Kauperwud

    Kauperwud Гость

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

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

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

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (C++):
        ...
    FILE *file = stdout;
    while (b != 1)
    ...
     
Загрузка...

Поделиться этой страницей