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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились:...
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!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) ...
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; ... подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
02.07.2009, 06:40  [ТС]
Воодушевившись твоим интерфейсом,начал потихоньку писать с header-ов,чтобы хоть немного навести порядок.Захотел для начала сделать нормальный дебаггер,чтобы сразу было видно,где возможная ошибка и т.д.
Структуру дебаггера задумал сделать так,чтобы был некий переключатель
C++
1
#define DEBUG 1
,который можно было бы просто сменить на ноль и процесс отслеживания переменных выключался бы.Печать переменных идёт в файл по ходу работы программы.В каждой функции,где нужно,есть условие,проверяющее включен ли переключатель,и вызывающее главную функцию печати.У каждого модуля есть своя,особенная функция для печати,а в главной функции печати есть switch инструкция,запускающая нужную функцию согласно полученному имени.На мой взгляд,это очень удобная модель,но хотел бы выслушать советы,если есть и если ещё не надоел .
Ещё подумал,было бы неплохо иметь таблицу зарезервированных слов,чтобы легче искать было и код не разрастался.
Ну,конечно всё ещё в процессе,но если есть какие-то замечания,лучше,пока далеко не ушёл,выслушать их.Вот пока код.(Да,английский у меня хромает )
debugger.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
27
28
29
30
31
32
#ifndef DEBUGGER_H_INCLUDED
#define DEBUGGER_H_INCLUDED
 
// This switch is to enable
// program global debugging
// mode.1 is enabled and 0
// is disabled.
#define DEBUG 1
 
#include <fstream>
 
   // Each value of this enum
   // represent function which
   // debugging process is
   // working in.
   enum debug_CurFunc {
       PARSER_INIT,       // parser_Init (const std::string file_name)
       PARSER_GET_TOKEN   // parser_TokenType parser_GetToken ()
   };
 
  /** @brief Clearing the debugging log. */
   extern void debugger_Start();
 
  /** @brief Global printing of variables.
   *  @param debug_CurFunc is name of the function,
   *  that debugger is working with. */
   extern void debugger_Print(debug_CurFunc);
 
   extern std::ofstream debug_data_file;
   extern debug_CurFunc debug_CurFuncName;
 
#endif // DEBUGGER_H_INCLUDED

debugger.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
#include "debugger.h"
#include "parser.h"
 
//
 
   using std::ofstream;
 
 
   ofstream debug_data_file;
 
 
   void debugger_Start()
   {
       debug_data_file.open("data_file.dat");
       debug_data_file.clear();
       debug_data_file.close();
   }
 
   void debugger_Print(debug_CurFunc debug_CurFuncName)
   {
           switch (debug_CurFuncName)
           {
                case PARSER_INIT: {
 
                    debug_data_file.open("data_file.dat",ofstream::app);
 
                    if (debug_data_file.is_open())
 
                       parser_PrintCurToken (&debug_data_file);
 
                    debug_data_file.close();
                }
                break;
                case PARSER_GET_TOKEN: {
 
                    debug_data_file.open("data_file.dat",ofstream::app);
 
                    if (debug_data_file.is_open())
 
                       parser_PrintCurToken (&debug_data_file);
 
                    debug_data_file.close();
                }
          }
   }

parser.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
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
#ifndef PARSER_H_INCLUDED
#define PARSER_H_INCLUDED
 
#include <string>
#include <map>
 
   enum parser_TokenType
   {
     TOKEN_NULL = 0,
 
     TOKEN_CONST_INT,   // Integer constant
     TOKEN_CONST_FLOAT, // Floating point constant
 
     TOKEN_IDENT,       // Identificator
 
     TOKEN_KW_LET,      // Keyword LET
     TOKEN_KW_PRINT,    // Keyword PRINT
 
     TOKEN_DELIM_EQUAL, // Sign "="
     TOKEN_DELIM_PLUS,  // Sign "+"
     TOKEN_DELIM_MINUS, // Sign "-"
 
     TOKEN_EOL,         // End of line
     TOKEN_EOF,         // End of file
 
     TOKEN_LAST
   };
 
  /** @brief Parser initialisation.
   *  @param file_name contains path
   *  to file with source code,which parser is working with.
   *  @return In case of problem with file opening return false,
   *  and true if file was opened */
   extern bool parser_Init (std::string file_name);
 
  /** @brief Procedure parser_GetToken gets the next token from
   *  input stream.
   *  @param As a result writing variables parser_CurToken and
   *  parser_LastTokenStr.
   *  @return Procedure parser_GetToken return value of
   *  parser_CurToken. */
   extern parser_TokenType parser_GetToken ();
 
  /** @var Variables parser_CurFile, parser_CurLine contain
   *  information about place of current token in source
   *  code for debug purposes,parser_CurToken is the current
   *  token in line.parser_CurTokenStr contains value of
   *  token,if available. */
   extern std::string parser_CurFile;
   extern unsigned parser_CurLine;
   extern parser_TokenType parser_CurToken;
   extern parser_TokenType parser_NextToken;
   extern std::string parser_CurTokenStr;
 
  /** @var parser_ResWords contain reserved words
   *  for parser.Initialization is in
   *  parser_Init (std::string file_name) */
   extern std::map<const std::string,int>parser_ResWord;
 
  /** @brief Printer for debugging purposes
   *  of current token state.
   *  @param parser_CurFile is name of the
   *  file,that is being parced. */
   extern void parser_PrintCurToken (std::ofstream *parser_CurFile);
 
  /** @brief End of parser's work */
   extern void parser_Finish ();
 
