Форум программистов, компьютерный форум 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
16841 / 5262 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
18.09.2009, 17:45     Пишем свой интерпретатор языка BASIC
Мой интерпретатор метки пока не поддерживает, но они неявно появляются в if'е. Грубо говоря, когда ты в структурном виде пишешь программу

PureBasic
1
2
3
4
5
6
7
IF A==B THEN
  A=1
  B=2
ELSE
  A=100
  B=200
ENDIF
то на представлении в виде цепочки получается аналог вот такой штуки:

C
1
2
3
4
5
6
7
8
9
if (a==b) then goto L1; else goto L2; // операция условного перехода, параметры - условное выражение и две метки
L1: // операция метка
a=1;
b=2;
goto L3; // операция безусловного перехода
L2:
a=100;
b=200;
L3:
Т.е. при интерпретации такого представления всё делается в "единой плоскости" (т.е. стек вызова при интерпретации кажой операции имеет одну и ту же глубину). При этом ты имеешь один-единственный список операций. И моя версия интерпретатора в процессеработы печатает именно такое промежуточное представление (и вообще можно визуально понять, что в нём находится)

Т.е. если для моей версии написать исходник

PureBasic
1
2
3
4
5
6
7
8
LET A = 5
IF A < 6 THEN
  LET A = 1
  LET B = 2
ELSE
  LET A = 100
  LET B = 200
END_IF
то напечатается вот такое промежуточное представление

Код
s1. LET        A = 5
s5. CBRANCH    (A < 6) -> t=s2(#then), f=s3(#else)   <-- переход по true на операцию s2, по false на s3

s2. LABEL      #then        <--- аналог метки L1
s6. LET        A = 1
s7. LET        B = 2
s8. BRANCH     -> s4(#finish)  <---- безусловный переход на операцию s4

s3. LABEL      #else        <--- аналог метки L2
s9. LET        A = 100
s10. LET       B = 200

s4. LABEL      #finish        <--- аналог метки L3
А для твоего исходника

PureBasic
1
2
3
4
5
6
7
8
9
10
LET A = 8
IF A THEN
 PRINT A
 1:
  PRINT "AAAA"
ELSE
 PRINT "DFDFD"
 GOTO 1
 PRINT "HHHH"
END IF
построилось бы представление, аналогом которого является код

C
1
2
3
4
5
6
7
8
9
10
11
if (a) then goto L1; else goto L3;
L1: // метка начала альтернативы then
print a;
L2: // языковая метка 1:
print "AAAA";
goto L4;
L3: // метка начала альтернативы else
printf "DFDFD";
goto L2;
print "HHHH";
L4:
тут я тебе пояснил, как сделано у меня, чтобы было понятно. Мне такое решение показалось наиболее простым, но опять-таки - я НЕ навязываю его тебе. Делай так, как тебе более понятно. Но вопросы как-то более подробно задавай. Твой интерпретатор уже по коду довольно большой и я не могу уже в деталях понимать его работу, не копаясь глубоко в исходнике. А потому нераскрытый вопрос понимаю с трудом и могу понять неправильно

Добавлено через 6 минут
Цитата Сообщение от #pragma Посмотреть сообщение
И в том то и дело,что я под виндами вообще не сижу .. вот и не знаю,как и когда \r туда мог попасть
Теоретически я мог под виндами что-то подправить в своём исходнике и выложить на форум, а ты уже скопировал оттуда

Цитата Сообщение от #pragma Посмотреть сообщение
Я нашел как поправить.. но вопрос про всякие левые символы в силе.
Сложно сказать. Я просто на все неизвестные символы выругиваюсь и всё. У меня есть вызов isspace, который проверяет на всякие пробельные символы, туда входит табуляция и возможно ещё что-то, что меня мало заботит, т.к. интефейс для того и писали, чтобы не разбираться в этом (\r туда возможно тоже попал). Файл я открываю как "rb", а потому с энтером он схлопнуться не должен
 
Текущее время: 18:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru