21 Commits
Author SHA1 Message Date
hasslesstech 79a96aea77 cleanup + minor fixes 2026-10-15 16:42:52 +03:00
hasslesstech ab4afb48e7 remove unneccesary operation 2026-10-15 10:16:29 +03:00
hasslesstech b15ae562fd lab2 feat: prevent division by zero in non-folded operations 2026-10-15 10:16:01 +03:00
hasslesstech 0329ed8326 fix range selection during bracket removal scanning 2026-10-15 09:58:31 +03:00
hasslesstech 4c26353876 fix get_prior_mop selector, loosen overly strict checks in remove_extra_brackets logic 2026-10-15 09:33:07 +03:00
hasslesstech 360628d65c fix logic for selecting brackets to open; same outer level op ranges select incorrectly 2026-10-15 09:03:54 +03:00
hasslesstech e837671d15 fix post-processing 2026-10-14 21:49:59 +03:00
hasslesstech 10e0a487ab failed attempt to hotfix wrong post-processing bracket adding algorithm 2026-10-14 21:45:17 +03:00
hasslesstech 1a258cd051 apply empty brackets removal until full fix 2026-10-14 21:18:27 +03:00
hasslesstech f430b3616a fix unchecked selection of brackets that caught and removed unrelated tokens 2026-10-14 21:17:32 +03:00
hasslesstech ddcf261af7 remove excessive debug logging from Parser 2026-10-14 21:16:09 +03:00
hasslesstech 89335fbdc6 fix remove_extra_brackets undoing work of post-processing step 2026-10-14 20:44:20 +03:00
hasslesstech 1b4693029f update config 2026-10-14 20:31:24 +03:00
hasslesstech e8c2293b50 add bracket opening logs 2026-10-14 20:31:10 +03:00
hasslesstech 0d39290709 fix infitite search for prior operator when opening brackets 2026-10-14 20:07:28 +03:00
hasslesstech 84d28d3845 rework syntax checks, rework priority correction algorithm 2026-10-14 19:57:02 +03:00
hasslesstech 433ee2bb2e lab2 feat: add constant folding 2026-10-14 15:16:08 +03:00
hasslesstech 35e38127e7 add essential token preprocessing 2026-10-14 12:00:41 +03:00
hasslesstech 1d056a736f improve output stage naming 2026-10-12 23:55:16 +03:00
hasslesstech a94e584f35 add color highlighting during token post-processing 2026-10-12 21:59:50 +03:00
hasslesstech d97160e6ed fix missing bracket folds for SUB and DIV operator replacement parallelization 2026-10-12 21:29:02 +03:00
9 changed files with 1149 additions and 493 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
SET(CMAKE_CXX_FLAGS_DEBUG "-g") SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra -Wpedantic")
project(pzks) project(pzks)
+3
View File
@@ -4,3 +4,6 @@
#define PRINT_DISABLE_PREFIXES 1 #define PRINT_DISABLE_PREFIXES 1
#define MAX_TOKEN_STRING_LEN 256 #define MAX_TOKEN_STRING_LEN 256
#define LAB2_EXCLUDE_COMPTIME_OP_WRITES 1
#define LAB2_PREVENT_NON_FOLDED_DIV_BY_ZERO 1
+58 -2
View File
@@ -52,6 +52,7 @@ public:
} }
explicit TokenValue(void) explicit TokenValue(void)
: s(std::shared_ptr<std::string>())
{ {
} }
@@ -144,6 +145,7 @@ public:
switch (t) switch (t)
{ {
case VAR: case VAR:
new(&v.s) std::shared_ptr<std::string>;
v.s = other.v.s; v.s = other.v.s;
break; break;
case CONST: case CONST:
@@ -174,7 +176,6 @@ public:
return v.s; return v.s;
case CONST: case CONST:
{ {
char buffer[128] = {0};
return std::make_shared<std::string>((std::ostringstream() << v.d).str()); return std::make_shared<std::string>((std::ostringstream() << v.d).str());
} }
case OPERATOR: case OPERATOR:
@@ -192,11 +193,14 @@ public:
return v.s; return v.s;
case CONST: case CONST:
{ {
char buffer[128] = {0};
return std::make_shared<std::string>((std::ostringstream() << v.d).str()); return std::make_shared<std::string>((std::ostringstream() << v.d).str());
} }
case OPERATOR: case OPERATOR:
return std::make_shared<std::string>(op_math_str()); return std::make_shared<std::string>(op_math_str());
case CV:
return std::make_shared<std::string>((std::ostringstream() << "t" << v.cv.i).str());
case NAT:
return std::make_shared<std::string>("");
default: default:
return std::make_shared<std::string>("Not a valid token!"); return std::make_shared<std::string>("Not a valid token!");
} }
@@ -272,6 +276,58 @@ public:
return "Invalid operator"; return "Invalid operator";
} }
} }
int negative_operator(void) const
{
if (t != OPERATOR)
{
return 0;
}
return (v.o == SUB || v.o == DIV);
}
static int is_negative(Operator o)
{
return (o == SUB || o == DIV);
}
int is_math_op(void) const
{
if (t != OPERATOR)
{
return 0;
}
switch (v.o)
{
case OPA:
case CPA:
return 0;
default:
return 1;
}
}
int is_opa(void) const
{
if (t != OPERATOR)
{
return 0;
}
return v.o == OPA;
}
int is_cpa(void) const
{
if (t != OPERATOR)
{
return 0;
}
return v.o == CPA;
}
}; };
struct Operation struct Operation
+1
View File
@@ -9,5 +9,6 @@ std::vector<Expression::Token> tokenize_input(const char * const input_string);
int assert_same(const std::vector<Expression::Token>& a, const std::vector<Expression::Token>& b); int assert_same(const std::vector<Expression::Token>& a, const std::vector<Expression::Token>& b);
void print_token_vector(const std::vector<Expression::Token>& tv); void print_token_vector(const std::vector<Expression::Token>& tv);
void print_math_vector(const std::vector<Expression::Token>& tv); void print_math_vector(const std::vector<Expression::Token>& tv);
void print_math_vector(const std::vector<Expression::Token>& tv, const std::vector<int>& highlight_locations);
} }
+1 -2
View File
@@ -6,8 +6,7 @@
namespace Syntax namespace Syntax
{ {
int check_syntax(std::vector<Expression::Token>& tv); int prepare_token_vector(std::vector<Expression::Token>& tv);
void apply_corrections(std::vector<Expression::Token>& tv);
std::vector<Expression::Operation> build_op_vector(const std::vector<Expression::Token>& tv); std::vector<Expression::Operation> build_op_vector(const std::vector<Expression::Token>& tv);
Expression::TreeNode ov_to_tree(const std::vector<Expression::Token> tv, const std::vector<Expression::Operation>& ov); Expression::TreeNode ov_to_tree(const std::vector<Expression::Token> tv, const std::vector<Expression::Operation>& ov);
void print_op_tree(const std::vector<Expression::Token> tv, const std::vector<Expression::Operation>& ov); void print_op_tree(const std::vector<Expression::Token> tv, const std::vector<Expression::Operation>& ov);
+1 -3
View File
@@ -10,13 +10,11 @@ int main(int argc, char **argv)
std::vector<Expression::Token> tv = Parser::tokenize_input(argv[1]); std::vector<Expression::Token> tv = Parser::tokenize_input(argv[1]);
if (Syntax::check_syntax(tv)) if (Syntax::prepare_token_vector(tv))
{ {
return 0; return 0;
} }
Syntax::apply_corrections(tv);
std::vector<Expression::Operation> ov = Syntax::build_op_vector(tv); std::vector<Expression::Operation> ov = Syntax::build_op_vector(tv);
Expression::TreeNode root = Syntax::ov_to_tree(tv, ov); Expression::TreeNode root = Syntax::ov_to_tree(tv, ov);
+29 -4
View File
@@ -35,8 +35,6 @@ class Parser
int switch_state(enum State e) int switch_state(enum State e)
{ {
pr_debug("Leaving " << state_str(s) << ", entering " << state_str(e));
int cumulative_backtrack = 0; int cumulative_backtrack = 0;
switch (s) switch (s)
@@ -79,8 +77,6 @@ class Parser
s = e; s = e;
pr_debug("Cumulative backtrack is " << cumulative_backtrack);
return cumulative_backtrack; return cumulative_backtrack;
} }
@@ -397,4 +393,33 @@ void print_math_vector(const std::vector<Expression::Token>& tv)
} }
} }
void print_math_vector(const std::vector<Expression::Token>& tv, const std::vector<int>& highlight_locations)
{
int i, l, h, hl;
for (i = 0, l = tv.size() - 1, h = 0, hl = highlight_locations.size(); i < l; i++)
{
if (h < hl && highlight_locations[h] == i)
{
std::cout << "\033[31m" << *tv[i].to_math_str() << "\033[0m";
h++;
}
else
{
std::cout << *tv[i].to_math_str();;
}
}
if (tv.size())
{
if (highlight_locations[highlight_locations.size()-1] == (long) (tv.size() - 1))
{
std::cout << "\033[31m" << *tv[tv.size() - 1].to_math_str() << "\033[0m\n";
}
else
{
std::cout << *tv[tv.size() - 1].to_math_str() << "\n";
}
}
}
} }
+1051 -480
View File
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -99,7 +99,10 @@ TEST(tree_proper_test_1)
TEST(tree_proper_test_2) TEST(tree_proper_test_2)
{ {
std::vector<Expression::Token> o = Parser::tokenize_input("(1**5 * (1-2-3-4-5-6-7-8))"); std::vector<Expression::Token> o = Parser::tokenize_input("(1**5 * (1-2-3-4-5-6-7-8))");
Syntax::apply_corrections(o); if (Syntax::prepare_token_vector(o))
{
return 1;
}
std::vector<Expression::Operation> ov = Syntax::build_op_vector(o); std::vector<Expression::Operation> ov = Syntax::build_op_vector(o);
return 0; return 0;