#endif // PARSER_H_INCLUDED

parser.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <iostream>
#include <cctype>
#include "parser.h"
#include "debugger.h"
#include "driver.h"
 
//
 
   using std::ofstream;
   using std::endl;
   using std::map;
   using std::string;
 
   parser_TokenType parser_CurToken;
   parser_TokenType parser_NextToken;
   string parser_CurTokenStr;
   string parser_CurFile;
   unsigned parser_CurLine;
   map<const string,int>parser_ResWord;
 
   bool parser_Init (const std::string file_name)
   {
       parser_ResWord["LET"] = parser_TokenType(TOKEN_KW_LET);
       parser_ResWord["PRINT"] = parser_TokenType(TOKEN_KW_PRINT);
 
       source.open(file_name.c_str());
 
       if (source.is_open())
       {
           ::parser_CurFile  = file_name;
           ::parser_CurLine  = 0;
           ::parser_CurToken = TOKEN_NULL;
           ::parser_NextToken = TOKEN_NULL;
           ::parser_CurTokenStr = "";
 
           if (DEBUG == 1) debugger_Print(PARSER_INIT);
 
           return true;
       }
       else
           return false;
   }
 
 
   parser_TokenType parser_GetToken ()
   {
       char c = 0;
       ::parser_CurTokenStr = "";
 
       if (DEBUG == 1) debugger_Print(PARSER_GET_TOKEN);
 
       while (!source.eof())
       {
           source.get(c);
           if (isalpha(c))
           {
               while (!source.eof()&&isalpha(c))
               {
                    ::parser_CurTokenStr.push_back(c);
                    source.get(c);
               }
 
               switch (c)
               {
                   case ' ': {
                       ::parser_NextToken = TOKEN_NULL;
                       source.unget();
                       break;
                   }
                   case '=': {
                       ::parser_NextToken = TOKEN_DELIM_EQUAL;
                       source.unget();
                       break;
                   }
                   case '+': {
                       ::parser_NextToken = TOKEN_DELIM_PLUS;
                       source.unget();
                       break;
                   }
                   case '-': {
                       ::parser_NextToken = TOKEN_DELIM_MINUS;
                       source.unget();
                       break;
                   }
                   case '\n':{
                       ::parser_NextToken = TOKEN_EOL;
                       source.unget();
                       break;
                   }
                   default:  {
                       source.unget();
                       break; // Error
                   }
               }
 
               map<const string,int>::iterator i = parser_ResWord.find(::parser_CurTokenStr);
 
               if (i!=parser_ResWord.end())
                   ::parser_CurToken = parser_TokenType(parser_ResWord[::parser_CurTokenStr]);
 
               else
                   ::parser_CurToken = TOKEN_IDENT;
 
               if (DEBUG == 1) debugger_Print(PARSER_GET_TOKEN);
 
               return ::parser_CurToken;
           }
       }
       if (DEBUG == 1) debugger_Print(PARSER_GET_TOKEN);
 
       return ::parser_CurToken;
   }
 
 
   void parser_PrintCurToken (std::ofstream *parser_CurFile)
   {
 
       {
            debug_data_file << ::parser_CurFile     << ' '
                            << ::parser_CurLine     << ' '
                            << ::parser_CurToken    << ' '
                            << ::parser_NextToken   << ' '
                            << ::parser_CurTokenStr << ' '
                            <<   endl;
       }
   }

driver.h
C++
1
2
3
4
5
6
7
8
9
#ifndef DRIVER_H_INCLUDED
#define DRIVER_H_INCLUDED
 
#include <fstream>
 
 
extern std::ifstream source;
 
#endif // DRIVER_H_INCLUDED

driver.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include "driver.h"
#include "debugger.h"
#include "parser.h"
 
 
using std::ifstream;
using std::cout;
 
std::ifstream source;
 
int main()
{
    if (DEBUG == 1) debugger_Start();
    parser_Init("source.bsc");
    parser_GetToken ();
    parser_GetToken ();
    parser_GetToken ();
    return 0;
}

Входной файл:
source.bsc
PureBasic
1
asd let print


Добавлено через 23 минуты 40 секунд
P.S.Да,кстати,я тут подумал,почему была вообще эта проблема со съеденной точкой - по ходу дела функция .get() вынимает неформатированный размер данных в 1 char из потока,а .putback() отдаёт форматированный поток,поэтому следовало пользоваться функцией .unget().Это вроде не написано в объяснении библиотеки,я просто так подумал.

Добавлено через 1 час 30 минут 36 секунд
P.S.2 Чёт не пойму,как это я так сделал,как это работает?
C++
1
2
3
4
5
   void parser_PrintCurToken (std::ofstream *parser_CurFile) // Что и каким образом передаётся в функцию?
   {
            debug_data_file << ::parser_CurFile     << ' '
                       ....
   }
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru