#line 2 "directives.rules" /* * Start symbol */ LANGUAGE_DIRECTIVE: "#include" STRING { dmnsn_declare_symbol(symtable, "__include__", $2); dmnsn_delete_astnode($2); } | "#declare" "identifier" "=" RVALUE { dmnsn_declare_symbol(symtable, $2, $4); free($2); dmnsn_delete_astnode($4); } | "#local" "identifier" "=" RVALUE { dmnsn_local_symbol(symtable, $2, $4); free($2); dmnsn_delete_astnode($4); } | "#undef" "identifier" { dmnsn_undef_symbol(symtable, $2); free($2); } | "#if" "(" CONDITIONAL ")" { dmnsn_astnode cond = dmnsn_eval($3, symtable); dmnsn_delete_astnode($3); if (cond.type == DMNSN_AST_NONE) { dmnsn_delete_astnode(cond); YYERROR; } dmnsn_local_symbol(symtable, "__cond__", cond); dmnsn_delete_astnode(cond); } | "#ifdef" "(" "identifier" ")" { dmnsn_astnode *node = dmnsn_find_symbol(symtable, $3); dmnsn_local_symbol(symtable, "__cond__", dmnsn_new_ast_integer(node ? 1 : 0)); free($3); } | "#ifndef" "(" "identifier" ")" { dmnsn_astnode *node = dmnsn_find_symbol(symtable, $3); dmnsn_local_symbol(symtable, "__cond__", dmnsn_new_ast_integer(node ? 0 : 1)); free($3); } | "#version" FLOAT ";" { dmnsn_diagnostic(@$.first_filename, @$.first_line, @$.first_column, "WARNING: POV-Ray #version" " backwards-compatibility not supported"); dmnsn_delete_astnode($2); } | "#debug" STRING { fprintf(stderr, "%s\n", (const char *)$2.ptr); dmnsn_delete_astnode($2); } | "#warning" STRING { dmnsn_diagnostic(@$.first_filename, @$.first_line, @$.first_column, "WARNING: %s", (const char *)$2.ptr); dmnsn_delete_astnode($2); } | "#error" STRING { dmnsn_diagnostic(@$.first_filename, @$.first_line, @$.first_column, "%s", (const char *)$2.ptr); dmnsn_delete_astnode($2); YYERROR; } RVALUE: ARITH_EXPR ";" %dprec 2 { $$ = dmnsn_eval($1, symtable); dmnsn_delete_astnode($1); if ($$.type == DMNSN_AST_NONE) { dmnsn_delete_astnode($$); YYERROR; } } | COLOR ";" %dprec 1 | OBJECT | TEXTURE | PIGMENT | FINISH | CAMERA | TRANSFORMATION 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 ")" { $$ = $2; }