Compare commits

...
16 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
8 changed files with 1072 additions and 546 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
+54 -3
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:
@@ -186,8 +187,6 @@ public:
std::shared_ptr<std::string> to_math_str(void) const std::shared_ptr<std::string> to_math_str(void) const
{ {
char buffer[128] = {0};
switch (t) switch (t)
{ {
case VAR: case VAR:
@@ -277,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 -3
View File
@@ -6,9 +6,7 @@
namespace Syntax namespace Syntax
{ {
void pre_process(std::vector<Expression::Token>& tv); int prepare_token_vector(std::vector<Expression::Token>& tv);
int check_syntax(const std::vector<Expression::Token>& tv);
void post_process(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 -5
View File
@@ -10,15 +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]);
Syntax::pre_process(tv); if (Syntax::prepare_token_vector(tv))
if (Syntax::check_syntax(tv))
{ {
return 0; return 0;
} }
Syntax::post_process(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);
+1 -5
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;
} }
@@ -415,7 +411,7 @@ void print_math_vector(const std::vector<Expression::Token>& tv, const std::vect
if (tv.size()) if (tv.size())
{ {
if (highlight_locations[highlight_locations.size()-1] == tv.size() - 1) 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"; std::cout << "\033[31m" << *tv[tv.size() - 1].to_math_str() << "\033[0m\n";
} }
+1007 -528
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::post_process(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;