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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1509, средняя оценка - 4.80
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

20.06.2009, 20:03. Просмотров 190268. Ответов 464
Метки нет (Все метки)

*****************
Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор QBASIC.
Некоторые из самых старых версий сохранились в теме и ссылки на них будут добавлены в это сообщение,а также ссылки на другие темы,связанные с этой.

Репозиторий с проектом находится тут, там же есть возможность в браузере посмотреть историю ревизий (английский в логах весьма примитивен,комментарии и рекомендации можете писать в личку),а также скачать самый последний архив репозитория в формате .tar.gz
Если кто-то пользуется Subversion,скачать исходники можно так:
Код
svn co https://basin.svn.sourceforge.net/svnroot/basin basin
Эти темы возникли в результате моих вопросов по ходу написания:
Технический приём для формирования согласованных данных
Makefile: как с использованием gcc строить автоматические зависимости от .h файлов?
Вопрос по svn (Subversion)
Создание системы тестирования ПО.
Вопрос про разные реализации бэйсиков
Можно ли выразить порядковый номер элемента массива через индексы?
[C++] Какие флаги указать линкеру для компиляции программы?
Как можно определить переменную в файле configure.in,чтобы её можно было использовать в Makefile?
Странный SIGSEGV, или что зависит от порядка написания интерфейса класса
[C++]Можно ли как-то указать в Makefile,чтобы часть файлов компилировал компилятор C?
Альтернативная версия интерпретатора от Evg на C
Это простая реализация разбора выражений, написанная Evg на C:
Представление выражения в двоичном дереве
*****************
Первое сообщение:
*****************
Задание(Страуструп,из книги,по готовому коду): Введите программу калькулятора и заставьте её работать.Например,при вводе
C++
1
2
r = 2.5
area = pi*r*r
Программа калькулятора выведет:
C++
1
2
2.5
19.635
Получили такой код:
LexicalAnalyzer.h
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
// LexicalAnalyzer.h
#ifndef LEXICALANALYZER_H_INCLUDED
#define LEXICALANALYZER_H_INCLUDED
 
#include <cctype>
#include <string>
#include <map>
#include <iostream>
 
enum Token_value {
    NAME,       NUMBER,      END,
    PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
    PRINT = ';',ASSIGN = '=',LP = '(',  RP = ')'
};
extern Token_value curr_tok;
extern std::map<std::string,double>table;
extern int no_of_errors;
 
Token_value get_token();
 
double expr(bool);
double term (bool);
double prim (bool);
int error(const std::string&);
 
#endif // LEXICALANALYZER_H_INCLUDED

LexicalAnalyzer.cpp
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
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// LexicalAnalyzer.cpp
#include "LexicalAnalyzer.h"
 
 
std::map<std::string,double>table;
Token_value curr_tok=PRINT;
 
double expr (bool get)
{
    double left = term(get);
 
    for (;;)
        switch (curr_tok) {
            case PLUS:
                 left += term(true);
            break;
            case MINUS:
                 left-= term(true);
            break;
            default:
                 return left;
        }
}
 
double term (bool get)
{
    double left = prim (get);
 
    for (;;)
        switch (curr_tok) {
            case MUL:
                 left*=prim(true);
            break;
            case DIV:
                 if (double d = prim (true)) {
                     left /= prim (true);
                     break;
                 }
                 return error("Деление на ноль");
            default:
                 return left;
        }
}
 
double number_value;
std::string string_value;
 
double prim (bool get)
{
    if (get) get_token();
    switch (curr_tok){
        case NUMBER:{
            double& v = number_value;
            get_token();
            return v;
        }
        case NAME:{
            double& v = table[string_value];
            if (get_token()==ASSIGN) v = expr(true);
            return v;
        }
        case MINUS:
            return -prim(true);
        case LP:{
            double e = expr(true);
            if (curr_tok!=RP) return error("Ожидалась )");
            get_token();
            return e;
        }
        default:
            return error("Ожидалось первичное выражение");
    }
}
 
