Форум программистов, компьютерный форум 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,127
Записей в блоге: 26
14.07.2009, 09:49     Пишем свой интерпретатор языка BASIC
Цитата Сообщение от #pragma Посмотреть сообщение
Я так понимаю,на данном этапе парсинга вообще не должно быть варианта else,а должна быть ошибка неинициализированной переменной. Потому что если мы встретим внутри выражения неинициализированную переменную,будет попытка её создания.
Именно так

Цитата Сообщение от #pragma Посмотреть сообщение
Так же мы не можем знать,была ли эта находка новой переменной после ключевого слова LET или просто посередине строки.Поэтому,нужно,чтобы у stmnt_kw_LET() была своя ветка рекурсии. Я правильно понял?
Судя по всему, ты уже понял про концепции rvalue и lvalue, так что ответ на этот вопрос тебе вроде бы уже понятен. Где-то я уже писал, что на каждый statement по хорошему должна быть своя процедура. Да и вообще. ка каждое синтаксическое правило нужна своя процедура. Ибо так будет проще, особенно если имя процедуры содержит в себе название правила, а в исходнике где-то в головной части или в отдельном текстовом файле ты аккуратно выпишешь все лексические и синтаксические правила, а в комментариях будешь ссылаться на них

Цитата Сообщение от #pragma Посмотреть сообщение
P.S.Да,насчёт сообщения #47, я как-то пропустил,прочитал просто,но сейчас вник и согласен,лучше разделить всё это на функции (я про syntax_IdentLValue (void),syntax_IdentRValue (void) и syntax_Ident() ) ,то есть лучше следовать принципу "разделяй и властвуй",так понятнее код.Я это учту и переделаю.
Потому я тебе и не навязываю свои варианты, а лишь выкладываю "к размышлению". После того, как сделаешь неправильно, только тогда на уровне ощущений начнёшь понимать, как делать правильно. Именно поэтому говорю, что не надо бояться переделывать код, ибо это единственный способ научиться делать правильно

Добавлено через 10 минут 1 секунду
Кстати, в 30-м посте я ошибся с правилом. Правильно вот так:

LetStatement = LET IDENT "=" Expr

Да и вообще, сейчас для порядку ещё раз свалю рядом лексические и синтаксические правила. Немного их подкорректирую, всвязи с текущим положением вещей

================================================

Лексика:

Код
Const = ConstInt | ConstFloat
ConstInt = Digit { Digit }
ConstFloat = Digit { Digit } "." Digit { Digit }
Ident = Letter { Letter | Digit }
Letter = "A" | "B" | ... | "y" | "z"
Digit = "0" | "1" | ... | "9"
KeywordLet = "LET"
KeywordPRINT = "PRINT"
================================================

Синтаксис. Сделаны следующие изменения:

1. Поправлена ошибка в LetStatement
2. IDENT (лексическая конструкция) заменил на Ident (синтаксическая конструкция), потому как в Ident будет ещё и элемент массива (а то и структуры, если осилим). Аналогично с CONST'ом
3. В Expr добавил унарные плюс и минус

Ранее я забыл упомянуть. Слова с заглавной буквы - синтаксические правила, из всех заглавных букв или в кавычках - лексические единицы. Лексические и синтаксические правила НЕ живут в одном пространстве. Т.е. Ident в лексических правилах и Ident в синтаксических - это разные вещи

Код
StatementList = Statement { EOL Statement } EOF
Statement = LetStatement | PrintStatement
LetStatement = "LET" Ident "=" Expr  <-- здесь Ident на позиции Lvalue
PrintStatement = "PRINT" Expr
Expr = ["+"|"-"] Term { "+" | "-" Term }
Term = Factor { "*" | "/" Factor }
Factor = Const | Ident | "(" Expr ")"  <-- здесь Ident на позиции Rvalue
Const = CONST
Ident = IDENT  <-- в теории в будущем здесь будет ещё и элемент массива
Добавлено через 10 минут 53 секунды
Кстати, пока не забыл, если в моё отсутсвие нечем будет заняться, то напишу дальнейшее развитие. Да и чтобы сам потом вспомнил, что хотел.
  1. Ввести строковые константы
    Лексика: ConstString = <знак "> { Any symbols } <знак ">
    Синтаксис не меняется - всё это попадает под правило CONST

    Итого получается, что у тебя появляется ещё один тип констант. Т.е. в теории модификации следующие:
    • поддерживаешь в парсере
    • в синтаксисе правка минимальная - только в правиле Const добавть ещё проверку на TOKEN_CONST и всё
    • поддерживаешь операции над строковыми константами. При этом можно работать в таком варианте:
      "abc" + "def" = "abcdef"
      "abc" + 1 = "abc1"
      "abc" + 5.5 = "abc5.5"
      1 + "abc" - запрещённая операция
      5.5 + "abc" - запрещённая операция
      все остальные арифметические операции над строками запрещены
  2. Добавляем операцию INPUT. Синтаксис:
    Код
    InputStatement = INPUT Ident <-- Здесь Ident в позиции Lvalue
  3. Подумай над тем, как реализовывать условное исполнение. Синтаксис:
    Код
    IfStatement = IF RelationExpr THEN Statemen [ ELSE Statement ]
 
Текущее время: 14:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru