Форум программистов, компьютерный форум 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
16844 / 5265 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
25.08.2009, 22:07     Пишем свой интерпретатор языка BASIC
Цитата Сообщение от #pragma Посмотреть сообщение
Вот про конвертер в Си немного не понял идею,как именно это будет работать.
Ну... для начала надо понять, как это на уровне промежуточного представлнеия выглядит. Далее понимаешь, как это представление интерпретируется, а дпльше попросту сгенерить код, который по большому счёту работает в терминах Value и Variable. Суть в том, что из исходника на одном языке получается исходник на другом. В идеальном варианте исходник на Си для того примера будет вот таким:

C
1
2
3
4
5
6
#include <stdio.h>
int A, B;
int main (void)
{
  A = B + 1;
}
Но для генерации "хорошего" исходника в сложных случаях придётся долго ковыряться. А "плохой" исходник генерится чуть ли не с полпинка. Но ты пока этим не заморачивайся. Просто имей в виду, что такое возможно. Со временем сам начнёшь понимать. Чем-то похожее состояние у тебя было в самом начале, когда тебе совсем непонятно было, как вообще можно сделать хоть что-то работающее, содержашие LET'ы, PRINT'ы, IF'ы. Но в какой-то момент ты это просёк и с ходу сделал сразу кучу всего. ВОт и здесь будет тоже самое: поначалу всё дико непонятно и сложно, а потом вдруг поймёшь и дальше всё попрёт. Просто здесь начальный период понимания будет побольше, ибо сама постановка задачи стала сложнее.

Это при том, что я себе совершенно чётко представлял, что должно быть, у меня ушло на это неделя времени. Так что твои два месяца - это вполне нормально. Как говорится "тяжело в учении..."

Цитата Сообщение от #pragma Посмотреть сообщение
Мне теперь остаётся только наблюдать за твоим ходом написания,и потихоньку ковырять свой вариант.
Ну... особо наблюдать больше не придётся Просто перед отпуском на работе резких телодвижений лучше не делать, а потому вот занялся интерпретатором. Да и если дальше меня не заломает, то следить там уже особо будет нечего - вся необходимая база уже вроде бы как отписана. Тебе нужно только понять принцип, по которому построено промежуточное представление и его интерпретация. Возможно не так просто будет разобрать тот низкоуровневый код на Си, когда привык работать с высокоуровневыми конструкциями типа списка и т.п.

Так что если есть вопросы - задавай, до вечера пятницы я ещё тут.

Добавлено через 1 час 18 минут
По поводу генерации кода на Си (Си++). Относительно совтояния твоих исходников из поста #86

Допустим, имеем исходник на бэйсике:

PureBasic
1
2
3
4
5
6
7
8
9
DIM INT A
DIM INT B
DIM INT C
LET A=10
LET B=11
LET C=A*A + B*B
PRINT "A=",A
PRINT "B=",B
PRINT "C=",C
А теперь в каталоге с твоими исходниками создадис вот такой вот файлик Си++

C++
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
// Эта шапка необходима, чтобы исходник нормально компилился и слинковался
#include <iostream>
#include <fstream>
using std::ifstream;
using std::cout;
using std::endl;
using std::cerr;
ifstream source;
#include "parser.cpp"
#include "error_handler.cpp"
 
// А с этого места "полезный" код
#include "value_class.cpp"
#include "variable_class.cpp"
 
int main (void)
{
  // DIM INT A
  Variable A ("A", INT);
 
  // DIM INT B
  Variable B ("B", INT);
 
  // DIM INT C
  Variable C ("C", INT);
 
  // LET A=10
  A = Value("10",INT);
 
  // LET B=11
  B = Value("11",INT);
 
  // LET C=A*A + B*B
  C = (A.GetValue() * A.GetValue()) + (B.GetValue() * B.GetValue());
 
  // PRINT "A=",A
  cout << "A=" << A.GetValue() << endl;
 
  // PRINT "B=",B
  cout << "B=" << B.GetValue() << endl;
 
  // PRINT "C=",C
  cout << "C=" << C.GetValue() << endl;
 
  return 0;
}
Этот исходник отлично компиляется и получается бинарник. Который при исполнении печатает то же самое, что и интерпретатор

Код
$ g++ a.cc
$ ./a.out 
A=10
B=11
C=221
При этом, работая через промежуточное представлени (да и можно для такого простого исходника напрямую), твой интерпретатор сам может сгенерить этот самый код на Си++. В итоге получаешь некую систему, когда на входе имеешь текст на бэйсике, а на выходе имеешь бинарный файл. Код по скороксти получается неэффективный, но зато техническая реализация в таком виде в разы проще, чем писать собственный компилятор с бэйсика

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