Token_value get_token()
{
    char ch = 0;
 
    do {
        if (!std::cin.get(ch)) return curr_tok = END;
    } while (ch!='\n'&&isspace(ch));
 
    switch (ch) {
        case 0:
             return curr_tok = END;
        case ';':case '\n':
             return curr_tok = PRINT;
        case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return Token_value(ch);
        case '0':case '1':case '2':case '3':case '4' :
        case '5':case '6':case '7':case '8':case '9':case '.':
             std::cin.putback(ch);
             std::cin>>number_value;
             return curr_tok=NUMBER;
        default:
             if (isalpha(ch)) {
                 string_value = ch;
                 while (std::cin.get(ch)&&isalnum(ch)) string_value.push_back(ch);
                 std::cin.putback(ch);
                 return curr_tok = NAME;
             }
             error ("Неправильная лексема");
             return curr_tok = PRINT;
    }
}
int no_of_errors=0;
int error (const std::string& s)
{
    no_of_errors++;
    std::cerr<<"Ошибка: "<<s<<'\n';
    return no_of_errors;
}

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// main.cpp
#include "LexicalAnalyzer.h"
 
 
int main()
{
    table["pi"]=3.1415926535897932385;
    table["e"]=2.7182818284590452354;
    while (std::cin) {
        get_token();
        if (curr_tok==END) break;
        if (curr_tok==PRINT) continue;
        std::cout<<expr(false)<<'\n';
    }
    return no_of_errors;
}

Анализатор-то работает,но конечное значение не вычисляется.Более того,если вводим
C++
1
a = 3 + 6
,то получаем "a", равное первому элементу в выражении,то есть 3.В чём логическая ошибка данной программы?С этими каскадными вызовами она слегка запутана.Уверен,что кто-то уже делал это задание.

Добавлено через 2 часа 5 минут 30 секунд
Пришлось решать влоб с дебаггером.У Страуструпа опечатка (или намеренная ошибка,что более вероятно ) Вот в этом куске кода в функции get_token():
C++
1
2
        case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return Token_value(ch);
Нехватает смены значения curr_tok,что и приводит к ошибочной работе.
C++
1
2
        case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return curr_tok=Token_value(ch);
Теперь всё пашет,всем спасибо,вопрос можно считать закрытым,но есть вопрос поважнее: В функциях prim и term возвращается int при ошибке,но ведь они имеют тип double,как вообще это работает?Происходит неявное преобразование типа,так?Мне интересно,почему Страуструп прибег к такому способу,это распространённая практика?

Добавлено через 16 минут 19 секунд
И ещё опечатка была
C++
1
2
3
                 if (double d = prim (true)) {
                     left /= d;// было left /= prim (true)
                     break;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2009, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пишем свой интерпретатор языка BASIC (C++):

Пишем свой чекер - C++
Я хочу написать свой чекер, но не знаю с чего начать? Кто знает основные принцип работы чекеров прошу объясните.

пишем свой троян с нуля - C++
Всем привет)))соглашусь, что изобретаю велосипед, но хочется сделать все своими ручками не прибегая к open source и т.п. для повышения...

Пишем свой класс, спецификатор доступа protected - C++
Всем привет! Из книги Р. Лафоре относительно спецификатора доступа protected: Далее пишется следующее: Возникает вопросы:...

Не удается откомпилировать интерпретатор М-языка - C++
Задача: взять интерпретатор М-языка на сайте http://cmcmsu.no-ip.info/2course/model.lang.parser.sample.htm и переработать его, добавив в...

Интерпретатор небольшого языка программирования на С++ - C++
Здравствуйте, уважаемые форумчане! Я тут где-то год назад прочитал тему Evg и #pragma о создании интерпретатора, меня эта тема очень...

Написать Интерпретатор Программного Языка(собственного) - C++
Здраствуйте! Кто знает C++ помогите пожалуйста с реализацией данного задания!!! Пожалуйста, очень надо. сроки поджимают. Есть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
20.12.2009, 02:45  [ТС] #256
Пытаюсь сделать конструкцию
PureBasic
1
2
3
SUB NAME (params) 
  ' ...
