From 7fc84f364bcb2e37363d3e22300180ba92288811 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 22 Mar 2010 22:07:29 -0400 Subject: Support the ternary operator. --- dimension/common.rules | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'dimension/common.rules') diff --git a/dimension/common.rules b/dimension/common.rules index 02f2010..81719c5 100644 --- a/dimension/common.rules +++ b/dimension/common.rules @@ -395,7 +395,10 @@ ARITH_EXPR: FLOAT_LITERAL | ARITH_EXPR "." "transmit" { $$ = dmnsn_new_astnode1(DMNSN_AST_DOT_TRANSMIT, @$, $1); } - | "(" ARITH_EXPR ")" { $$ = $2; } + | "(" ARITH_EXPR ")" %dprec 2 { $$ = $2; } + | "(" CONDITIONAL "?" ARITH_EXPR ":" ARITH_EXPR ")" { + $$ = dmnsn_new_astnode3(DMNSN_AST_TERNARY, @$, $2, $4, $6); + } | "abs" "(" ARITH_EXPR ")" { $$ = dmnsn_new_astnode1(DMNSN_AST_ABS, @$, $3); } @@ -530,6 +533,43 @@ MIN_LIST: ARITH_EXPR "," ARITH_EXPR { } ; +CONDITIONAL: ARITH_EXPR { + /* Force the expression to be evaluated logically */ + dmnsn_astnode zero = dmnsn_new_ast_integer(0); + $$ = dmnsn_new_astnode2(DMNSN_AST_OR, @$, zero, $1); + } + | ARITH_EXPR "=" ARITH_EXPR { + $$ = dmnsn_new_astnode2(DMNSN_AST_EQUAL, @$, $1, $3); + } + | ARITH_EXPR "!=" ARITH_EXPR { + $$ = dmnsn_new_astnode2(DMNSN_AST_NOT_EQUAL, @$, $1, $3); + } + | ARITH_EXPR "<" ARITH_EXPR { + $$ = dmnsn_new_astnode2(DMNSN_AST_LESS, @$, $1, $3); + } + | ARITH_EXPR "<=" ARITH_EXPR { + $$ = dmnsn_new_astnode2(DMNSN_AST_LESS_EQUAL, @$, $1, $3); + } + | ARITH_EXPR ">" ARITH_EXPR { + $$ = dmnsn_new_astnode2(DMNSN_AST_GREATER, @$, $1, $3); + } + | ARITH_EXPR ">=" ARITH_EXPR { + $$ = dmnsn_new_astnode2(DMNSN_AST_GREATER_EQUAL, @$, $1, $3); + } + | CONDITIONAL "&" CONDITIONAL { + $$ = dmnsn_new_astnode2(DMNSN_AST_AND, @$, $1, $3); + } + | CONDITIONAL "|" CONDITIONAL { + $$ = dmnsn_new_astnode2(DMNSN_AST_OR, @$, $1, $3); + } + | "(" CONDITIONAL ")" %dprec 1 { + $$ = $2; + } + | "!" CONDITIONAL { + $$ = dmnsn_new_astnode1(DMNSN_AST_NOT, @$, $2); + } +; + /* Colors */ COLOR: COLOR_BODY { -- cgit v1.2.3