Fixed bug in calculation

This commit is contained in:
Valk Richard Li 2019-10-22 21:47:46 +08:00 committed by GitHub
parent 398da36e32
commit d595d5f26f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 92 additions and 92 deletions

View File

@ -1204,45 +1204,91 @@ abstract_syntax_tree nasal_parser::mul_div_operator_expr()
{ {
abstract_syntax_tree node; abstract_syntax_tree node;
abstract_syntax_tree temp; abstract_syntax_tree temp;
node.set_node_type(this_token.type); get_token();
switch(this_token.type)
{
case __nor_operator:
case __sub_operator:
node=unary_operator_expr();
break;
case __number:
node.set_node_type(__number);
node.set_var_number(this_token.content);
break;
case __string:
node.set_node_type(__string);
node.set_var_string(this_token.content);
break;
case __id:
node.set_node_type(__id);
node.set_var_name(this_token.content);
node.add_child(identifier_call_expr());
break;
case __left_curve:
parse.push(this_token);
node=calculation_expr();
break;
default:
++error;
std::cout<<">>[Error] line "<<this_token.line<<": expect a data after operator."<<std::endl;
return node;
break;
}
while(1) while(1)
{ {
temp.set_clear();
get_token();
switch(this_token.type)
{
case __number:
temp.set_node_type(__number);
temp.set_var_number(this_token.content);
node.add_child(temp);
break;
case __string:
temp.set_node_type(__string);
temp.set_var_string(this_token.content);
node.add_child(temp);
break;
case __id:
temp.set_node_type(__id);
temp.set_var_name(this_token.content);
temp.add_child(identifier_call_expr());
node.add_child(temp);
break;
case __left_curve:
parse.push(this_token);
node.add_child(calculation_expr());
break;
default:
++error;
std::cout<<">>[Error] line "<<this_token.line<<": expect a data after operator '*' or '/'."<<std::endl;
return node;
break;
}
get_token(); get_token();
if(this_token.type!=__mul_operator && this_token.type!=__div_operator) if(this_token.type!=__mul_operator && this_token.type!=__div_operator)
{ {
parse.push(this_token); parse.push(this_token);
break; break;
} }
else
{
temp.set_clear();
temp.set_node_type(this_token.type);
temp.add_child(node);
}
get_token();
switch(this_token.type)
{
case __nor_operator:
case __sub_operator:
temp.add_child(unary_operator_expr());
node=temp;
break;
case __number:
node.set_clear();
node.set_node_type(__number);
node.set_var_number(this_token.content);
temp.add_child(node);
node=temp;
break;
case __string:
node.set_clear();
node.set_node_type(__string);
node.set_var_string(this_token.content);
temp.add_child(node);
node=temp;
break;
case __id:
node.set_clear();
node.set_node_type(__id);
node.set_var_name(this_token.content);
node.add_child(identifier_call_expr());
temp.add_child(node);
node=temp;
break;
case __left_curve:
parse.push(this_token);
temp.add_child(calculation_expr());
node=temp;
break;
default:
++error;
std::cout<<">>[Error] line "<<this_token.line<<": expect a data after operator."<<std::endl;
return node;
break;
}
} }
return node; return node;
} }
@ -1311,35 +1357,17 @@ abstract_syntax_tree nasal_parser::calculation_expr()
abstract_syntax_tree node; abstract_syntax_tree node;
abstract_syntax_tree temp; abstract_syntax_tree temp;
// number / string / identifier haven't been checked // number / string / identifier haven't been checked
get_token();
if(this_token.type==__func)// only lambda (func (){...})() can use this condition
{
node=(function_generate_expr());
return node;
}
else
parse.push(this_token);
temp=mul_div_operator_expr();
while(1) while(1)
{ {
get_token(); // check number / string / identifier
if(this_token.type==__nor_operator || this_token.type==__sub_operator)
node=unary_operator_expr();
else if(this_token.type==__id)
node=identifier_call_expr();
else if(this_token.type==__number || this_token.type==__string)
{
node.set_node_type(this_token.type);
switch(this_token.type)
{
case __number:node.set_node_type(__number);node.set_var_number(this_token.content);break;
case __string:node.set_node_type(__string);node.set_var_string(this_token.content);break;
}
}
else if(this_token.type==__left_curve)
node=in_curve_calc_expr();
else if(this_token.type==__func)
{
node=function_generate_expr();
return node;
}
else
{
++error;
std::cout<<">>[Error] line "<<this_token.line<<": expect a scalar before operator '+' , '-' , '*' , '/' or '~'."<<std::endl;
return node;
}
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
{ {
@ -1354,47 +1382,19 @@ abstract_syntax_tree nasal_parser::calculation_expr()
case __add_operator: case __add_operator:
case __sub_operator: case __sub_operator:
case __link_operator: case __link_operator:
temp.set_clear(); node.set_clear();
temp.set_node_type(this_token.type); node.set_node_type(this_token.type);
temp.add_child(node); node.add_child(temp);
node=temp;
break; break;
case __mul_operator: case __semi:parse.push(this_token);return temp;break;
case __div_operator:
temp.set_clear();
temp.set_node_type(this_token.type);
temp.add_child(node);
temp.add_child(mul_div_operator_expr());
node=temp;
get_token();
switch(this_token.type)
{
case __cmp_equal:
case __cmp_not_equal:
case __cmp_less:
case __cmp_more:
case __cmp_less_or_equal:
case __cmp_more_or_equal:
case __and_operator:
case __or_operator:
case __add_operator:
case __sub_operator:
case __link_operator:
temp.set_clear();
temp.set_node_type(this_token.type);
temp.add_child(node);
node=temp;
break;
default:parse.push(this_token);return node;break;
}
break;
case __semi:parse.push(this_token);return node;break;
case __unknown_operator: case __unknown_operator:
++error; ++error;
std::cout<<">>[Error] line "<<this_token.line<<": __unknown_operator '"<<this_token.content<<"'."<<std::endl; std::cout<<">>[Error] line "<<this_token.line<<": __unknown_operator '"<<this_token.content<<"'."<<std::endl;
return node;break; return node;break;
default:parse.push(this_token);return node;break; default:parse.push(this_token);return node;break;
} }
node.add_child(mul_div_operator_expr());
temp=node;
} }
return node; return node;
} }