END SUB
На стадии создания представления всё вроде ясно - создаём список функций,у каждой есть своё подобие стека,который будет передаваться параметром для поиска в нём переменных,ну и может ещё параметр-флаг,который будет сигналить,есть ли SHARED-переменные,и нужно ли искать в глобальной области.
А как быть с самой интерпретацией run-time? По идее нужно тоже передавать нужный стек параметром,только вот как метка вызова функции будет знать,какой стек нужно выбрать? Придётся делать общую переменную для всех stmt's,содержащую указатель на текущий стек? Или только для меток делать указатель на нужную функцию в списке..
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
20.12.2009, 11:35 #257
Как интерпретировать процедуры через промежуточное представление - я вот так с ходу и не скажу. Проблема именно в рекурсивных вызовах. Видимо надо уже над переменными строить надствройку в виде некоторой страницы (которая по сути пул памяти, хранилище). Т.е. при создании переменной ты ещё и указываешь и страницу, в которой эта переменная живёт. Страница для глобальных переменных будет одна. Для локалов и формальных параметров каждой процедуры заводится своя страница и все переменные ссылаются на эту страницу. При наличии рекурсивного вызова процедуры всю страницу можно куда-нибудь в сторону скопировать. Таким образом с точки зрения нашего представления вроде бы остаётся всё как есть: внутреннее представление каждой переменной всегда находится в одном и том же месте памяти интерпретатора. Но это - некий технический бубен, потому как наше представление было рассчитано на случай без функций.

Как вариант можно строить наше же представление. С незначительными отличиями:
- вместо одной цепочки операторов будет несколько цепочек (на каждую функцию отдельная цепочка)
- каким-то образом нужно отличать глобальные переменные от локальной переменной функции. Способов миллион от страниц, про которые говорил выше, до списков переменных, привязанных к каждой процедуре
Оба отличия с технической точки зрения НЕ являются сложными и НЕ являются бубнами/подпорками/костылями. Получится так называемое представление высокого уровня, которое попросту отражает исходник программы в удобный вид для обработки в интерпретаторе (ну и плюс отсеиваем пользовательские ошибки).

Представление верхнего уровня будет использоваться только для хранения "образа программы". Далее нужно построить ещё одно промежуточное представление, которое удобно для интерпретирования. Это будет представление низкого уровня, которое внутри себя будет читывать динамические стеки и прочую лабуду, возникающую при исполнении. Компиляторы, как правило строятся на двух промежуточных представлениях с тем же назначением: высокоуровневое представление, чтобы иметь образ программы, и низкоуровневое, чтобы с него генерировать код.

Высокоуровневое представление оперирует понятиями "объект" ("переменная"). Низкоуровневое - понятиями "память" и "регистр".

Для исходника

