added ^, &&, and || operators
git-svn-id: svn://anubis/fart/trunk@363 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
78705024e8
commit
45a28525a0
@ -116,6 +116,9 @@ NodeRef BinOpNode::evaluate()
|
|||||||
case '%':
|
case '%':
|
||||||
r = (int) o % (int) t;
|
r = (int) o % (int) t;
|
||||||
break;
|
break;
|
||||||
|
case '^':
|
||||||
|
r = pow(o, t);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cerr << "Error: BinOpNode created with op '" << m_op << "'" << endl;
|
cerr << "Error: BinOpNode created with op '" << m_op << "'" << endl;
|
||||||
exit(-3);
|
exit(-3);
|
||||||
@ -125,9 +128,9 @@ NodeRef BinOpNode::evaluate()
|
|||||||
|
|
||||||
NodeRef BoolExpressionNode::evaluate()
|
NodeRef BoolExpressionNode::evaluate()
|
||||||
{
|
{
|
||||||
double o, t;
|
double o = 0, t = 0;
|
||||||
double r = 0;
|
double r = 0;
|
||||||
if (m_op != '!')
|
if (m_op != '!' && m_op != '&' && m_op != '|')
|
||||||
{
|
{
|
||||||
o = one->evaluate()->getNumber();
|
o = one->evaluate()->getNumber();
|
||||||
t = two->evaluate()->getNumber();
|
t = two->evaluate()->getNumber();
|
||||||
@ -152,6 +155,20 @@ NodeRef BoolExpressionNode::evaluate()
|
|||||||
case 'n':
|
case 'n':
|
||||||
r = o != t ? 1 : 0;
|
r = o != t ? 1 : 0;
|
||||||
break;
|
break;
|
||||||
|
case '&':
|
||||||
|
r = one->evaluate()->getInteger();
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
r = two->evaluate()->getInteger();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '|':
|
||||||
|
r = one->evaluate()->getInteger();
|
||||||
|
if (r == 0)
|
||||||
|
{
|
||||||
|
r = two->evaluate()->getInteger();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case '!':
|
case '!':
|
||||||
r = ! one->evaluate()->getInteger();
|
r = ! one->evaluate()->getInteger();
|
||||||
break;
|
break;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
\* return TIMES;
|
\* return TIMES;
|
||||||
\/ return DIVIDE;
|
\/ return DIVIDE;
|
||||||
% return MOD;
|
% return MOD;
|
||||||
|
\^ return POW;
|
||||||
= return ASSIGN;
|
= return ASSIGN;
|
||||||
== return EQUALS;
|
== return EQUALS;
|
||||||
!= return NOTEQUALS;
|
!= return NOTEQUALS;
|
||||||
|
@ -38,6 +38,7 @@ refptr<Scope> parser_scope;
|
|||||||
%token TIMES;
|
%token TIMES;
|
||||||
%token DIVIDE;
|
%token DIVIDE;
|
||||||
%token MOD;
|
%token MOD;
|
||||||
|
%token POW;
|
||||||
%token ASSIGN;
|
%token ASSIGN;
|
||||||
%token EQUALS;
|
%token EQUALS;
|
||||||
%token NOTEQUALS;
|
%token NOTEQUALS;
|
||||||
@ -120,8 +121,10 @@ refptr<Scope> parser_scope;
|
|||||||
%token LOCAL;
|
%token LOCAL;
|
||||||
|
|
||||||
%right ASSIGN
|
%right ASSIGN
|
||||||
|
%left AND OR NOT
|
||||||
%left PLUS MINUS
|
%left PLUS MINUS
|
||||||
%left TIMES DIVIDE MOD
|
%left TIMES DIVIDE MOD
|
||||||
|
%right POW
|
||||||
%left UMINUS
|
%left UMINUS
|
||||||
|
|
||||||
%%
|
%%
|
||||||
@ -356,6 +359,7 @@ expression: term { $$ = $1; }
|
|||||||
| expression TIMES term { $$ = new BinOpNode('*', $1, $3); }
|
| expression TIMES term { $$ = new BinOpNode('*', $1, $3); }
|
||||||
| expression DIVIDE term { $$ = new BinOpNode('/', $1, $3); }
|
| expression DIVIDE term { $$ = new BinOpNode('/', $1, $3); }
|
||||||
| expression MOD term { $$ = new BinOpNode('%', $1, $3); }
|
| expression MOD term { $$ = new BinOpNode('%', $1, $3); }
|
||||||
|
| expression POW term { $$ = new BinOpNode('^', $1, $3); }
|
||||||
| MINUS expression %prec UMINUS {
|
| MINUS expression %prec UMINUS {
|
||||||
$$ = new BinOpNode('-', new NumberNode(0.0), $2);
|
$$ = new BinOpNode('-', new NumberNode(0.0), $2);
|
||||||
}
|
}
|
||||||
@ -390,6 +394,12 @@ bool_expression: expression LESS expression {
|
|||||||
| expression NOTEQUALS expression {
|
| expression NOTEQUALS expression {
|
||||||
$$ = new BoolExpressionNode('n', $1, $3);
|
$$ = new BoolExpressionNode('n', $1, $3);
|
||||||
}
|
}
|
||||||
|
| bool_expression AND bool_expression {
|
||||||
|
$$ = new BoolExpressionNode('&', $1, $3);
|
||||||
|
}
|
||||||
|
| bool_expression OR bool_expression {
|
||||||
|
$$ = new BoolExpressionNode('|', $1, $3);
|
||||||
|
}
|
||||||
| NOT bool_expression {
|
| NOT bool_expression {
|
||||||
$$ = new BoolExpressionNode('!', $2, NULL);
|
$$ = new BoolExpressionNode('!', $2, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user