Условные конструкции, циклы, массивы и библтотеки
This commit is contained in:
+31
-7
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user