PureBasic
1
A = B + C
на высоком уровне мы имеем операцию типа (пишу несколько условно, чтобы отобразить тот факт, что у нас ето всё в одной операции (statement), который по сути имеет некую древовидную конструкцию.

Код
ASSIGN (VAR A, PLUS (VAR B, VAR C))
на низком уровне это разложится в более примитивные операции типа:

Код
OBJPTR A -> r1   <-- запись адреса переменной в некий регистр r1
OBJPTR B -> r2
OBJPTR C -> r3
LOAD   [r2] -> r4    <-- загрузка значения из адреса, записанного в r2, в регистр r4
LOAD   [r3] -> r5
ADD    r4, r5 -> r6  <-- сложение значений на регистрах r4 и r5 и запись результата в регистр r6
STORE  r6 -> [r1]    <-- запись значения и регистра r6 по адресу, записанному в регистре r1
Для реальной машины и компилятора в каждом случае надо знать, с каким форматом данных мы работаем (т.е. это int32, int64, float32, ...). От формата данных зависит конкретная аппаратная операция для чтения и арифметики. В случае интерпретатора можно не заморачиваться и считать, что наши "регистры" содержат Value, а потому разбор конкретного типа данных происходит в момент арифметической операции над Value (что у нас уже реализовано)

Адрес глобальных переменных в run-time всегда будет одним и тем же. Адреса локальных переменных будут плавать (в зависимости от глубины стека). В этом случае понадобятся страницы (фрэймы) памяти. Все глобальные переменные будут распределены в одну страницу для глобалов. При входе (на исполнении) в каждую процедуру будет заводиться страница для локалов процедуры и туда помещаться все локалы. Адрес локальной переменной будет вычисляться на основании адреса текущей страницы локалов.

Да, всё это на первый взгляд слишком непонятно. Непонятно так же, как это будет выглядеть технически. Но для начала надо хотя бы в общем виде понять концепцию двух представлений. Причём пока писал, уже понял, что низкоуровневое представление можно значительно сократить. А так же построить его на базе высокоуровневого, т.к. на первый взгляд раличие будет только при работе с переменными. Но это мысли "на потом", для начала понять концепцию.

Прежде, чем это делать, тебе всё-таки нужно навести порядок во внутренностях интерпретатора, потому что закопаешься. И ещё сделать нормальную печать промежуточного представления, чтоб "глазами" можно было увидеть всё, что в нём есть и как оно друг с другом связано (как это смотреть в моей версии, я вроде бы уже писал). В gcc эти печати даже не стали прятать от пользователя (хотя во всех коммерческих компиляторах в пользовательских версиях) она отключена. Запусти "gcc t.c -da" и ты увидишь файлы "gcc t.c.*", в которых расписано представление после каждого прохода или оптимизации. Без подобной НОРМАЛЬНОЙ печати компилятор реализовать просто невозможно
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
20.12.2009, 12:06 #258
Evg, #pragma, я тут прочитал, что вы хотели бы иметь графический интерфейс к программе. Могу помочь. Предлагайте свои идеи, я попробую реализовать. От вас мне будет нужна только программа в скомпилированном виде. И некоторые нюансы можно будет обсудить потом.
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
20.12.2009, 13:23 #259
Цитата Сообщение от RazorQ Посмотреть сообщение
Evg, #pragma, я тут прочитал, что вы хотели бы иметь графический интерфейс к программе. Могу помочь. Предлагайте свои идеи, я попробую реализовать. От вас мне будет нужна только программа в скомпилированном виде. И некоторые нюансы можно будет обсудить потом.
#pragma, как вариант я поддерживаю такое предложение. Потому как в реальной жизни именно так и происходит. С другой стороны у тебя есть желание самому разобраться в Qt и самому наваять графическую часть.

Как вариант можешь делать сам, но параллельно "заказать" работу. Потому как одна программа низкого уровня (интерпретатор) и несколько программ высокого уровня (графическая оболочка) - это совершенно нормальное явление. А заодно и в чужом коде посмотришь, как делается что-то. Ещё прочувствуешь, чем принципиально отличается работа в команде от работы в одиночку: когда есть много мыслей в голове это одно, а когда эти мысли надо объяснить людям - совсем другое.
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
20.12.2009, 13:41 #260
Значит ждем решения #pragma.

Добавлено через 1 минуту
Evg, ты не мог бы дать мне список ключевых слов и саму программку. Я пока поэкспериментирую.
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
20.12.2009, 14:11 #261
Цитата Сообщение от RazorQ Посмотреть сообщение
Evg, ты не мог бы дать мне список ключевых слов и саму программку. Я пока поэкспериментирую.
Пишем свой интерпретатор языка BASIC

Скачиваешь, пишешь make. Запускаешь "./basin source.bas"
Только нужно будет libSDL установить

Добавлено через 15 минут
Правда последняя версия из-под cvs у меня что-то не компилится

Код
In file included from editor.cpp:22:
editor.h:22:26: error: QPlainTextEdit: No such file or directory
Та версия, которая у меня осталась (хз как посмотреть номер ревизии), тоже не компилится. После переустановки линуха может Qt не той версии или ещё чего

Код
libgui/src/libgui.so: undefined reference to `QString::indexOf(QRegExp&, int) const'
RazorQ
20.12.2009, 14:14
  #262

Не по теме:

Выполнил make. Всё собралось как надо, потом выполнил make clean и basin тоже удалился. Т.е. остаются только исходники. Так задумано?

И ошибка в программе: после выполнения тестовой программы source.bas остается окно с квадратиками.

Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
20.12.2009, 14:20 #263
Цитата Сообщение от RazorQ Посмотреть сообщение
Выполнил make. Всё собралось как надо, потом выполнил make clean и basin тоже удалился. Т.е. остаются только исходники. Так задумано?
Ну в общем-то все программы, собирающиеся через make делают так. А что у тебя вызвало сомнение?

Цитата Сообщение от RazorQ Посмотреть сообщение
И ошибка в программе: после выполнения тестовой программы source.bas остается окно с квадратиками
Я так понимаю, что там пробел надо нажать (чтобы окно раньше времени не пропадало). Или ты имеешь в виду какие-то артефакты?
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
20.12.2009, 14:23 #264
Цитата Сообщение от Evg Посмотреть сообщение
Ну в общем-то все программы, собирающиеся через make делают так. А что у тебя вызвало сомнение?
Я имею в виду, что исполняемый файл тоже удаляется. Если программа устанавливается в систему, то тогда все в порядке, но т.к. я её не устанавливаю, то рассчитываю на то, что исполняемый файл останется.

Цитата Сообщение от Evg Посмотреть сообщение
Я так понимаю, что там пробел надо нажать (чтобы окно раньше времени не пропадало). Или ты имеешь в виду какие-то артефакты?
Нажал пробел и окно пропало, но если нажимать на крестик, то оно остается.
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
20.12.2009, 14:33 #265
Цитата Сообщение от RazorQ Посмотреть сообщение
Я имею в виду, что исполняемый файл тоже удаляется. Если программа устанавливается в систему, то тогда все в порядке, но т.к. я её не устанавливаю, то рассчитываю на то, что исполняемый файл останется.
А... в "нормальном" случае так действительно не делается. Но #pragma пока всё "под себя" в первую очередь пишет. Хотя для порядка наверное стОит учесть

Цитата Сообщение от RazorQ Посмотреть сообщение
Нажал пробел и окно пропало, но если нажимать на крестик, то оно остается.
Насколько я понимаю, это какие-то особенности libSDL. В общем #pragma придёт - он тебе на все вопросы ответит

Добавлено через 3 минуты
RazorQ, может ты знаешь, чего надо в убунте нажать, чтобы qt установилось?
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
20.12.2009, 14:35 #266
Цитата Сообщение от Evg Посмотреть сообщение
RazorQ, может ты знаешь, чего надо в убунте нажать, чтобы qt установилось?
У тебя есть на компьютере SDK или исходники? Или ты хочешь из репов загрузить?
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
20.12.2009, 20:24  [ТС] #267
Ой,сколько интересного я пропустил
Ну во-первых,спасибо RazorQ за инициативу с помощью.В принципе я хотел сделать сам,но в-общем я уже сделал какой-то минимальный GUI,выглядит сейчас так:
http://itmages.ru/src/preview/15536/c86421.png
Окно с ошибками теперь показывается только когда они есть.
Т.е. заготовка есть (хотя по большому счёту там просто слепленные примеры с документации Qt4).Поковырявшись с Qt4,я примерно понял,как с ней работать,мне этого достаточно,так что можно даже полностью переделать GUI (только надо позаботиться,чтобы первоначальный вариант не пропал)
У меня есть несколько альтернатив решения этого вопроса.
1) Можно просто скачать исходники отсюда http://basin.svn.sourceforge.net/viewvc/basin/ там внизу есть ссылка на tar-ball.Это будет всегда последняя версия репозитория.
2) Скачать через svn тут https://sourceforge.net/projects/basin/develop
В этих случаях придётся как-то менятся исходниками потом.
3) По идее я бы мог добавить для RazorQ свою ветку в svn-репозитории,а также права на доступ,на странице проекта эту ветку видно не будет,но знающие смогут скачать,зная адрес.
4) Можно добавить git-репозиторий,а также cvs,и это будет как отдельная ветка.
5) Ну или ещё какой-нибудь вариант.
Насчёт пропадания окошка - там нужно нажать любую клавишу,и окно пропадёт.Просто я не знал,как правильно сделать это в SDL,и добавил в деструктор код по отлавливанию нажатия любой клавиши(по идее костыль):
выглядит так (graphics.cpp)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  inline Graphics::~Graphics ()
  {
     bool flag = false;
     if (initialized)
     {// FIXME !
        SDL_Event event;
        cout << "\nPress any key to continue.\n";
        while (true)
        {
           SDL_PollEvent(&event);
           switch (event.type)
           {
              case SDL_KEYDOWN: SDL_Quit();flag = true;
              break;
              default:;
           }
           SDL_Delay(1); // this is because otherwise this code taking 100% CPU
           if (flag) break;
        }
     }
  }
А про удаление проги - это просто надо главный Makefile поменять,я это сделал для тестовой компиляции,чтобы сразу после проверки отправлять правки в хранилище,и чтобы на этот момент ничего лишнего в папках не было.Все файлы,генерирующиеся автоматом,тоже удаляются (moc_* и другие).

P.S. на счёт написанного Evg про функции,надо подумать,потом я ответ напишу.

>Evg, ты не мог бы дать мне список ключевых слов и саму программку. Я пока поэкспериментирую.
Кстати,у нас разные версии интерпретаторов,у Evg-на C,у меня - смесь С и С++ (основной костяк промежуточного представления я взял из версии Evg ).

Добавлено через 10 минут
Мой список синтаксиса есть в файле SYNTAX,который прилагается к проекту,вот на него ссылка - http://basin.svn.sourceforge.net/vie...70&view=markup
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
20.12.2009, 23:11 #268
Цитата Сообщение от RazorQ Посмотреть сообщение
У тебя есть на компьютере SDK или исходники? Или ты хочешь из репов загрузить?
Мне всё равно что. Я хочу скомпилять исходники интерпретатора. SDK установленная есть

> У меня есть несколько альтернатив решения этого вопроса.

Для начала можно просто отдать RazorQ'у исходники, а он из нич что-то склепает. Если тебе понравится - включишь в свой репозиторий и будешь думать, как доступ организовывать. Даже если пароль взломают - всего можно будет откатить на нормальную версию, ибо взломанным паролем можно только испортить исходники, но нельзя испоганить хранилище (по идее)
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
20.12.2009, 23:26  [ТС] #269
Цитата Сообщение от Evg Посмотреть сообщение
Мне всё равно что. Я хочу скомпилять исходники интерпретатора. SDK установленная есть
По идее под Линухом должно всё компилиться,если устанавливал qt4-qmake,а также libqt4-dev,ну и может libqt4-gui.
Под виндой надо читать доку,как скомпилить Qt4 там что-то вроде запускаешь config,указываешь платформу(компилятор) ,и всё должно скомпилиться.

Самое правильное - запусти ./configure скрипт,он должен все зависимости выявить,и что нужно поставь.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.12.2009, 23:37 #270
Цитата Сообщение от Evg Посмотреть сообщение
RazorQ, может ты знаешь, чего надо в убунте нажать, чтобы qt установилось?
так
sudo apt-get install libqt4-dev
Добавлено через 5 минут
в каталоге с сорцами должен быть .pro файл(это файл сценарий для qmake).
вводишь:
qmake
make
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 23:37
Привет! Вот еще темы с ответами:

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

Интерпретатор/компилятор ассемблер-подобного языка - C++
Привет! Чую, что изобрёл велисипед, даже скорее велопарк, но всё же, поделюсь: Некоторое время назад начал изучать кресты, в целом...

Интерпретатор музыки стандарта BASIC PLAY на С++ - C++
У кого нибудь есть функция или класс, который сможет воспроизводить в С++ напрямую музыкальные строки, записанные в стандарте оператора...

Задание: разработать "Интерпретатор языка". С чего начать? - C++
Здравствуйте, вручили темку на курсовик, ну точнее как вручили, не успел взять то, что хотел - пришлось брать то, что осталось. Плоховато...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.12.2009, 23:37
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru