Formatting.
parent
2d649a149b
commit
0e6bdecf2a
|
@ -4,33 +4,26 @@
|
||||||
Parser::Parser(Context * context)
|
Parser::Parser(Context * context)
|
||||||
{
|
{
|
||||||
this->context = context;
|
this->context = context;
|
||||||
error_message = "***ERRORS DURING PARSING***\n";
|
error_message = "***ERRORS DURING PARSING***\n";
|
||||||
position_in_stream = 0;
|
position_in_stream = 0;
|
||||||
in_statement = false;
|
in_statement = false;
|
||||||
program = static_cast<ProgramNode *>(tree.root);
|
program = static_cast<ProgramNode *>(tree.root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Parser::~Parser()
|
Parser::~Parser()
|
||||||
{
|
{
|
||||||
//dtor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Parser::erase_all()
|
void Parser::erase_all()
|
||||||
{
|
{
|
||||||
/*tree.delete_all_children();
|
|
||||||
tree.root = new ProgramNode();
|
|
||||||
*/
|
|
||||||
|
|
||||||
error_message = "***ERRORS DURING PARSING***\n";
|
error_message = "***ERRORS DURING PARSING***\n";
|
||||||
|
|
||||||
position_in_stream = 0;
|
position_in_stream = 0;
|
||||||
in_statement = false;
|
in_statement = false;
|
||||||
this->token_stream = vector<Token>();
|
this->token_stream = vector<Token>();
|
||||||
delete program;
|
delete program;
|
||||||
program = new ProgramNode();
|
program = new ProgramNode();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
string Parser::show_tokens()
|
string Parser::show_tokens()
|
||||||
{
|
{
|
||||||
|
@ -53,79 +46,74 @@ void Parser::add_tokens(vector<Token> tokens)
|
||||||
|
|
||||||
void Parser::error(string s)
|
void Parser::error(string s)
|
||||||
{
|
{
|
||||||
error_message += s ;
|
error_message += s ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::read_next()
|
bool Parser::read_next()
|
||||||
{
|
{
|
||||||
if(position_in_stream < token_stream.size())
|
if(position_in_stream < token_stream.size())
|
||||||
{
|
{
|
||||||
current_token = token_stream[position_in_stream];
|
current_token = token_stream[position_in_stream];
|
||||||
tok_value = current_token.get_value();
|
tok_value = current_token.get_value();
|
||||||
position_in_stream++;
|
position_in_stream++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
current_token = Token(t_invalid_token, "");
|
current_token = Token(t_invalid_token, "");
|
||||||
tok_value = current_token.get_value();
|
tok_value = current_token.get_value();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Parser::interpret()
|
void Parser::interpret()
|
||||||
{
|
{
|
||||||
read_next();
|
read_next();
|
||||||
while(tok_value!= "")
|
while(tok_value!= "")
|
||||||
{
|
{
|
||||||
program->add_statement(statement());
|
program->add_statement(statement());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::peek(string s)
|
bool Parser::peek(string s)
|
||||||
{
|
{
|
||||||
return tok_value == s;
|
return tok_value == s;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::accept(string s)
|
bool Parser::accept(string s)
|
||||||
{
|
{
|
||||||
if(peek(s))
|
if(peek(s))
|
||||||
{
|
{
|
||||||
read_next();
|
read_next();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::expect(string s)
|
bool Parser::expect(string s)
|
||||||
{
|
{
|
||||||
if(!accept(s))
|
if(!accept(s))
|
||||||
{
|
{
|
||||||
string error_message = "Error: expected ";
|
string error_message = "Error: expected ";
|
||||||
error_message += s;
|
error_message += s;
|
||||||
error_message += " but received: " + tok_value + "\n";
|
error_message += " but received: " + tok_value + "\n";
|
||||||
|
error(error_message);
|
||||||
error(error_message);
|
return false;
|
||||||
return false;
|
}
|
||||||
}
|
else return true;
|
||||||
else return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::is_type()
|
bool Parser::is_type()
|
||||||
{
|
{
|
||||||
|
if(tok_value == "def" || tok_value == "string" || tok_value == "num")
|
||||||
if(tok_value == "def" || tok_value == "string" || tok_value == "num")
|
{
|
||||||
{
|
read_next();
|
||||||
read_next();
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
else
|
return false;
|
||||||
{
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parser::is_function_name()
|
bool Parser::is_function_name()
|
||||||
|
@ -139,129 +127,105 @@ bool Parser::is_function_name()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTStatement * Parser::statement()
|
ASTStatement * Parser::statement()
|
||||||
{
|
{
|
||||||
BasicStatement * stat = new BasicStatement();
|
BasicStatement * stat = new BasicStatement();
|
||||||
|
if(accept("{"))
|
||||||
|
{
|
||||||
|
while(!accept("}"))
|
||||||
|
{
|
||||||
|
stat->children.push_back( statement());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(is_type())
|
||||||
|
{
|
||||||
|
DeclarationStatement * declaration = new DeclarationStatement(context);
|
||||||
|
std::string identifier = tok_value;
|
||||||
|
read_next();
|
||||||
|
declaration->add_name(identifier);
|
||||||
|
if(accept("="))
|
||||||
|
{
|
||||||
|
ASTExpression * ae = expr();
|
||||||
|
declaration->add_right_value(ae);
|
||||||
|
accept(";");
|
||||||
|
}
|
||||||
|
if(expect("("))
|
||||||
|
{
|
||||||
|
int argc = 0;
|
||||||
|
while(tok_value != ")")
|
||||||
|
{
|
||||||
|
argc++;
|
||||||
|
is_type();
|
||||||
|
|
||||||
|
declaration->add_argument(tok_value);
|
||||||
|
read_next();
|
||||||
|
if(peek(")"))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
expect(",");
|
||||||
|
}
|
||||||
|
expect(")");
|
||||||
|
if(!accept(";"))
|
||||||
|
{
|
||||||
|
|
||||||
|
declaration->add_body(statement());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete stat;
|
||||||
|
return declaration;
|
||||||
|
}
|
||||||
|
else if(accept("if"))
|
||||||
|
{
|
||||||
|
IfNode * ifStatement = new IfNode();
|
||||||
|
ifStatement->add_condition(expr());
|
||||||
|
ifStatement->add_body(statement());
|
||||||
|
if(accept("else"))
|
||||||
|
{
|
||||||
|
ifStatement->add_else_block(statement());
|
||||||
|
}
|
||||||
|
delete stat;
|
||||||
|
return ifStatement;
|
||||||
|
}
|
||||||
|
else if(accept("repeat"))
|
||||||
|
{
|
||||||
|
RepeatStatement * repeat = new RepeatStatement();
|
||||||
|
repeat->add_iteration_number(expr()->evaluate());
|
||||||
|
repeat->add_body(statement());
|
||||||
|
delete stat;
|
||||||
|
return repeat;
|
||||||
|
}
|
||||||
|
else if(accept("while"))
|
||||||
|
{
|
||||||
|
WhileNode * while_node = new WhileNode();
|
||||||
|
while_node->add_condition(expr());
|
||||||
|
while_node->add_body(statement());
|
||||||
|
delete stat;
|
||||||
|
return while_node;
|
||||||
|
}
|
||||||
|
else if(accept("return"))
|
||||||
|
{
|
||||||
|
if(!peek(";"))
|
||||||
|
{
|
||||||
|
stat->add_expression(expr());
|
||||||
|
}
|
||||||
|
expect(";");
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stat->add_expression(expr());
|
||||||
|
while(!expect(";") && tok_value != "") read_next();
|
||||||
|
return stat;
|
||||||
|
|
||||||
if(accept("{"))
|
}
|
||||||
{
|
return stat;
|
||||||
while(!accept("}"))
|
|
||||||
{
|
|
||||||
stat->children.push_back( statement());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
else if(is_type())
|
|
||||||
{
|
|
||||||
DeclarationStatement * declaration = new DeclarationStatement(context);
|
|
||||||
std::string identifier = tok_value;
|
|
||||||
|
|
||||||
read_next();
|
|
||||||
|
|
||||||
declaration->add_name(identifier);
|
|
||||||
|
|
||||||
if(accept("="))
|
|
||||||
{
|
|
||||||
ASTExpression * ae = expr();
|
|
||||||
declaration->add_right_value(ae);
|
|
||||||
accept(";");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(expect("("))
|
|
||||||
{
|
|
||||||
int argc = 0;
|
|
||||||
while(tok_value != ")")
|
|
||||||
{
|
|
||||||
argc++;
|
|
||||||
is_type();
|
|
||||||
|
|
||||||
declaration->add_argument(tok_value);
|
|
||||||
read_next();
|
|
||||||
if(peek(")"))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
expect(",");
|
|
||||||
}
|
|
||||||
expect(")");
|
|
||||||
|
|
||||||
if(!accept(";"))
|
|
||||||
{
|
|
||||||
|
|
||||||
declaration->add_body(statement());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
delete stat;
|
|
||||||
return declaration;
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(accept("if"))
|
|
||||||
{
|
|
||||||
IfNode * ifStatement = new IfNode();
|
|
||||||
ifStatement->add_condition(expr());
|
|
||||||
ifStatement->add_body(statement());
|
|
||||||
if(accept("else"))
|
|
||||||
{
|
|
||||||
ifStatement->add_else_block(statement());
|
|
||||||
}
|
|
||||||
|
|
||||||
delete stat;
|
|
||||||
return ifStatement;
|
|
||||||
}
|
|
||||||
else if(accept("repeat"))
|
|
||||||
{
|
|
||||||
RepeatStatement * repeat = new RepeatStatement();
|
|
||||||
repeat->add_iteration_number(expr()->evaluate());
|
|
||||||
repeat->add_body(statement());
|
|
||||||
|
|
||||||
//similar stuff
|
|
||||||
delete stat;
|
|
||||||
return repeat;
|
|
||||||
}
|
|
||||||
else if(accept("while"))
|
|
||||||
{
|
|
||||||
WhileNode * while_node = new WhileNode();
|
|
||||||
while_node->add_condition(expr());
|
|
||||||
while_node->add_body(statement());
|
|
||||||
|
|
||||||
delete stat;
|
|
||||||
return while_node;
|
|
||||||
}
|
|
||||||
else if(accept("return"))
|
|
||||||
{
|
|
||||||
|
|
||||||
if(!peek(";"))
|
|
||||||
{
|
|
||||||
stat->add_expression(expr());
|
|
||||||
}
|
|
||||||
expect(";");
|
|
||||||
|
|
||||||
return stat;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
stat->add_expression(expr());
|
|
||||||
while(!expect(";") && tok_value != "") read_next();
|
|
||||||
return stat;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return stat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::prim_expr()
|
ASTExpression * Parser::prim_expr()
|
||||||
{
|
{
|
||||||
|
|
||||||
if(current_token.get_type() == t_integer)
|
if(current_token.get_type() == t_integer)
|
||||||
{
|
{
|
||||||
ConstantExpression * ce;
|
ConstantExpression * ce;
|
||||||
|
@ -288,13 +252,11 @@ ASTExpression * Parser::prim_expr()
|
||||||
ConstantExpression * ce;
|
ConstantExpression * ce;
|
||||||
if(tok_value == "true")
|
if(tok_value == "true")
|
||||||
{
|
{
|
||||||
|
|
||||||
ce = new ConstantExpression( SenchaObject(true));
|
ce = new ConstantExpression( SenchaObject(true));
|
||||||
read_next();
|
read_next();
|
||||||
}
|
}
|
||||||
else if (tok_value == "false")
|
else if (tok_value == "false")
|
||||||
{
|
{
|
||||||
|
|
||||||
ce = new ConstantExpression(SenchaObject(false));
|
ce = new ConstantExpression(SenchaObject(false));
|
||||||
read_next();
|
read_next();
|
||||||
}
|
}
|
||||||
|
@ -323,8 +285,7 @@ ASTExpression * Parser::prim_expr()
|
||||||
error(error_message);
|
error(error_message);
|
||||||
read_next();
|
read_next();
|
||||||
return new IncorrectExpression(error_message);
|
return new IncorrectExpression(error_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::postfix_expr()
|
ASTExpression * Parser::postfix_expr()
|
||||||
|
@ -335,191 +296,181 @@ ASTExpression * Parser::postfix_expr()
|
||||||
PostfixExpression * function_call = new PostfixExpression( context);
|
PostfixExpression * function_call = new PostfixExpression( context);
|
||||||
function_call->set_name(name);
|
function_call->set_name(name);
|
||||||
if(accept("("))
|
if(accept("("))
|
||||||
{
|
{
|
||||||
if(!accept(")"))
|
if(!accept(")"))
|
||||||
{
|
{
|
||||||
|
|
||||||
function_call->add_argument(expr());
|
function_call->add_argument(expr());
|
||||||
while(accept(","))
|
while(accept(","))
|
||||||
{
|
{
|
||||||
function_call->add_argument(expr());
|
function_call->add_argument(expr());
|
||||||
|
|
||||||
}
|
}
|
||||||
expect(")");
|
expect(")");
|
||||||
}
|
}
|
||||||
|
return function_call;
|
||||||
return function_call;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return prim_expr();
|
return prim_expr();
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::mul_expr()
|
ASTExpression * Parser::mul_expr()
|
||||||
{
|
{
|
||||||
BasicExpression * be = new BasicExpression();
|
BasicExpression * be = new BasicExpression();
|
||||||
be->set_left_operand(postfix_expr());
|
be->set_left_operand(postfix_expr());
|
||||||
if(peek("*") || peek("/"))
|
if(peek("*") || peek("/"))
|
||||||
{
|
{
|
||||||
if(accept("*"))
|
if(accept("*"))
|
||||||
{
|
{
|
||||||
be->set_operator("*");
|
be->set_operator("*");
|
||||||
|
|
||||||
} else if(accept("/"))
|
} else if(accept("/"))
|
||||||
{
|
{
|
||||||
be->set_operator("/");
|
be->set_operator("/");
|
||||||
|
|
||||||
}
|
|
||||||
be->set_right_operand(mul_expr());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ASTExpression * ae;
|
|
||||||
ae = static_cast<ASTExpression *>(be->children[0]);
|
|
||||||
delete be;
|
|
||||||
return ae;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
be->set_right_operand(mul_expr());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ASTExpression * ae;
|
||||||
|
ae = static_cast<ASTExpression *>(be->children[0]);
|
||||||
|
delete be;
|
||||||
|
return ae;
|
||||||
|
}
|
||||||
return be;
|
return be;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::add_expr()
|
ASTExpression * Parser::add_expr()
|
||||||
{
|
{
|
||||||
BasicExpression * be = new BasicExpression();
|
BasicExpression * be = new BasicExpression();
|
||||||
be->set_left_operand(mul_expr());
|
be->set_left_operand(mul_expr());
|
||||||
if(peek("+") || peek("-"))
|
if(peek("+") || peek("-"))
|
||||||
{
|
{
|
||||||
if(accept("+"))
|
if(accept("+"))
|
||||||
{
|
{
|
||||||
|
|
||||||
be->set_operator("+");
|
be->set_operator("+");
|
||||||
}
|
}
|
||||||
else if(accept("-"))
|
else if(accept("-"))
|
||||||
{
|
{
|
||||||
|
|
||||||
be->set_operator("-");
|
be->set_operator("-");
|
||||||
}
|
}
|
||||||
be->set_right_operand(add_expr());
|
be->set_right_operand(add_expr());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASTExpression * ae;
|
ASTExpression * ae;
|
||||||
ae = static_cast<ASTExpression *>(be->children[0]);
|
ae = static_cast<ASTExpression *>(be->children[0]);
|
||||||
delete be;
|
delete be;
|
||||||
return ae;
|
return ae;
|
||||||
}
|
}
|
||||||
|
return be;
|
||||||
return be;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::rel_expr()
|
ASTExpression * Parser::rel_expr()
|
||||||
{
|
{
|
||||||
BasicExpression * be = new BasicExpression();
|
BasicExpression * be = new BasicExpression();
|
||||||
be->set_left_operand(add_expr());
|
be->set_left_operand(add_expr());
|
||||||
if(peek("<") || peek(">"))
|
if(peek("<") || peek(">"))
|
||||||
{
|
{
|
||||||
if(accept("<"))
|
if(accept("<"))
|
||||||
{
|
{
|
||||||
be->set_operator("<");
|
be->set_operator("<");
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (accept(">"))
|
else if (accept(">"))
|
||||||
{
|
{
|
||||||
be->set_operator(">");
|
be->set_operator(">");
|
||||||
|
|
||||||
}
|
}
|
||||||
be->set_right_operand(rel_expr());
|
be->set_right_operand(rel_expr());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASTExpression * ae;
|
ASTExpression * ae;
|
||||||
ae = static_cast<ASTExpression *>(be->children[0]);
|
ae = static_cast<ASTExpression *>(be->children[0]);
|
||||||
delete be;
|
delete be;
|
||||||
return ae;
|
return ae;
|
||||||
}
|
}
|
||||||
|
return be;
|
||||||
|
|
||||||
return be;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::eq_expr()
|
ASTExpression * Parser::eq_expr()
|
||||||
{
|
{
|
||||||
BasicExpression * be = new BasicExpression();
|
BasicExpression * be = new BasicExpression();
|
||||||
be->set_left_operand(rel_expr());
|
be->set_left_operand(rel_expr());
|
||||||
if(peek("==") || peek("!="))
|
if(peek("==") || peek("!="))
|
||||||
{
|
{
|
||||||
if(accept("=="))
|
if(accept("=="))
|
||||||
{
|
{
|
||||||
be->set_operator("==");
|
be->set_operator("==");
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(accept("!="))
|
else if(accept("!="))
|
||||||
{
|
{
|
||||||
be->set_operator("!=");
|
be->set_operator("!=");
|
||||||
|
|
||||||
}
|
}
|
||||||
be->set_right_operand(eq_expr());
|
be->set_right_operand(eq_expr());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASTExpression * ae;
|
ASTExpression * ae;
|
||||||
ae = static_cast<ASTExpression *>(be->children[0]);
|
ae = static_cast<ASTExpression *>(be->children[0]);
|
||||||
delete be;
|
delete be;
|
||||||
return ae;
|
return ae;
|
||||||
}
|
}
|
||||||
|
return be;
|
||||||
return be;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::log_expr()
|
ASTExpression * Parser::log_expr()
|
||||||
{
|
{
|
||||||
BasicExpression * be = new BasicExpression();
|
BasicExpression * be = new BasicExpression();
|
||||||
be->set_left_operand(eq_expr());
|
be->set_left_operand(eq_expr());
|
||||||
if(peek("and") || peek("or"))
|
if(peek("and") || peek("or"))
|
||||||
{
|
{
|
||||||
if(accept("and"))
|
if(accept("and"))
|
||||||
{
|
{
|
||||||
be->set_operator("&&");
|
be->set_operator("&&");
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(accept("or"))
|
else if(accept("or"))
|
||||||
{
|
{
|
||||||
be->set_operator("||");
|
be->set_operator("||");
|
||||||
|
|
||||||
}
|
}
|
||||||
be->set_right_operand(log_expr());
|
be->set_right_operand(log_expr());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASTExpression * ae;
|
ASTExpression * ae;
|
||||||
ae = static_cast<ASTExpression *>(be->children[0]);
|
ae = static_cast<ASTExpression *>(be->children[0]);
|
||||||
delete be;
|
delete be;
|
||||||
return ae;
|
return ae;
|
||||||
}
|
}
|
||||||
|
return be;
|
||||||
return be;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::expr()
|
ASTExpression * Parser::expr()
|
||||||
{
|
{
|
||||||
Assignment * assignment = new Assignment( context);
|
Assignment * assignment = new Assignment( context);
|
||||||
auto name = tok_value;
|
auto name = tok_value;
|
||||||
ASTExpression * left = log_expr();
|
ASTExpression * left = log_expr();
|
||||||
|
if(accept("="))
|
||||||
if(accept("="))
|
{
|
||||||
{
|
ASTExpression * right = expr();
|
||||||
ASTExpression * right = expr();
|
|
||||||
|
|
||||||
assignment->add_lvalue(left);
|
assignment->add_lvalue(left);
|
||||||
assignment->add_rvalue(right);
|
assignment->add_rvalue(right);
|
||||||
assignment->set_name(name);
|
assignment->set_name(name);
|
||||||
|
|
||||||
return assignment;
|
return assignment;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
else
|
{
|
||||||
{
|
delete assignment;
|
||||||
delete assignment;
|
return left;
|
||||||
return left;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue