added ^, &&, and || operators

git-svn-id: svn://anubis/fart/trunk@363 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2010-10-07 21:05:30 +00:00
parent 78705024e8
commit 45a28525a0
3 changed files with 30 additions and 2 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);
} }