This commit is contained in:
Valk Richard Li 2020-01-12 21:41:27 +08:00 committed by GitHub
parent 5f3d6426a4
commit 664893aeac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 91 additions and 26 deletions

View File

@ -49,6 +49,7 @@ enum parse_token_type
__root, __root,
__null_type, __null_type,
__multi_id, __multi_id,
__parameters,
__list,__hash, __list,__hash,
__hash_member, __hash_member,
__call_function,__call_array,__call_hash, __call_function,__call_array,__call_hash,
@ -121,21 +122,22 @@ void print_parse_token(int type)
case __number: context="number"; break; case __number: context="number"; break;
case __string: context="string"; break; case __string: context="string"; break;
case __root: context="root"; break; case __root: context="root"; break;
case __null_type: context="null_type"; break; case __null_type: context="null_type"; break;
case __multi_id: context="multi_identifiers"; break; case __multi_id: context="identifiers"; break;
case __list: context="list"; break; case __parameters: context="parameters"; break;
case __hash: context="hash"; break; case __list: context="list"; break;
case __hash_member: context="hash_member"; break; case __hash: context="hash"; break;
case __call_function: context="call_func"; break; case __hash_member: context="hash_member"; break;
case __call_array: context="call_array"; break; case __call_function: context="call_func"; break;
case __call_hash: context="call_hash"; break; case __call_array: context="call_array"; break;
case __normal_statement_block:context="block"; break; case __call_hash: context="call_hash"; break;
case __definition: context="definition"; break; case __normal_statement_block:context="block"; break;
case __assignment: context="assignment"; break; case __definition: context="definition"; break;
case __function: context="function"; break; case __assignment: context="assignment"; break;
case __loop: context="loop"; break; case __function: context="function"; break;
case __ifelse: context="if-else"; break; case __loop: context="loop"; break;
case __ifelse: context="if-else"; break;
default: context="undefined_token";break; default: context="undefined_token";break;
} }
@ -151,6 +153,9 @@ enum parse_error_type
definition_lack_equal, // lack '=' when not getting ';' definition_lack_equal, // lack '=' when not getting ';'
definition_wrong_type, // need identifier but get number or string definition_wrong_type, // need identifier but get number or string
multi_definition_need_curve, // lack right curve when generating 'var (id,id,id)' multi_definition_need_curve, // lack right curve when generating 'var (id,id,id)'
error_begin_token_of_scalar, // in scalar_generate()
lack_left_curve, // lack left curve
lack_right_curve, // lack right curve
}; };
void print_parse_error(int error_type,int line,int error_token_type=__stack_end) void print_parse_error(int error_type,int line,int error_token_type=__stack_end)
@ -171,9 +176,18 @@ void print_parse_error(int error_type,int line,int error_token_type=__stack_end)
case definition_lack_equal: case definition_lack_equal:
std::cout<<error_info_head<<line<<": expect a \'=\' here."<<std::endl;break; std::cout<<error_info_head<<line<<": expect a \'=\' here."<<std::endl;break;
case definition_wrong_type: case definition_wrong_type:
std::cout<<error_info_head<<line<<": expect an identifier here but get other types."<<std::endl; std::cout<<error_info_head<<line<<": expect an identifier here but get other types."<<std::endl;break;
case multi_definition_need_curve: case multi_definition_need_curve:
std::cout<<error_info_head<<line<<": expect a \')\' here."<<std::endl; std::cout<<error_info_head<<line<<": expect a \')\' here."<<std::endl;break;
case error_begin_token_of_scalar:
std::cout<<error_info_head<<line<<": expect a scalar here but get \'";
print_parse_token(error_token_type);
std::cout<<"\' ."<<std::endl;
break;
case lack_left_curve:
std::cout<<error_info_head<<line<<": expect a \'(\' here."<<std::endl;break;
case lack_right_curve:
std::cout<<error_info_head<<line<<": expect a \')\' here."<<std::endl;break;
default: default:
std::cout<<error_info_head<<line<<": unknown parse error. error id: other_type."<<std::endl;break; std::cout<<error_info_head<<line<<": unknown parse error. error id: other_type."<<std::endl;break;
} }

View File

