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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились: Введите элемент и номер. вот сам код: #ifndef __list_h #define __list_h #include <iostream>
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!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо исправить код, чтоб фигуры не исчезали за экран (т.е. 640х460) и были компактным набором, т.е. двигались неменяя своего положения относительно друг друга и стукаясь об стенку экрана меняли свое...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) программа не округляет это число (в большую сторону) до 4. Перелопатил тонны литературы, но пропустил или не нашёл этого, большая просьба написать функцию которая могла бы это делать, или способ какой.
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; var d:array of longint; procedure c; var a,b,i:longint; подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
25.08.2009, 16:12     Пишем свой интерпретатор языка BASIC
Для такого кода

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]);
}
Т.е. получается очень неоптимально написанный код, построенный на тех же структурах, на которых работает интерпретатор (чтобы два раза не писать). Но тем не менее код будет рабочим, дальше его моджо будет скомпилить и получить настоящий бинарник, который будет работать.

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