This commit is contained in:
Valk Richard Li
2020-06-09 10:24:11 -07:00
committed by GitHub
parent dda066d9b5
commit 7e12bb4e74
3 changed files with 248 additions and 5 deletions
+2 -2
View File
@@ -16,7 +16,7 @@ public:
void set_line(int);
void set_type(int);
void set_str(std::string&);
void add_child(nasal_ast&);
void add_child(nasal_ast);
int get_line();
int get_type();
std::string get_str();
@@ -74,7 +74,7 @@ void nasal_ast::set_str(std::string& s)
return;
}
void nasal_ast::add_child(nasal_ast& ast)
void nasal_ast::add_child(nasal_ast ast)
{
children.push_back(ast);
return;
+36 -2
View File
@@ -21,9 +21,43 @@ enum token_type
enum ast_node
{
ast_null=0,
ast_nil,ast_number,ast_string,ast_identifier,
ast_nil,ast_number,ast_string,ast_identifier,ast_function,ast_hash,ast_vector,
ast_hashmember,
ast_args,
ast_for,ast_forindex,ast_foreach,ast_while,
ast_definition,ast_assignment
ast_definition,ast_assignment,ast_calculation
};
enum parse_error
{
unknown,
lack_id,
lack_left_curve,
lack_left_bracket,
lack_left_brace,
lack_comma,
lack_colon,
lack_scalar,
};
void error_info(int line,int error_type)
{
std::string info=">> [parse] error: line ";
std::string detail;
std::cout<<info<<line<<": ";
switch(error_type)
{
case unknown: detail="unknown error."; break;
case lack_id: detail="lack identifier."; break;
case lack_left_curve: detail="lack left curve."; break;
case lack_left_bracket: detail="lack left bracket."; break;
case lack_left_brace: detail="lack left brace."; break;
case lack_comma: detail="lack comma."; break;
case lack_colon: detail="lack colon."; break;
case lack_scalar: detail="lack scalar"; break;
}
std::cout<<detail<<std::endl;
return;
}
#endif
+210 -1
View File
@@ -28,7 +28,7 @@ private:
nasal_ast additive_expr();
nasal_ast multive_expr();
nasal_ast unary();
nasal_ast scalar_gen();
nasal_ast scalar();
nasal_ast func_call();
nasal_ast id_call();
nasal_ast vector_call();
@@ -124,4 +124,213 @@ nasal_ast nasal_parse::id_gen()
return node;
}
nasal_ast nasal_parse::vector_gen()
{
nasal_ast node;
node.set_line(tok_list[ptr].line);
node.set_type(ast_vector);
++ptr;
while(ptr<tok_list_size && tok_list[ptr].type!=tok_right_bracket)
{
node.add_child(calculation());
++ptr;
if(ptr>=tok_list_size) break;
if(ptr<tok_list_size && tok_list[ptr].type==tok_comma) ++ptr;
if(ptr<tok_list_size && tok_list[ptr].type!=tok_comma && tok_list[ptr].type!=tok_right_bracket)
{
error_info(tok_list[ptr].line,lack_comma);
break;
}
}
return node;
}
nasal_ast nasal_parse::hash_gen()
{
nasal_ast node;
node.set_line(tok_list[ptr].line);
node.set_type(ast_hash);
++ptr;
while (ptr<tok_list_size && tok_list[ptr].type!=tok_right_brace)
{
node.add_child(hash_member_gen());
++ptr;
if(ptr>=tok_list_size) break;
if(ptr<tok_list_size && tok_list[ptr].type==tok_comma) ++ptr;
if(ptr<tok_list_size && tok_list[ptr].type!=tok_comma && tok_list[ptr].type!=tok_right_brace)
{
error_info(tok_list[ptr].line,lack_comma);
break;
}
}
return node;
}
nasal_ast nasal_parse::hash_member_gen()
{
nasal_ast node;
if(tok_list[ptr].type!=tok_identifier)
{
error_info(tok_list[ptr].line,lack_id);
return node;
}
node.set_line(tok_list[ptr].line);
node.set_type(ast_hashmember);
node.add_child(id_gen());
++ptr;
if(ptr>=tok_list_size || tok_list[ptr].type!=tok_colon)
{
error_info(ptr>=tok_list_size?node.get_line():tok_list[ptr].line,lack_colon);
return node;
}
++ptr;
if(ptr<tok_list_size) node.add_child(calculation());
else error_info(node.get_line(),lack_scalar);
return node;
}
nasal_ast nasal_parse::func_gen()
{
nasal_ast node;
node.set_line(tok_list[ptr].line);
node.set_type(ast_function);
++ptr;
if(ptr>=tok_list_size)
{
error_info(node.get_line(),lack_left_curve);
return node;
}
if(tok_list[ptr].type==tok_left_curve)
{
node.add_child(args_list_gen());
++ptr;
}
if(ptr>=tok_list_size)
{
error_info(node.get_line(),lack_left_brace);
return node;
}
node.add_child(exprs_gen());
return node;
}
nasal_ast nasal_parse::args_list_gen()
{
nasal_ast node;
node.set_line(tok_list[ptr].line);
node.set_type(ast_args);
++ptr;
while(ptr<tok_list_size && tok_list[ptr].type!=tok_right_curve)
{
;
}
return node;
}
nasal_ast nasal_parse::exprs_gen()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::calculation()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::trinocular()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::and_expr()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::or_expr()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::cmp_expr()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::additive_expr()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::multive_expr()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::unary()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::scalar()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::func_call()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::id_call()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::vector_call()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::hash_call()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::call_scalar()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::subvec()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::definition()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::multi_id()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::multi_scalar()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::multi_assgin()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::loop()
{
nasal_ast node;
return node;
}
nasal_ast nasal_parse::conditional()
{
nasal_ast node;
return node;
}
#endif