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

Написать анализатор кода, определяющий тип лексем - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как контролировать число создаваемых потоков? OpenMP http://www.cyberforum.ru/cpp-beginners/thread1782101.html
Здравствуйте. Начал изучать OpenMP. Имеется вопрос - когда мы делаем #pragma omp parallel for Мы можем контролировать число создаваемых потоков? Добавлено через 13 минут OpenMP только для ПРОЦЕССОРОВ INTEL или для ARM тоже?
C++ Побитовое "исключающее ИЛИ", совмещённое с присваиванием Объясните мне плиз что это и как устроено (как работает) а то с разбегу не разобрался :( a ^= b Буду благодарен за пояснения. http://www.cyberforum.ru/cpp-beginners/thread1782099.html
C++ Программа работы со сканером
Добрый день. Мне нужно написать программу для получение изображения со сканера. Но я абсолютно не имею представление как это сделать. Нашел только TWAIN но как с ним работать, какие есть библиотеки и т.д. я не представляю. Поэтому просьба накидать сылок на примеры, документацию, библиотеки или объяснить своими словами. Ну или хотя бы направление поисков.
C++ Разработать распознаватель заданной символьной цепочки
Необходимо разработать распознаватель заданной символьной цепочки. Символь- ная цепочка задается с помощью формул Бэкуса-Наура. Например: <цепочка>::=CONST <идентификатор>=<значение>; <идентификатор>::=<буква> | <идентификатор><буква> | <идентификатор><цифра> <буква>::=A | B | C | D | E | F | ... | Z <цифра>::=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <значение>::=<целая константа> |...
C++ Организовать вектор структур http://www.cyberforum.ru/cpp-beginners/thread1782043.html
не могу разобраться(((( имеется товар 100 PC , 120 Dress, 80 Shits. надо чтобы к каждому элементу я имел доступ и желательно все это поместить в один vector. кто-нибудь подскажет?)) vector<pair<int,string>>goods; goods.reserve(500); assert(goods.capacity() >= 500); goods.push_back(make_pair<int,string> (100,"PC"));
C++ Вести массив и найти суму и количество элементов кратных 3, с вызовом функции #include <iostream> using namespace std; void ColSum( int a, int n, int col, int sum) { for (int i = 0; i < n; i++) { if (a % 3 == 0) { col++; sum += a; подробнее

Показать сообщение отдельно
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
19.07.2016, 23:29     Написать анализатор кода, определяющий тип лексем
Kael Morhen, могу только дать пример того, как это все может выглядеть.
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
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
#include <string>
#include <istream>
#include <iostream>
#include <map>
#include <unordered_set>
 
 
enum Token {
  // Конец файла
  T_EOF,
  // Виды констант
  T_STRING,
  T_UNUMBER,
  T_ID,
  // Простой тип
  T_VARTYPE,
  //Служебные слова
  T_CONST,
  T_PROGRAM,
  T_LABEL,
  T_VAR,
  T_FUNC,
  T_PROC,
  T_BEGIN,
  T_END,
  T_TRUE,
  T_FALSE,
  // Различные операции
  T_FACTOROP,
  T_TERMOP,
  T_COND,
  // Условный оператор IF
  T_IF,
  T_THEN,
  T_ELSE,
  // Операторы цикла
  T_FOR,
  T_TO,
  T_DOWNTO,
  T_DO,
  T_WHILE,
  T_REPEAT,
  T_UNTIL,
  //;
  T_SEMICOLON,
  //:
  T_COLON,
  //,
  T_COMMA,
  //:=
  T_ASSIGN,
  //~
  T_NEG,
  //(
  T_LBR,
  //)
  T_RBR,
  //nil
  T_NIL
};
 
static std::unordered_set<std::string> NAMES = {
    "nil", "in", "if", "then", "else", "case", 
    "of", "repeat", "until", "while", 
    "do", "for", "to", "downto", 
    "begin", "end", "with", "goto",
    "const", "var", "array", "record", 
    "set", "file", "function", "procedure", 
    "label", "packed", "program", "true", "false"
    
};
static std::unordered_set<std::string> TYPE_NAMES = {
    "integer", "char", "boolean", "real"
};
static std::unordered_set<std::string> COND_NAMES = {
    "=", "<>", ">", ">=", 
    "<", "<=", "in"
};
static std::unordered_set<std::string> FACTOR_NAMES = {
    "*", "/", "div", 
    "mod", "and", "^"
};
 
static std::unordered_set<std::string> TERM_NAMES = {
    "+", "-", "or",
};
 
 
// Лексический анализатор
class Lexer {
  std::istream &_input;
  int _lastChar;
 
  unsigned _curLine;
 
public:
  Lexer(std::istream &input)
      : _input(input), _lastChar(' '), _IDName(""), _stringValue(""), _curLine(0) { }
 
  ~Lexer() {}
 
  // Получение очередной лексемы из потока
  Token GetToken();
  unsigned GetLine() { return _curLine; }
 
  std::string _IDName;
  std::string _stringValue;
};


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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
static int isNewline(int c) { return (c == '\n' || c == '\r'); }
static int isSpace(int c) { return (c == ' ' || c == '\t'); }
 
Token Lexer::GetToken()
{
    //Пропускаем ненужные гадости
    while (isNewline(_lastChar) || isSpace(_lastChar))
    {
        if (isNewline(_lastChar))
            _curLine++;
        _lastChar = _input.get();
    }
    // Проверка на наличие ключевого слова или идентификатора
    if (isalpha(_lastChar)) {
        _stringValue = _lastChar;
        while (isalnum((_lastChar = _input.get())))
            _stringValue += _lastChar;
        if (TYPE_NAMES.find(_stringValue) != TYPE_NAMES.end())
            return T_VARTYPE;
        else if (COND_NAMES.find(_stringValue) != COND_NAMES.end())
            return T_COND;
        else if (FACTOR_NAMES.find(_stringValue) != FACTOR_NAMES.end())
            return T_FACTOROP;
        else if (TERM_NAMES.find(_stringValue) != TERM_NAMES.end())
            return T_TERMOP;
        else if (NAMES.find(_stringValue) == NAMES.end())
            return T_ID;
        else if (_stringValue == "if")
            return T_IF;
        else if (_stringValue == "else")
            return T_ELSE;
        else if (_stringValue == "then")
            return T_THEN;
        else if (_stringValue == "begin")
            return T_BEGIN;
        else if (_stringValue == "end")
            return T_END;
        else if (_stringValue == "nil")
            return T_NIL;
        else if (_stringValue == "const")
            return T_CONST;
        else if (_stringValue == "function")
            return T_FUNC;
        else if (_stringValue == "procedure")
            return T_PROC;
        else if (_stringValue == "var")
            return T_VAR;
        else if (_stringValue == "program")
            return T_PROGRAM;
        else if (_stringValue == "label")
            return T_LABEL;
        else if (_stringValue == "for")
            return T_FOR;
        else if (_stringValue == "to")
            return T_TO;
        else if (_stringValue == "downto")
            return T_DOWNTO;
        else if (_stringValue == "do")
            return T_DO;
        else if (_stringValue == "while")
            return T_WHILE;
        else if (_stringValue == "while")
            return T_WHILE;
        else if (_stringValue == "repeat")
            return T_REPEAT;
        else if (_stringValue == "until")
            return T_UNTIL;
        else if (_stringValue == "true")
            return T_TRUE;
        else if (_stringValue == "false")
            return T_FALSE;
    }
    //Если строка
    else if (_lastChar == '\'')
    {
        _stringValue = "";
        _lastChar = _input.get();
        while (_lastChar != '\'' && !_input.eof())
        {
            if (_lastChar == '\n')
                _curLine++;
            _stringValue += _lastChar;
            _lastChar = _input.get();
        }
        if (_lastChar != '\'')
            throw std::exception();
        _lastChar = _input.get();
        return T_STRING;
    }
    //Если число
    else if (isdigit(_lastChar)) {
        _stringValue = _lastChar;
        while (isdigit((_lastChar = _input.get())))
            _stringValue += _lastChar;
        if (_lastChar == '.')
        {
            _stringValue += _lastChar;
            while (isdigit((_lastChar = _input.get())))
                _stringValue += _lastChar;
        }
        if (_lastChar == 'E')
        {
            _stringValue += _lastChar;
            _lastChar = _input.get();
            if (_lastChar == '+' || _lastChar == '-')
            {
                _stringValue += _lastChar;
                _lastChar = _input.get();
            }
            if (isdigit(_lastChar))
            {
                do
                {
                    _stringValue += _lastChar;
                    _lastChar = _input.get();
 
                } while (isdigit(_lastChar));
            }
            else
                throw std::exception();
        }
 
        return T_UNUMBER;
    }
    else if (_lastChar == '(')
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_LBR;
    }
    else if (_lastChar == ')')
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_RBR;
    }
    else if (_lastChar == ';')
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_SEMICOLON;
    }
    else if (_lastChar == ':')
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        if (_lastChar == '=')
        {
            _stringValue += _lastChar;
            _lastChar = _input.get();
            return T_ASSIGN;
        }
        else
            return T_COLON;
    }
    else if (_lastChar == ',')
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_COMMA;
    }
    else if (_lastChar == '~')
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_NEG;
    }
    else if (TERM_NAMES.find((_stringValue = _lastChar)) != TERM_NAMES.end())
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_TERMOP;
    }
    else if (FACTOR_NAMES.find((_stringValue = _lastChar)) != FACTOR_NAMES.end())
    {
        _stringValue = _lastChar;
        _lastChar = _input.get();
        return T_FACTOROP;
    }
    else if (COND_NAMES.find((_stringValue = _lastChar)) != COND_NAMES.end())
    {
        _stringValue = _lastChar;
        if ((_lastChar == '>' || _lastChar == '<') && ((_lastChar = _input.get()) == '='))
            _stringValue += _lastChar;
        _lastChar = _input.get();
        return T_COND;
    }
    // Проверим, не дошли ли мы до конца файла.
    if (_input.eof())
        return T_EOF;
 
    throw std::exception();
}


Выдрал из какого-то своего старого проекта (кто-то может даже угадать язык ). Оно в чистом виде скорее всего не заработает, но идея понятна быть должна.
 
Текущее время: 15:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru