From 8c28c51a13c2900c17d361e8d1f49cb0ea7c2977 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 16 Dec 2009 15:49:48 -0500 Subject: Add support for color keyword groups. --- dimension/grammar.y | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'dimension') diff --git a/dimension/grammar.y b/dimension/grammar.y index 4bf5ea4..a8dc37f 100644 --- a/dimension/grammar.y +++ b/dimension/grammar.y @@ -748,6 +748,8 @@ yyerror(YYLTYPE *locp, dmnsn_array *astree, dmnsn_token_iterator *iterator, %type COLOR %type COLOR_BODY %type COLOR_VECTOR +%type COLOR_KEYWORD_GROUP +%type COLOR_KEYWORD_GROUP_INIT %destructor { dmnsn_delete_astnode($$); } @@ -1092,6 +1094,7 @@ COLOR: COLOR_BODY ; COLOR_BODY: COLOR_VECTOR + | COLOR_KEYWORD_GROUP ; COLOR_VECTOR: "rgb" VECTOR { $$ = $2; } @@ -1106,6 +1109,57 @@ COLOR_VECTOR: "rgb" VECTOR { $$ = $2; } } | "rgbft" VECTOR { $$ = $2; } | VECTOR +; + +COLOR_KEYWORD_GROUP: COLOR_KEYWORD_GROUP_INIT COLOR_KEYWORD_ITEM + | COLOR_KEYWORD_GROUP COLOR_KEYWORD_ITEM +; + +COLOR_KEYWORD_GROUP_INIT: /* empty */ { + dmnsn_astnode zero = + dmnsn_new_astnode(DMNSN_AST_INTEGER, @$); + zero.ptr = malloc(sizeof(long)); + if (!zero.ptr) + dmnsn_error(DMNSN_SEVERITY_HIGH, + "Failed to allocate room for integer."); + *(long *)zero.ptr = 0; + + $$ = dmnsn_eval_vector(zero); + dmnsn_delete_astnode(zero); + } +; + +COLOR_KEYWORD_ITEM: "red" FLOAT { + dmnsn_astnode old; + dmnsn_array_get($0.children, 0, &old); + dmnsn_array_set($0.children, 0, &$2); + dmnsn_delete_astnode(old); + } + | "green" FLOAT { + dmnsn_astnode old; + dmnsn_array_get($0.children, 1, &old); + dmnsn_array_set($0.children, 1, &$2); + dmnsn_delete_astnode(old); + } + | "blue" FLOAT { + dmnsn_astnode old; + dmnsn_array_get($0.children, 2, &old); + dmnsn_array_set($0.children, 2, &$2); + dmnsn_delete_astnode(old); + } + | "filter" FLOAT { + dmnsn_astnode old; + dmnsn_array_get($0.children, 3, &old); + dmnsn_array_set($0.children, 3, &$2); + dmnsn_delete_astnode(old); + } + | "transmit" FLOAT { + dmnsn_astnode old; + dmnsn_array_get($0.children, 4, &old); + dmnsn_array_set($0.children, 4, &$2); + dmnsn_delete_astnode(old); + } +; %% -- cgit v1.2.3