update
This commit is contained in:
parent
5f3d6426a4
commit
664893aeac
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue