update with initial syntaxer implementation
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user