small fixes

This commit is contained in:
bronku 2025-11-25 16:24:09 +01:00
parent 0bc67209b9
commit 38438904dc
2 changed files with 37 additions and 31 deletions

View file

@ -8,11 +8,12 @@ enum class IndentAction
}; };
constexpr int TAB_WIDTH = 8; constexpr int TAB_WIDTH = 8;
constexpr char TAB = '\t';
class IndentStack class IndentStack
{ {
std::stack<int> indent_stack; std::stack<int> indent_stack;
int pending_dedents = 0; int dedent_queue = 0;
public: public:
IndentStack() { indent_stack.push(0); } IndentStack() { indent_stack.push(0); }
@ -32,15 +33,15 @@ public:
return IndentAction::Indent; return IndentAction::Indent;
} }
while (indent_stack.top() > spaces) while (!indent_stack.empty() && indent_stack.top() > spaces)
{ {
indent_stack.pop(); indent_stack.pop();
pending_dedents++; dedent_queue++;
} }
if (pending_dedents > 0) if (dedent_queue > 0)
{ {
pending_dedents--; dedent_queue--;
return IndentAction::Dedent; return IndentAction::Dedent;
} }
@ -49,11 +50,11 @@ public:
bool popDedent() bool popDedent()
{ {
if (pending_dedents <= 0) if (dedent_queue <= 0)
{ {
return false; return false;
} }
pending_dedents--; dedent_queue--;
return true; return true;
} }
@ -62,18 +63,24 @@ public:
int spaces = 0; int spaces = 0;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
spaces += (text[i] == '\t') ? TAB_WIDTH : 1; if (text[i] == TAB)
{
spaces += TAB_WIDTH - (spaces % TAB_WIDTH);
continue;
}
spaces++;
} }
return spaces; return spaces;
} }
bool hasRemainingDedents() bool hasRemainingDedents()
{ {
return pending_dedents > 0; return dedent_queue > 0;
} }
IndentAction closeBlock() IndentAction closeBlock()
{ {
// Force indentation reset at EOF
return updateIndentation(0); return updateIndentation(0);
} }
}; };

View file

@ -10,10 +10,10 @@
%} %}
%% %%
^[ \t]*\r?\n { /* Ignore lines containing whitespace only */ } ^[ \t]*\r?\n { /* Ignore lines containing whitespace only */ }
^[ \t]*#.*\n { /* Ignore comment-only lines */ } ^[ \t]*#.*\n { /* Ignore comment-only lines */ }
^[ \t]* { ^[ \t]+ {
int col = indent_stack.calculateColumn(yytext, yyleng); int col = indent_stack.calculateColumn(yytext, yyleng);
auto action = indent_stack.updateIndentation(col); auto action = indent_stack.updateIndentation(col);
@ -22,28 +22,27 @@
} }
\n { return yy::parser::token::TOK_NEWLINE; } \n { return yy::parser::token::TOK_NEWLINE; }
def { return yy::parser::token::TOK_KW_DEF; } def { return yy::parser::token::TOK_KW_DEF; }
if { return yy::parser::token::TOK_KW_IF; } if { return yy::parser::token::TOK_KW_IF; }
return { return yy::parser::token::TOK_KW_RETURN; } return { return yy::parser::token::TOK_KW_RETURN; }
for { return yy::parser::token::TOK_KW_FOR; } for { return yy::parser::token::TOK_KW_FOR; }
in { return yy::parser::token::TOK_KW_IN; } in { return yy::parser::token::TOK_KW_IN; }
\( { return yy::parser::token::TOK_L_PAREN; } \( { return yy::parser::token::TOK_L_PAREN; }
\) { return yy::parser::token::TOK_R_PAREN; } \) { return yy::parser::token::TOK_R_PAREN; }
\: { return yy::parser::token::TOK_COLON; } \: { return yy::parser::token::TOK_COLON; }
\= { return yy::parser::token::TOK_ASSIGN; } \= { return yy::parser::token::TOK_ASSIGN; }
\+ { return yy::parser::token::TOK_PLUS; } \+ { return yy::parser::token::TOK_PLUS; }
\- { return yy::parser::token::TOK_MINUS; } \- { return yy::parser::token::TOK_MINUS; }
\" { yymore(); BEGIN(STRING); } \" { yymore(); BEGIN(STRING); }
<STRING>\"\" { yymore(); } <STRING>\" { BEGIN(INITIAL); yylval->as<std::string>() = yytext; return yy::parser::token::TOK_STRING; }
<STRING>\" { BEGIN(INITIAL); yylval->as<std::string>() = yytext; return yy::parser::token::TOK_STRING; } <STRING>. { yymore(); }
<STRING>. { yymore(); }
[0-9]+ { yylval->as<std::string>() = yytext; return yy::parser::token::TOK_NUMBER; } [0-9]+ { yylval->as<std::string>() = yytext; return yy::parser::token::TOK_NUMBER; }
[A-Za-z_][A-Za-z0-9_]* { yylval->as<std::string>() = yytext; return yy::parser::token::TOK_IDENTIFIER; } [A-Za-z_][A-Za-z0-9_]* { yylval->as<std::string>() = yytext; return yy::parser::token::TOK_IDENTIFIER; }
<<EOF>> { return yy::parser::token::TOK_EOF; } <<EOF>> { return yy::parser::token::TOK_EOF; }
. { /* ignore other characters */ } . { }