diff options
| author | _ov4 <ov4@ov4.org> | 2026-09-09 10:57:22 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-09-09 10:57:22 +0000 |
| commit | 7ec58e8db1096e7916f99b84011ddb13a010da75 (patch) | |
| tree | e3da5c2c45a53881e5c86d5a6b53b48c178684db /src/lexer/token.cc | |
| parent | 39715efcc89480be7e1c4f89946c680e05496a25 (diff) | |
separate compilation
Diffstat (limited to 'src/lexer/token.cc')
| -rw-r--r-- | src/lexer/token.cc | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/lexer/token.cc b/src/lexer/token.cc new file mode 100644 index 0000000..2b88b7e --- /dev/null +++ b/src/lexer/token.cc @@ -0,0 +1,190 @@ +#include "lexer/token.h" + +#include <string> +#include <iostream> +#include <print> + +#include "lexer/lexer_class.h" +#include "lexer/enum_type.h" +#include "lexer/symbol_property.h" + +using namespace std; // remove this + +namespace ov4 +{ + +string T_lexer::trim(const string &s, const string &trim_target) // trim_target = " \t" +{ + size_t b = s.find_first_not_of(trim_target); + if (b == string::npos) + return ""; + size_t e = s.find_last_not_of(trim_target); + return s.substr(b, e - b + 1); +} + + +bool T_lexer::is_single_symbol(char c) +{ + string s = " "; + s[0] = c; + if (symbol_property.contains(s)) + return true; + return false; +} + +void T_lexer::bracket_depth_changer(char c, int &bracket_depth) +{ + if (c == '(') + { + bracket_depth++; + println("changed depth: {}", bracket_depth); + return; + } + if (c == ')') + { + bracket_depth--; + println("changed depth: {}", bracket_depth); + if (bracket_depth < 0) + { + cerr << "Ooooops bracket unmatched, quitting" << endl; + exit(-1); // TODO: std::expected or what, rather than quitting + } + return; + } +} + + +bool T_lexer::token_continue(const string &s, char next) +{ + println("token_continue: receiving {} {}", s, next); + // s is empty, so next can be part of the token + if (s.size() == 0) return true; + + // text -> text/symbol + if (!is_single_symbol(s[s.size()-1])) + { + // text -> symbol + if (is_single_symbol(next)) + return false; + + // text still + return true; + } + + // symbol -> symbol + T_property tmp; + if (symbol_property.contains(s)) + { + tmp = symbol_property[s]; + if (tmp.continuable) + { + string prev_and_next = s + next; + if (symbol_property.contains(prev_and_next)) + return true; + return false; + } + return false; + } + else + { + println("symbol not found in map"); + return false; + } +} + +// handle [prev, current) +void T_lexer::token_push(const string &push_s, int bracket_depth, bool force_text) // force_text = false +{ + T_token tmp; + tmp.bracket_depth = bracket_depth; + string trimmed = trim(push_s); + if (trimmed == "") return; + + println("finding {} in map", trimmed); + + if (symbol_property.contains(trimmed) && !force_text) // symbol + { + println("token_push: adding symbol"); + tmp.token_type = symbol_property[trimmed].enum_type; + } + else + { + println("token_push: adding text"); + if (force_text) + trimmed = trim(trimmed, "\'\""); + tmp.token_type = TEXT; + tmp.text = trimmed; + } + token.push_back(tmp); +} + +int T_lexer::tokenizer(const string &s) +{ + if (s.size() == 0) return -1; + + size_t len = s.size(); + size_t token_vector_index = 0; + string prev_str = ""; + bool force_text = false; + int bracket_depth = 0; + guard_type guard = GUARD_OFF; + + + for (size_t i = 0; i < len; i++) + { + + char c = s[i]; + + prev_str += c; + + println("---"); + println("prev_str .{}. next char {}", prev_str, s[i+1]); + + if (c == '\'' || c == '\"') + { + println("quotation"); + + // turn on GUARD + if (guard == GUARD_OFF) + { + guard = (c == '\'') ? GUARD_STRONG : GUARD_WEAK; + println("set guard {}", (c == '\'') ? "GUARD_STRONG" : "GUARD_WEAK"); + continue; + } + // turn off + else if (guard == GUARD_STRONG && c == '\'') + { + guard = GUARD_OFF; + println("quitting strong guard"); + force_text = true; + } + //turn off + else if (guard == GUARD_WEAK && c == '\"') + { + guard = GUARD_OFF; + println("quitting weak guard"); + force_text = true; + } else + continue; + } + // not quotation mark + else if ((guard == GUARD_STRONG || guard == GUARD_WEAK)) + { + println("tokenizer: guarded, continue"); + continue; + } + + bracket_depth_changer(c, bracket_depth); + + if ((i+1 == len) || !token_continue(prev_str, s[i+1])) + { + token_push(prev_str, bracket_depth, force_text); + force_text = false; + prev_str = ""; + continue; + } + } + return 0; +} + +} |
