Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/construct.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ int main(int argc, char** argv)
glob_cmd->command = "global _start";
tokens.insert(tokens.begin(), glob_tok);

// Order dependant: some tokens are replaced with macros, so apply_macro() must be at the end.
tokens = delinearize_tokens(tokens);
apply_functions(tokens);
apply_ifs(tokens);
Expand Down
24 changes: 12 additions & 12 deletions src/construct_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,16 @@ struct con_token {
struct con_while* tok_while;
struct con_if* tok_if;
struct con_function* tok_function;
struct con_funcall* tok_funcall;
struct con_cmd* tok_cmd;
struct con_macro* tok_macro;
struct con_funcall* tok_funcall;
std::vector<con_token*> tokens; // Only non-empty for if, while and function tokens
};

struct con_macro {
std::string value;
std::string macro;
struct _con_condition {
CON_COMPARISON op;
std::string arg1;
std::string arg2;
};

struct con_section {
Expand All @@ -59,18 +60,12 @@ struct con_tag {
std::string name;
};

struct con_condition {
CON_COMPARISON op;
std::string arg1;
std::string arg2;
};

struct con_while {
con_condition condition;
_con_condition condition;
};

struct con_if {
con_condition condition;
_con_condition condition;
};

struct con_function {
Expand All @@ -84,6 +79,11 @@ struct con_cmd {
std::string arg2;
};

struct con_macro {
std::string value;
std::string macro;
};

struct con_funcall {
std::string funcname;
std::vector<std::string> arguments;
Expand Down
109 changes: 54 additions & 55 deletions src/deconstruct.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,20 +81,20 @@ int get_line_indentation(string line)
// Expects formatted line
CON_TOKENTYPE get_token_type(string line)
{
if (line[0] == '!')
return MACRO;
if (line.substr(0, 3) == "if ")
return IF;
if (line.substr(0, 8) == "section ")
return SECTION;
if (line.find(' ') == string::npos && line[line.size()-1] == ':')
return TAG;
if (line.substr(0, 6) == "while ")
return WHILE;
if (line.substr(0, 3) == "if ")
return IF;
if (line.substr(0, 9) == "function ")
return FUNCTION;
if (line.substr(0, 8) == "section ")
return SECTION;
if (line[0] == '!')
return MACRO;
if (line.substr(0, 5) == "call " && line.find('(') != string::npos && line.find(')') != string::npos)
return FUNCALL;
if (line.find(' ') == string::npos && line[line.size()-1] == ':')
return TAG;
return CMD;
}

Expand Down Expand Up @@ -161,24 +161,19 @@ vector<con_token*> delinearize_tokens(std::vector<con_token*> tokens)
return delinearized_tokens;
}

con_macro* parse_macro(string line)
{
con_macro* tok_macro = new con_macro();
int spacepos = line.find(' ');
tok_macro->macro = line.substr(1, spacepos-1);
tok_macro->value = line.substr(spacepos+1, line.size()-spacepos-1);
return tok_macro;
}

con_if* parse_if(string line)
con_section* parse_section(string line)
{
con_if* tok_if = new con_if();
con_section* tok_section = new con_section();
vector<string> line_split;
split(line_split, line, IsAnyOf(" "));
tok_if->condition.arg1 = line_split[1];
tok_if->condition.op = str_to_comparison(line_split[2]);
tok_if->condition.arg2 = line_split[3].substr(0, line_split[3].size()-1);
return tok_if;
tok_section->name = line_split[1];
return tok_section;
}
con_tag* parse_tag(string line)
{
con_tag* tok_tag = new con_tag();
tok_tag->name = line.substr(0, line.size()-1);
return tok_tag;
}
con_while* parse_while(string line)
{
Expand All @@ -190,19 +185,29 @@ con_while* parse_while(string line)
tok_while->condition.arg2 = line_split[3].substr(0, line_split[3].size()-1); // to remove :
return tok_while;
}
con_section* parse_section(string line)
con_if* parse_if(string line)
{
con_section* tok_section = new con_section();
con_if* tok_if = new con_if();
vector<string> line_split;
split(line_split, line, IsAnyOf(" "));
tok_section->name = line_split[1];
return tok_section;
tok_if->condition.arg1 = line_split[1];
tok_if->condition.op = str_to_comparison(line_split[2]);
tok_if->condition.arg2 = line_split[3].substr(0, line_split[3].size()-1);
return tok_if;
}
con_tag* parse_tag(string line)
con_function* parse_function(string line)
{
con_tag* tok_tag = new con_tag();
tok_tag->name = line.substr(0, line.size()-1);
return tok_tag;
con_function* tok_function = new con_function();
vector<string> line_split;
split(line_split, line, IsAnyOf("():,"));
tok_function->name = line_split[0].substr(9, line_split[0].size()-9);
for (size_t i = 1; i < line_split.size()-2; i++) {
if (line_split[i].empty()) {
continue;
}
tok_function->arguments.push_back(line_split[i]); // macros filter out spaces anyway when applied
}
return tok_function;
}
con_cmd* parse_cmd(string line)
{
Expand All @@ -216,19 +221,13 @@ con_cmd* parse_cmd(string line)
tok_cmd->arg2 = line_split[3];
return tok_cmd;
}
con_function* parse_function(string line)
con_macro* parse_macro(string line)
{
con_function* tok_function = new con_function();
vector<string> line_split;
split(line_split, line, IsAnyOf("():,"));
tok_function->name = line_split[0].substr(9, line_split[0].size()-9);
for (size_t i = 1; i < line_split.size()-2; i++) {
if (line_split[i].empty()) {
continue;
}
tok_function->arguments.push_back(line_split[i]); // macros filter out spaces anyway when applied
}
return tok_function;
con_macro* tok_macro = new con_macro();
int spacepos = line.find(' ');
tok_macro->macro = line.substr(1, spacepos-1);
tok_macro->value = line.substr(spacepos+1, line.size()-spacepos-1);
return tok_macro;
}
con_funcall* parse_funcall(string line)
{
Expand Down Expand Up @@ -267,29 +266,29 @@ con_token* parse_line(string line)
}
token->tok_type = get_token_type(f_line);
switch (token->tok_type) {
case MACRO:
token->tok_macro = parse_macro(f_line);
case SECTION:
token->tok_section = parse_section(f_line);
break;
case IF:
token->tok_if = parse_if(f_line);
case TAG:
token->tok_tag = parse_tag(f_line);
break;
case WHILE:
token->tok_while = parse_while(f_line);
break;
case IF:
token->tok_if = parse_if(f_line);
break;
case FUNCTION:
token->tok_function = parse_function(f_line);
break;
case FUNCALL:
token->tok_funcall = parse_funcall(f_line);
case SECTION:
token->tok_section = parse_section(f_line);
break;
case TAG:
token->tok_tag = parse_tag(f_line);
break;
case CMD:
token->tok_cmd = parse_cmd(f_line);
break;
case MACRO:
token->tok_macro = parse_macro(f_line);
break;
case FUNCALL:
token->tok_funcall = parse_funcall(f_line);
}
return token;
}
Expand Down
9 changes: 5 additions & 4 deletions src/deconstruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ CON_COMPARISON str_to_comparison(std::string comp);

std::vector<con_token*> delinearize_tokens(std::vector<con_token*> tokens);

con_macro* parse_macro(std::string line);
con_if* parse_if(std::string line);
con_while* parse_while(std::string line);
con_section* parse_section(std::string line);
con_tag* parse_tag(std::string line);
con_cmd* parse_cmd(std::string line);
con_while* parse_while(std::string line);
con_if* parse_if(std::string line);
con_function* parse_function(std::string line);
con_cmd* parse_cmd(std::string line);
con_macro* parse_macro(std::string line);
con_funcall* parse_funcall(std::string line);

con_token* parse_line(std::string line);
std::vector<con_token*> parse_construct(std::string code);

Expand Down
Loading