Условные конструкции, циклы, массивы и библтотеки

This commit is contained in:
SkrinVex
2025-12-25 16:59:15 +05:00
parent 8ca31ea877
commit 47368b374f
12 changed files with 599 additions and 172 deletions
+31 -7
View File
@@ -16,13 +16,12 @@ std::vector<Token> Lexer::tokenize() {
continue;
}
// 2. ОБРАБОТКА КОММЕНТАРИЕВ (НОВОЕ)
// Если видим '/', и следующий символ тоже '/', то это комментарий
// 2. ОБРАБОТКА КОММЕНТАРИЕВ
if (current == '/' && pos + 1 < source.length() && source[pos + 1] == '/') {
while (pos < source.length() && source[pos] != '\n') {
pos++; // Пропускаем всё до конца строки
pos++;
}
continue; // Переходим к следующей итерации цикла
continue;
}
// 3. Числа
@@ -43,9 +42,13 @@ std::vector<Token> Lexer::tokenize() {
tokens.push_back({TokenType::STRING_LITERAL, str, line});
}
// 5. Идентификаторы и Ключевые слова
else if (isalpha(current)) {
// ИСПРАВЛЕНИЕ ТУТ: Добавлена проверка || current == '_'
else if (isalpha(current) || current == '_') {
std::string id;
while (pos < source.length() && isalnum(source[pos])) id += source[pos++];
// И ТУТ: Добавлена проверка || source[pos] == '_'
while (pos < source.length() && (isalnum(source[pos]) || source[pos] == '_')) {
id += source[pos++];
}
if (id == "print") tokens.push_back({TokenType::PRINT, id, line});
else if (id == "input") tokens.push_back({TokenType::INPUT, id, line});
@@ -55,22 +58,43 @@ std::vector<Token> Lexer::tokenize() {
else if (id == "int") tokens.push_back({TokenType::INT_KW, id, line});
else if (id == "string") tokens.push_back({TokenType::STRING_KW, id, line});
else if (id == "void") tokens.push_back({TokenType::VOID_KW, id, line});
// Ключевые слова v4.0
else if (id == "while") tokens.push_back({TokenType::WHILE, id, line});
else if (id == "if") tokens.push_back({TokenType::IF, id, line});
else if (id == "else") tokens.push_back({TokenType::ELSE, id, line});
else if (id == "array") tokens.push_back({TokenType::ARRAY, id, line});
else if (id == "set") tokens.push_back({TokenType::SET, id, line});
else if (id == "get") tokens.push_back({TokenType::GET, id, line});
else if (id == "size") tokens.push_back({TokenType::SIZE, id, line});
else if (id == "include") tokens.push_back({TokenType::INCLUDE, id, line});
else tokens.push_back({TokenType::IDENTIFIER, id, line});
}
// 6. Операторы
else {
if (current == '=' && pos+1 < source.length() && source[pos+1] == '=') {
tokens.push_back({TokenType::EQ, "==", line}); pos+=2; continue;
}
if (current == '!' && pos+1 < source.length() && source[pos+1] == '=') {
tokens.push_back({TokenType::NEQ, "!=", line}); pos+=2; continue;
}
switch (current) {
case '+': tokens.push_back({TokenType::PLUS, "+", line}); break;
case '-': tokens.push_back({TokenType::MINUS, "-", line}); break;
case '*': tokens.push_back({TokenType::STAR, "*", line}); break;
case '/': tokens.push_back({TokenType::SLASH, "/", line}); break; // Это деление, если не сработало условие выше
case '/': tokens.push_back({TokenType::SLASH, "/", line}); break;
case '%': tokens.push_back({TokenType::MOD, "%", line}); break;
case '(': tokens.push_back({TokenType::LPAREN, "(", line}); break;
case ')': tokens.push_back({TokenType::RPAREN, ")", line}); break;
case '{': tokens.push_back({TokenType::LBRACE, "{", line}); break;
case '}': tokens.push_back({TokenType::RBRACE, "}", line}); break;
case '[': tokens.push_back({TokenType::LBRACKET, "[", line}); break;
case ']': tokens.push_back({TokenType::RBRACKET, "]", line}); break;
case ';': tokens.push_back({TokenType::SEMICOLON, ";", line}); break;
case ',': tokens.push_back({TokenType::COMMA, ",", line}); break;
case '=': tokens.push_back({TokenType::ASSIGN, "=", line}); break;
case '<': tokens.push_back({TokenType::LT, "<", line}); break;
case '>': tokens.push_back({TokenType::GT, ">", line}); break;
default:
std::cerr << "Lexer Error: Unknown char '" << current << "' at line " << line << std::endl;
exit(1);