Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Меню и список Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились: Введите элемент и номер. вот сам код: #ifndef __list_h #define __list_h #include <iostream> https://www.cyberforum.ru/ cpp-beginners/ thread41194.html C++ Здравствуйте! Не могу поместить class в один файл с программой. file.hpp
#include "Cat.hpp" // здесь классы "2)" Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() {
C++ Массивы строк https://www.cyberforum.ru/ cpp-beginners/ thread41179.html
Привет всем! Задан массив строк. Как узнать который символ встечаетса найбольшое количество раз в етом массиве?
C++ вывод на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер Please, help me!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо исправить код, чтоб фигуры не исчезали за экран (т.е. 640х460) и были компактным набором, т.е. двигались неменяя своего положения относительно друг друга и стукаясь об стенку экрана меняли свое... https://www.cyberforum.ru/ cpp-beginners/ thread41152.html
Округление дробного числа до целого в большую сторону. C++
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) программа не округляет это число (в большую сторону) до 4. Перелопатил тонны литературы, но пропустил или не нашёл этого, большая просьба написать функцию которая могла бы это делать, или способ какой.
C++ Код из Delphi в C++ https://www.cyberforum.ru/ cpp-beginners/ thread41137.html
Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; var d:array of longint; procedure c; var a,b,i:longint;
C++ массив структур и функции https://www.cyberforum.ru/ cpp-beginners/ thread41103.html
Разработать модель прайс-листов по комплектующим. Каждую единицу оборудования должна описывать соответствующая структура (например, структура, описывающая видеокарты или мониторы), объект которой может входить в прайс-лист. Соответственно, прайс-лист - это массив структур, каждая из которых хранит один из вариантов оборудования и его цену. Написать функции для создания, удаления,...
C++ Таймер не работает в Turbo C++
Реализовал таймер в Visual C++. #include "stdafx.h" #include <iostream.h> #include <conio.h> #include <time.h> #include <stdio.h> #include <stdlib.h> const int N=100000000;
C++ не могу завершить код :( https://www.cyberforum.ru/ cpp-beginners/ thread41093.html
он меняет 1 слово из фаила example.txt затем создоёт vasea-out.txt с уже изменёным текстом.. но он меняет только 1 слово.. как сделать чтобы он менял болише слов к приемру в example.txt написано "Вася хороший мальчик" водим "Вася хороший" затем водим "Жора плохой" и получаем в vase-out.txt "Жора плохой мальчик" за ранее спасибо #include <iostream> #include <fstream>
C++ MS VC++ 6.0:Как "подавить" выдачу конкретных варнингов в конкретных местах? Не хочу, чтобы выдавались конкретные варнинги, относящиеся к определённым областям заданных файлов. Как это сделать. Про "Warning Level" в насторйках студии я в курсе. Но мне нужно подавить варнинг с конкретным номером (К примеру C4244). И только в определённых местах заданных файлов. В том числе в системных файлах библиотек компилятора. Можно это как либо сделать? https://www.cyberforum.ru/ cpp-beginners/ thread41092.html
Последний метод итераций C++
Здравсвуйте программисты! Спасибо за ответы на предыдущие посты. Осталось решить методом итераций систему уравнений. Вчера Сазари мне подсказал как делать методом Зейделя, осталось методом итераций. Вот попробывал собрать код методом итераций, но дело в том,что результат системы уравнений равен по -1, все 4 уравнения, подскжаите пожалуйста где в данном коде мождет быть проблемма. Загвоздка в...
C++ не переводит из string в char* помогите пожалуйста задание: операции со строками с использованием шаблона string #include <algorithm> #include <iostream> #include <string> #include <conio.h> using namespace std; https://www.cyberforum.ru/ cpp-beginners/ thread41080.html
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
05.07.2009, 11:42 0

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

05.07.2009, 11:42. Показов 242522. Ответов 464
Метки (Все метки)

Ответ

> то есть важно только количество "токенов",а не строк и др

Да. Именно исходя из этих соображений должен писаться парсер. Ведь синтаксическому разборщику всё остальное неважно (ему не нужны комментарии, лишние проблеы и т.п.)

> Последующие вызовы функции (когда "токенов" уже нет) бесполезны

Вопрос в том, а как понимать, что мы имеем последний токен. EOF нужен только для этого. EOL нужен для обозначения конца оператора (statement). Чтобы конструкция "LET a=1 LET b=2" трактовалась как ошибочная (ибо считаем, что положено не более одного оператора в строке). Так же EOL служит разделителем между операторами, что упростит процесс синтаксического разбора. Но, оставь так, как сделал. Потому что более полезно учиться на своих ошибках, а не на том, как другие тебе их указывают

> обработку ошибок даже пока не знаю,как делать

Предлагаю такой вариант. Для начала сделай хоть как-то, чтобы оно работало в самом примитивном варианте. Лишь бы потом можно было просто найти все места, которые надо исправить. КОгда интерпретатор более-менее задышит и будет поддерживать несколько конструкций - тогда будет проще спроектировать конкретную реализацию обработки ошибок, потому как уже можно будет охватить широким взглядом всё то, что уже есть (а не виртуально то, что предположительно будет, как это сейчас)

> Как делаются такие вещи в нормальных программах?

Все интерпретаторы работают до первой ошибки. Компилятор (поскольку он не исполняет программу, а лишь преобразует её из языкового вида в машиннный код) работает до конца, и ищет по пути максимальное количество ошибок. Но, возможно сам наблюдал, что пропущенная запятая после описания внешней процедуры способна навести две страницы сообщений об ошибках. Как аккуратно восстанавливаться из ошибочных ситуаций - написаны целые научные труды. Я бы тебе пока не рекомендовал лезть в это дело, дабы не забивать голову вещами, которые тебе пока не нужны

> Ну вот,теперь помоему,самое время приступить к организации рекурсивного спуска

Можно конечно и так. Но есть ещё две компоненты, которые неплохо было бы реализовать. Это таблица переменных и пакет констант. Таблица переменных сейчас у тебя сделана просто ввиде шаблонного массива, хотя удобнее было бы её выделить в отдельную компоненту и накрыть интерфейсом. Константы у тебя представлены в виде double'а, а нужно их сделать в виде класса, в котором хранится вся информация (её тип и значение), а так же реализованы операции над константами (чтобы не заниматься этим при синтаксическом разборе)

Хотя действительно, понятнее всего было бы сделать так. Для начала сделать разбор синтаксиса, полгатаь, что константы у нас только double, сделать какой-то примтивный вариант, чтобы работал, а потом уже станет видно, как из всего этого отделить рабуоту с константами и работу с таблицей переменных

> Я так полагаю,мне придётся искать инфу по бейсику в сети?

А зачем. У тебя же не стоИт задача реализовать полноценный бэйсик. Ты пока только учишься, а потому можно сделать что-то очень простое бэйсикоподобное. Когда ты реализуешь до конца свою простую задачу, я тебя уверяю, ты сам сможешь её расширить до нормального интерпретатора. И синтаксис потом поменять как угодно

Щас погляжу твоё творение

Добавлено через 22 минуты 6 секунд
Для твоего исходника напечаталось так

Код
File: source.bsc Line: 1	CurToken: TOKEN_NULL    	NextToken: TOKEN_NULL    	TokenStr:  
File: source.bsc Line: 1	CurToken: TOKEN_KW_PRINT	NextToken: TOKEN_NULL    	TokenStr: PRINT 
File: source.bsc Line: 1	CurToken: TOKEN_KW_PRINT	NextToken: TOKEN_NULL    	TokenStr:  
File: source.bsc Line: 1	CurToken: TOKEN_IDENT    	NextToken: TOKEN_NULL    	TokenStr: aa 
File: source.bsc Line: 1	CurToken: TOKEN_IDENT    	NextToken: TOKEN_NULL    	TokenStr:  
File: source.bsc Line: 1	CurToken: TOKEN_KW_LET    	NextToken: TOKEN_NULL    	TokenStr: LET 
File: source.bsc Line: 1	CurToken: TOKEN_KW_LET    	NextToken: TOKEN_NULL    	TokenStr:  
File: source.bsc Line: 6	CurToken: TOKEN_IDENT    	NextToken: TOKEN_EOL    	TokenStr: a 
File: source.bsc Line: 7	CurToken: TOKEN_IDENT    	NextToken: TOKEN_EOL    	TokenStr:  
File: source.bsc Line: 7	CurToken: TOKEN_IDENT    	NextToken: TOKEN_EOL    	TokenStr: jj 
File: source.bsc Line: 8	CurToken: TOKEN_IDENT    	NextToken: TOKEN_EOL    	TokenStr:  
File: source.bsc Line: 9	CurToken: TOKEN_CONST_FLOAT	NextToken: TOKEN_EOL    	TokenStr: 7.9 
File: source.bsc Line: 10	CurToken: TOKEN_CONST_FLOAT	NextToken: TOKEN_EOL    	TokenStr:  
File: source.bsc Line: 11	CurToken: TOKEN_CONST_INT	NextToken: TOKEN_EOL    	TokenStr: 4 
m
Почему на каждый токен по две печати - я особенно разбираться не стал. Правда всё равно не понял корелляции между CurToken и NextToken. Т.е. мне казалось, что NextToken это то, что мы получим при следующем вызове GetToken. Но не суть. Главное, что мысль того, что должен делать GetToken, ты понял правильно

В parser.cpp есть фрагмент (строки 89-93)

C++
1
2
3
if ((PARSER_DEBUG == 1)&&(DEBUG == 1)) debugger_Print(PARSER_GET_TOKEN);
if (::parser_NextToken == TOKEN_EOL) ++::parser_CurLine;
return ::parser_CurToken;
Т.е. увеличение текщуего номера строки у тебя идёт после печати. Т.е. глазами в печати ты будешь видеть одно, а реально у тебя будет другое. Это доволно частая ошибка

Добавлено через 14 минут 37 секунд
Вот примерное формальное описание синтаксиса на текущий момент

Код
StatementList = Statement { EOL Statement } EOF
Statement = LetStatement | PrintStatement
LetStatement = IDENT "=" Expr
PrintStatement = "PRINT" Expr
Expr = Term { "+" | "-" Term }
Term = Factor { "*" | "/" Factor }
Factor = CONST | IDENT | "(" Expr ")"
Битовые операции пока включать не стал, из соображений минимизации. Да и хотелось бы, чтобы ты сам прикинул, как добавить операции с ещё одним уровнем приоритета. Для PRINT'а сделал чуть пошире, чем у тебя было - он печатает не просто переменную, а произвольное выражение (переменная тоже является выражением)

Так что предлагаю тебе сначала реализовать такой синтаксис, а потом начать выделять константы и таблицу переменных

Сейчас получается всё просто. Верхний уровень (по сути дела обработка StatementList) что-то типа того. Пишу в своём предположенииналичия EOL'ов и EOF'ов

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while ((parser_GetToken()) != EOF)
{
  switch (parser_CurToken)
  {
    case KW_LET:
      stmt_LET();
      break;
    case KW_PRINT:
      stmt_PRINT();
      break;
    default:
      синтаксическая ошибка
  }
 
  if (parser_GetToken() != EOL)
    синтаксическая ошибка
}
 
если дошли до этой точки, значит программа проинтерпретирована до конца
Процедуры stmt_LET и stmt_PRINT внутри себя дальше дёргают parser_GetToken и работают согласно описанному синтаксису

Добавлено через 6 минут 57 секунд
На начальном этапе с EOL'ами можешь не заморачиваться, но тогда у тебя будут разрешены операции типа "LET a=1 LET b=2". В скриптовых языках принято операции разделять энтером или знаком ";"

Добавлено через 14 минут 52 секунды
Кстати, в 20-м посте я ещё в терминологии по ходу дела ошибся. Тут куча тонких моментов, но по ходу дела общепринятые термины такие. Парсер является лексическим анализатором (т.е. процесс формирования токенов из символов называется lexical analyser). А вот построение операторов - это синтаксический разбор (а правила называются syntax rules)

Вернуться к обсуждению:
Пишем свой интерпретатор языка BASIC C++
1
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2009, 11:42
Готовые ответы и решения:

Пишем свой интерпретатор языка BASIC
Добрый день. Я смотрю, тут на форуме была тема коллективного написания интерпретатора BASIC на...

Пишем свой strlen
Всем привет, вырвал часть задание из общего задание по написанию своего string. На данном этапе...

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

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

464
05.07.2009, 11:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2009, 11:42
Помогаю со студенческими работами здесь

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

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

Не удается откомпилировать интерпретатор М-языка
Задача: взять интерпретатор М-языка на сайте...

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

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

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

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru