aboutsummaryrefslogtreecommitdiff
path: root/include/lexer
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-09-08 12:26:46 +0000
committer_ov4 <ov4@ov4.org>2026-09-08 12:26:46 +0000
commitbb39c49a0dbfd0ee05ec5ac3bba96916b175fa92 (patch)
treee6b733751391ffd927c4c9ea3ec36b8c58de874e /include/lexer
parent4464bc5ba664aa1acda674df76fda7524bc16726 (diff)
add guard system
Diffstat (limited to 'include/lexer')
-rw-r--r--include/lexer/token.h58
1 files changed, 49 insertions, 9 deletions
diff --git a/include/lexer/token.h b/include/lexer/token.h
index df7ef1b..a562ac6 100644
--- a/include/lexer/token.h
+++ b/include/lexer/token.h
@@ -102,7 +102,7 @@ bool token_continue(string s, char next)
}
// handle [prev, current)
-void token_push(string push_s, int bracket_depth)
+void token_push(string push_s, int bracket_depth, bool force_text = false)
{
T_token tmp;
tmp.bracket_depth = bracket_depth;
@@ -111,13 +111,14 @@ void token_push(string push_s, int bracket_depth)
println("finding {} in map", trimmed);
- if (symbol_property.contains(trimmed)) // symbol
+ 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");
tmp.token_type = TEXT;
tmp.text = trimmed;
}
@@ -129,24 +130,63 @@ int tokenizer(string s)
if (s.size() == 0) return -1;
size_t len = s.size();
- size_t prev = 0;
size_t token_vector_index = 0;
string prev_str = "";
- bool is_in_symbol;
+ 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 {} current char {}", prev, s[i]);
+ 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;
+ }
- prev_str += s[i];
- bracket_depth_changer(s[i], bracket_depth);
+ bracket_depth_changer(c, bracket_depth);
if ((i+1 == len) || !token_continue(prev_str, s[i+1]))
{
- token_push(prev_str, bracket_depth);
+ token_push(prev_str, bracket_depth, force_text);
+ force_text = false;
prev_str = "";
continue;
}