From ba9a9199d01b0fdd4bf9a54914f8058bf71f30c5 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Thu, 17 Apr 2025 16:03:01 +0000
Subject: [PATCH] unary and binary operations
---
src/Lexer/Lexer.hpp | 65 +++++++++++++++++++++++---------
1 files changed, 46 insertions(+), 19 deletions(-)
diff --git a/src/Lexer/Lexer.hpp b/src/Lexer/Lexer.hpp
index 737ec1d..4bd0ecf 100644
--- a/src/Lexer/Lexer.hpp
+++ b/src/Lexer/Lexer.hpp
@@ -1,14 +1,15 @@
#ifndef LEXER_HPP
#define LEXER_HPP
-#include <algorithm> // std::find_if
-#include <cctype> // <<< Hozzáadva
+#include <algorithm>
+#include <cctype>
#include <string>
-#include <string_view> // <<< Hozzáadva
+#include <string_view>
#include <unordered_map>
#include <vector>
-#include "Token.hpp" // Feltételezzük, hogy ez a fenti Token.hpp
+#include "Symbols/SymbolContainer.hpp"
+#include "Token.hpp"
namespace Lexer {
class Lexer {
@@ -32,14 +33,13 @@
column_numbers_[ns] = 1;
}
- void setNamespace(const std::string & ns) { current_namespace_ = ns; }
-
std::vector<Tokens::Token> tokenizeNamespace(const std::string & ns) {
if (inputs_.find(ns) == inputs_.end()) {
return {};
}
- setNamespace(ns);
+ Symbols::SymbolContainer::instance()->enter(ns);
+
std::vector<Tokens::Token> tokens;
Tokens::Token token;
do {
@@ -73,7 +73,7 @@
if (isalpha(c) || c == '_') {
return matchIdentifierOrKeyword(start);
}
- if (isdigit(c) || (isdigit(c) && peek(1) == '.')|| (c == '.' && isdigit(peek(1)))) {
+ if (isdigit(c) || (isdigit(c) && peek(1) == '.') || (c == '.' && isdigit(peek(1)))) {
return matchNumber(start);
}
if (c == '"' || c == '\'') {
@@ -96,7 +96,6 @@
std::unordered_map<std::string, int> column_numbers_;
std::string operators_;
- std::string current_namespace_;
std::unordered_map<std::string, Tokens::Type> keywords;
// two chars
@@ -109,13 +108,41 @@
static const std::vector<std::string> OPERATOR_ARITHMETIC;
static const std::vector<std::string> PUNCTUATION;
- const std::string & input() const { return inputs_.at(current_namespace_); }
+ const std::string & input() const {
+ const auto & ns = Symbols::SymbolContainer::instance()->currentScopeName();
+ auto it = inputs_.find(ns);
+ if (it != inputs_.end()) {
+ return it->second;
+ }
+ throw std::runtime_error("Input not found in namespace: " + ns);
+ }
- size_t & pos() { return positions_[current_namespace_]; }
+ size_t & pos() {
+ const auto & ns = Symbols::SymbolContainer::instance()->currentScopeName();
+ auto it = positions_.find(ns);
+ if (it != positions_.end()) {
+ return it->second;
+ }
+ throw std::runtime_error("Unknown position in namespace: " + ns);
+ }
- int & line() { return line_numbers_[current_namespace_]; }
+ int & line() {
+ const auto & ns = Symbols::SymbolContainer::instance()->currentScopeName();
+ auto it = line_numbers_.find(ns);
+ if (it != line_numbers_.end()) {
+ return it->second;
+ }
+ throw std::runtime_error("Unknown line number in namespace: " + ns);
+ }
- int & col() { return column_numbers_[current_namespace_]; }
+ int & col() {
+ const auto & ns = Symbols::SymbolContainer::instance()->currentScopeName();
+ auto it = column_numbers_.find(ns);
+ if (it != column_numbers_.end()) {
+ return it->second;
+ }
+ throw std::runtime_error("Unknown column number in namespace: " + ns);
+ }
Tokens::Token createToken(Tokens::Type type, size_t start, size_t end, const std::string & value = "") {
Tokens::Token token;
@@ -134,8 +161,9 @@
// --------------------------------------
char peek(size_t offset = 0) const {
- const auto & in = inputs_.at(current_namespace_);
- size_t cp = positions_.at(current_namespace_);
+ const auto & ns = Symbols::SymbolContainer::instance()->currentScopeName();
+ const auto & in = inputs_.at(ns);
+ size_t cp = positions_.at(ns);
if (cp + offset >= in.length()) {
return '\0';
}
@@ -154,10 +182,9 @@
return c;
}
- bool isAtEnd() const { return positions_.at(current_namespace_) >= inputs_.at(current_namespace_).length(); }
-
- bool isComment(const char current_char) const {
- return (current_char == '/' && peek(1) == '/' || current_char == '#');
+ bool isAtEnd() const {
+ const auto & ns = Symbols::SymbolContainer::instance()->currentScopeName();
+ return positions_.at(ns) >= inputs_.at(ns).length();
}
void skipWhitespaceAndComments() {
--
Gitblit v1.9.3