mirror of
https://github.com/ValKmjolnir/Nasal-Interpreter.git
synced 2026-07-22 02:48:48 +08:00
update
This commit is contained in:
@@ -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
@@ -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
@@ -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
|
||||
Reference in New Issue
Block a user