@ -22,7 +22,9 @@ class nasal_parse
// abstract_syntax_tree generation // abstract_syntax_tree generation
void main_generate(); void main_generate();
abstract_syntax_tree scalar_generate(); abstract_syntax_tree scalar_generate();
abstract_syntax_tree function_generate();
abstract_syntax_tree var_outside_definition(); abstract_syntax_tree var_outside_definition();
abstract_syntax_tree var_inside_definition();
abstract_syntax_tree loop_expr(); abstract_syntax_tree loop_expr();
abstract_syntax_tree choose_expr(); abstract_syntax_tree choose_expr();
}; };
@ -175,6 +177,7 @@ abstract_syntax_tree nasal_parse::scalar_generate()
{ {
this->get_token(); this->get_token();
abstract_syntax_tree scalar_node; abstract_syntax_tree scalar_node;
scalar_node.set_line(this_token.line);
switch(this_token.type) switch(this_token.type)
{ {
case __nor_operator: case __nor_operator:
@ -189,16 +192,32 @@ abstract_syntax_tree nasal_parse::scalar_generate()
case __left_brace:break; case __left_brace:break;
case __left_bracket:break; case __left_bracket:break;
case __func:break; case __func:break;
default:
++error;
print_parse_error(error_begin_token_of_scalar,this_token.line,this_token.type);
break;
} }
return scalar_node; return scalar_node;
} }
abstract_syntax_tree nasal_parse::function_generate()
{
abstract_syntax_tree function_node;
abstract_syntax_tree parameter_list;
this->get_token(); // get 'func'
function_node.set_type(__function);
function_node.set_line(this_token.line);
parameter_list.set_type(__parameters);
parameter_list.set_line(this_token.line);
return function_node;
}
abstract_syntax_tree nasal_parse::var_outside_definition() abstract_syntax_tree nasal_parse::var_outside_definition()
{ {
abstract_syntax_tree definition_node; abstract_syntax_tree var_outsied_definition_node;
definition_node.set_type(__definition); var_outsied_definition_node.set_type(__definition);
this->get_token();// get 'var' this->get_token();// get 'var'
definition_node.set_line(this_token.line); var_outsied_definition_node.set_line(this_token.line);
this->get_token(); this->get_token();
if(this_token.type==__id) if(this_token.type==__id)
{ {
@ -206,12 +225,12 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
new_var_identifier.set_type(__id); new_var_identifier.set_type(__id);
new_var_identifier.set_line(this_token.line); new_var_identifier.set_line(this_token.line);
new_var_identifier.set_name(this_token.str); new_var_identifier.set_name(this_token.str);
definition_node.add_child(new_var_identifier); var_outsied_definition_node.add_child(new_var_identifier);
this->get_token(); this->get_token();
if(this_token.type==__semi) if(this_token.type==__semi)
this->push_token();// var id this->push_token();// var id
else if(this_token.type==__equal) else if(this_token.type==__equal)
definition_node.add_child(scalar_generate());// var id = scalar var_outsied_definition_node.add_child(scalar_generate());// var id = scalar
else else
{ {
this->push_token(); this->push_token();
@ -248,7 +267,7 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
break; break;
} }
} }
definition_node.add_child(multi_identifier); var_outsied_definition_node.add_child(multi_identifier);
this->get_token(); this->get_token();
if(this_token.type==__semi) if(this_token.type==__semi)
this->push_token();// var (id,id,id) this->push_token();// var (id,id,id)
@ -269,14 +288,24 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
++error; ++error;
print_parse_error(definition_lack_id,this_token.line); print_parse_error(definition_lack_id,this_token.line);
} }
return definition_node; return var_outsied_definition_node;
}
abstract_syntax_tree nasal_parse::var_inside_definition()
{
abstract_syntax_tree var_inside_definition_node;
var_inside_definition_node.set_type(__definition);
this->get_token(); // get '('
this->get_token(); // get 'var'
var_inside_definition_node.set_line(this_token.line);
return var_inside_definition_node;
} }
abstract_syntax_tree nasal_parse::loop_expr() abstract_syntax_tree nasal_parse::loop_expr()
{ {
abstract_syntax_tree loop_main_node; abstract_syntax_tree loop_main_node;
loop_main_node.set_type(__loop); loop_main_node.set_type(__loop);
this->get_token(); this->get_token(); // get the first token of loop
loop_main_node.set_line(this_token.line); loop_main_node.set_line(this_token.line);
switch(this_token.type) switch(this_token.type)
{ {
@ -291,9 +320,31 @@ abstract_syntax_tree nasal_parse::loop_expr()
abstract_syntax_tree nasal_parse::choose_expr() abstract_syntax_tree nasal_parse::choose_expr()
{ {
abstract_syntax_tree choose_main_node; abstract_syntax_tree choose_main_node;
abstract_syntax_tree if_node;
abstract_syntax_tree elsif_node;
abstract_syntax_tree else_node;
choose_main_node.set_type(__ifelse); choose_main_node.set_type(__ifelse);
this->get_token();// get 'if' // get 'if'
this->get_token();
choose_main_node.set_line(this_token.line); choose_main_node.set_line(this_token.line);
if_node.set_type(__if);
if_node.set_line(this_token.line);
this->get_token();
if(this_token.type!=__left_curve)
{
++error;
print_parse_error(lack_left_curve,this_token.line);
}
if_node.add_child(scalar_generate());
this->get_token();
if(this_token.type!=__right_curve)
{
++error;
print_parse_error(lack_right_curve,this_token.line);
}
// add statements
// get elsif or else if
return choose_main_node; return choose_main_node;
} }
#endif #endif