1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#pragma once
#include "c10/util/irange.h"
#include <iostream>
#include <string>
#include <vector>
struct ASTExpr {
std::string name = "";
std::vector<ASTExpr*> children;
bool isCallFlag = false;
bool starInputsFlag = false;
~ASTExpr() {
for (ASTExpr* e : children)
delete e;
}
bool isCall() const {
return isCallFlag;
}
bool starInputs() const {
return starInputsFlag;
}
void dump(int level = 0) const {
for (const auto i : c10::irange(level))std::cout << " ";
if (!isCall())
std::cout << "Var: " << name << std::endl;
else {
std::cout << "Function: " << name << ", args: " << std::endl;
for (auto* e : children) {
e->dump(level + 1);
}
}
}
};
struct ASTStmt {
std::vector<std::string> lhs;
ASTExpr* rhs = NULL;
~ASTStmt() {
delete rhs;
}
void dump(int level = 0) const {
for (const auto i : c10::irange(level))std::cout << " ";
std::cout << "LHS:" << std::endl;
for (auto s : lhs) {
for (int i = 0; i < level + 1; i++)
std::cout << " ";
std::cout << s << std::endl;
}
rhs->dump(level);
}
};
struct ASTGraph {
std::string name;
std::vector<ASTStmt*> stmts;
~ASTGraph() {
for (auto s : stmts)
delete s;
}
void dump() const {
std::cout << "GRAPH: " << name << std::endl;
for (auto s : stmts)
s->dump(1);
}
};
extern std::vector<void*> tokens;
extern std::vector<void*> tokenVectors;
std::string* allocString();
std::vector<void*>* allocVector();
void parseString(const char*, ASTGraph*);
void parseFile(const char*, ASTGraph*);
|