Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Пишем свой интерпретатор языка BASIC - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились:...
C++ Здравствуйте! Не могу поместить class в один файл с программой. file.hpp #include "Cat.hpp" // здесь классы "2)" Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() { http://www.cyberforum.ru/cpp-beginners/thread41186.html
Массивы строк C++
Привет всем! Задан массив строк. Как узнать который символ встечаетса найбольшое количество раз в етом массиве?
C++ вывод на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер
Please, help me!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) ...
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; ... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,203
Записей в блоге: 27
25.08.2009, 16:12
Для такого кода

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
' Простая арифметика
LET A1 = 10
LET A2 = 100
LET B1 = A1 + 5 * A2 - 50
PRINT B1 ' expected 460
 
' Неявные преобразования типов
LET A1 = 1 + 2.7
PRINT A1 ' expected 3
LET A1 = 2.7 + 1
PRINT A1 ' expected 3.7
 
' Ситуация, когда по тексту переменная сначала появляется в правой части
' присваивания, а потом влевой (т.е. типа якобы сначала использование,
' а потом запись). Однако по управлению (в run-time) всё нормально:
' сначала идёт запись, и только потом чтение
' Заодно и проверка работы IF'а
LET C = 0
WHILE C < 2 DO
  IF C = 1 THEN
    LET B = SHAMAN + 1 ' сюда попадаем только на второй итерации цикла
  ELSE
    LET SHAMAN = 999 ' а сюда - на первой
  END_IF
  LET C = C + 1
END_WHILE
PRINT SHAMAN ' expected 999
PRINT B      ' expected 1000
 
' Считаем сумму чисел от 1 до 100
LET COUNT=0
LET SUM=0
WHILE COUNT < 100 DO
  LET COUNT=COUNT+1
  LET SUM=SUM+COUNT
END_WHILE
PRINT COUNT ' expected 100
PRINT SUM   ' expected 5050
 
' Работа с одномерным массивом
DIM A(4)
LET C=0
WHILE C < 4 DO
  LET A(C+1) = (C+1) * (C+1)
  LET C = C + 1
END_WHILE
PRINT A(1) ' expected 1
PRINT A(2) ' expected 4
PRINT A(3) ' expected 9
PRINT A(4) ' expected 16
 
' Работа с многомерным массивом
DIM AA(2,3,4)
LET COUNT = 100
LET I1 = 0
WHILE I1 < 2 DO
  LET I2 = 0
  WHILE I2 < 3 DO
    LET I3 = 0
    WHILE I3 < 4 DO
      LET COUNT = COUNT + 1
      LET AA(I1+1,I2+1,I3+1) = COUNT
      LET I3 = I3 + 1
    END_WHILE
    LET I2 = I2 + 1
  END_WHILE
  LET I1 = I1 + 1
END_WHILE
PRINT COUNT     ' expected 124
PRINT AA(2,1,2) ' expected 114
 
' Операция сложения над строками
DIM R$(3)
LET R$(1) = "ERT"
LET R$(2) = "zxcvbnm"
LET R$(3) = "1234567"
LET A$ = ""
LET C = 0
WHILE C < 3 DO
  LET A$ = A$ + R$(C+1)
  LET C = C + 1
END_WHILE
PRINT A$
выдаём вот такой результат

Код
-> 460
-> 3
-> 3.700000
-> 999
-> 1000
-> 100
-> 5050
-> 1
-> 4
-> 9
-> 16
-> 124
-> 114
-> ERTzxcvbnm1234567
Добавлено через 8 минут
Вот ещё что забыл сказать. При работе в качестве интерпретирующей части можно повесить модуль, который вместо интерпретации будет генерить код на Си. Например, для исходника

PureBasic
1
2
LET A=B+1
PRINT A
На выходе будем получать код (условно говоря, реально есть свои ньюансы)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Это всё файлы, являющиеся исходниками интерпретатора */
#include "value.c"
#include "variable.c"
#include "interp.c"
 
var_Variable_t A;
var_Variable_t B;
 
main()
{
  A.vals[0] = val_ValueBinOp (VAL_OP_ADD, B.vals[0], val_CreateNumericInt (1));
  val_UserPrintValue (A.vals[0]);
}
Т.е. получается очень неоптимально написанный код, построенный на тех же структурах, на которых работает интерпретатор (чтобы два раза не писать). Но тем не менее код будет рабочим, дальше его моджо будет скомпилить и получить настоящий бинарник, который будет работать.

По такой технологии сейчас поддерживаются некоторые устаревшие языки программирования. Особенно у военных, которые ни за что не пойдут на то, чтобы переписать какие-то военные программы, написанные много лет назад, потому как писали их гении того времени, а потому в коде разобраться невозможно. И гораздо более надёжным вариантом оказывается написать интерпретатор или конвертер в Си
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru