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,
__null_type,
__multi_id,
__parameters,
__list,__hash,
__hash_member,
__call_function,__call_array,__call_hash,
@ -121,21 +122,22 @@ void print_parse_token(int type)
case __number: context="number"; break;
case __string: context="string"; break;
case __root: context="root"; break;
case __null_type: context="null_type"; break;
case __multi_id: context="multi_identifiers"; break;
case __list: context="list"; break;
case __hash: context="hash"; break;
case __hash_member: context="hash_member"; break;
case __call_function: context="call_func"; break;
case __call_array: context="call_array"; break;
case __call_hash: context="call_hash"; break;
case __normal_statement_block:context="block"; break;
case __definition: context="definition"; break;
case __assignment: context="assignment"; break;
case __function: context="function"; break;
case __loop: context="loop"; break;
case __ifelse: context="if-else"; break;
case __root: context="root"; break;
case __null_type: context="null_type"; break;
case __multi_id: context="identifiers"; break;
case __parameters: context="parameters"; break;
case __list: context="list"; break;
case __hash: context="hash"; break;
case __hash_member: context="hash_member"; break;
case __call_function: context="call_func"; break;
case __call_array: context="call_array"; break;
case __call_hash: context="call_hash"; break;
case __normal_statement_block:context="block"; break;
case __definition: context="definition"; break;
case __assignment: context="assignment"; break;
case __function: context="function"; break;
case __loop: context="loop"; break;
case __ifelse: context="if-else"; break;
default: context="undefined_token";break;
}
@ -151,6 +153,9 @@ enum parse_error_type
definition_lack_equal, // lack '=' when not getting ';'
definition_wrong_type, // need identifier but get number or string
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)
@ -171,9 +176,18 @@ void print_parse_error(int error_type,int line,int error_token_type=__stack_end)
case definition_lack_equal:
std::cout<<error_info_head<<line<<": expect a \'=\' here."<<std::endl;break;
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:
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:
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
void main_generate();
abstract_syntax_tree scalar_generate();
abstract_syntax_tree function_generate();
abstract_syntax_tree var_outside_definition();
abstract_syntax_tree var_inside_definition();
abstract_syntax_tree loop_expr();
abstract_syntax_tree choose_expr();
};
@ -175,6 +177,7 @@ abstract_syntax_tree nasal_parse::scalar_generate()
{
this->get_token();
abstract_syntax_tree scalar_node;
scalar_node.set_line(this_token.line);
switch(this_token.type)
{
case __nor_operator:
@ -189,16 +192,32 @@ abstract_syntax_tree nasal_parse::scalar_generate()
case __left_brace:break;
case __left_bracket:break;
case __func:break;
default:
++error;
print_parse_error(error_begin_token_of_scalar,this_token.line,this_token.type);
break;
}
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 definition_node;
definition_node.set_type(__definition);
abstract_syntax_tree var_outsied_definition_node;
var_outsied_definition_node.set_type(__definition);
this->get_token();// get 'var'
definition_node.set_line(this_token.line);
var_outsied_definition_node.set_line(this_token.line);
this->get_token();
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_line(this_token.line);
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();
if(this_token.type==__semi)
this->push_token();// var id
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
{
this->push_token();
@ -248,7 +267,7 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
break;
}
}
definition_node.add_child(multi_identifier);
var_outsied_definition_node.add_child(multi_identifier);
this->get_token();
if(this_token.type==__semi)
this->push_token();// var (id,id,id)
@ -269,14 +288,24 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
++error;
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 loop_main_node;
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);
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 choose_main_node;
abstract_syntax_tree if_node;
abstract_syntax_tree elsif_node;
abstract_syntax_tree else_node;
choose_main_node.set_type(__ifelse);
this->get_token();// get 'if'
// get 'if'
this->get_token();
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;
}
#endif