update with initial syntaxer implementation

This commit is contained in:
2026-10-04 14:13:14 +03:00
parent 79642d3fd1
commit f00ed50d32
8 changed files with 188 additions and 10 deletions
+78
View File
@@ -0,0 +1,78 @@
#include "syntaxer.hpp"
#include "expression.hpp"
#include <vector>
#include "print.h"
namespace Syntax {
struct OpImportance
{
int pos;
int prio;
};
#if 0
std::vector<SyntaxIssue> check_syntax(std::vector<Expression::Token>& tv);
{
}
#endif
std::shared_ptr<Expression::TreeNode> build_op_tree(const std::vector<Expression::Token>& tv)
{
// define operator precedency
int prios_cnt = ({
int i = 0, c = 0, l = tv.size();
for (; i < l; c += tv[i].t == Expression::Token::OPERATOR
&& tv[i].v.o != Expression::Token::CPA
&& tv[i].v.o != Expression::Token::OPA, i++);
c;
});
OpImportance prios[prios_cnt];
for (int i = 0, p = 0, cp = 0, l = tv.size(); i < l; i++)
{
if (tv[i].t == Expression::Token::OPERATOR)
{
switch (tv[i].v.o)
{
case Expression::Token::OPA:
cp++;
break;
case Expression::Token::CPA:
cp--;
break;
case Expression::Token::ADD:
case Expression::Token::SUB:
case Expression::Token::MUL:
case Expression::Token::DIV:
case Expression::Token::POW:
prios[p].prio = cp;
prios[p].pos = i;
p++;
break;
default:
pr_warn("Token vector has broken operator at " << i);
break;
}
}
}
for (int i = 0; i < prios_cnt; i++)
{
pr_debug("pos=" << prios[i].pos << ",prio=" << prios[i].prio);
}
// build dependency graph
{
std::vector<Expression::Token> mv = tv;
}
// build operation tree
Expression::TreeNode *root = new Expression::TreeNode;
return std::shared_ptr<Expression::TreeNode>(root);
}
}