Alien-LibJIT

 view release on metacpan or  search on metacpan

libjit/dpas/dpas-parser.y  view on Meta::CPAN

					{
						dpas_out_of_memory();
					}
					if(!jit_insn_store(dpas_current_function(),
									   value, const_value))
					{
						dpas_out_of_memory();
					}
					if(!jit_insn_label(dpas_current_function(), &label2))
					{
						dpas_out_of_memory();
					}
					dpas_sem_set_rvalue($$, dpas_type_boolean, value);
				}
				else
				{
					handle_integer_binary("and", jit_insn_and, $1, $3);
				}
			}
	| Term K_XOR Power				{
				handle_integer_binary("xor", jit_insn_xor, $1, $3);
			}
	| Term K_SHL Power				{
				handle_integer_binary("shl", jit_insn_shl, $1, $3);
			}
	| Term K_SHR Power				{
				handle_integer_binary("shr", jit_insn_shr, $1, $3);
			}
	;

Power
	: Factor						{ $$ = $1; }
	| Power K_POW Factor			{
				handle_binary("pow", jit_insn_pow, $1, $3);
			}
	;

Factor
	: Variable						{ $$ = $1; }
	| BasicConstant					{
				jit_value_t value = jit_value_create_constant
					(dpas_current_function(), &($1));
				dpas_sem_set_rvalue($$, $1.type, value);
			}
	| '[' ExpressionList ']'		{
				/* TODO */
				dpas_error("set expressions not yet implemented");
				dpas_sem_set_error($$);
			}
	| '[' ']'						{
				/* TODO */
				dpas_error("set expressions not yet implemented");
				dpas_sem_set_error($$);
			}
	| K_NOT Factor					{
				jit_value_t value;
				$2 = dpas_lvalue_to_rvalue($2);
				if(dpas_sem_is_rvalue($2) &&
				   dpas_type_is_boolean(dpas_sem_get_type($2)))
				{
					value = jit_insn_to_not_bool
						(dpas_current_function(), dpas_sem_get_value($2));
					dpas_sem_set_rvalue($$, dpas_type_boolean, value);
				}
				else if(dpas_sem_is_rvalue($2) &&
						dpas_type_is_integer(dpas_sem_get_type($2)))
				{
					value = jit_insn_not
						(dpas_current_function(), dpas_sem_get_value($2));
					dpas_sem_set_rvalue($$, jit_value_get_type(value), value);
				}
				else
				{
					if(!dpas_sem_is_error($2))
					{
						dpas_error("invalid operand to unary `not'");
					}
					dpas_sem_set_error($$);
				}
			}
	| '&' Factor					{
				jit_type_t type;
				if(dpas_sem_is_lvalue($2))
				{
					jit_value_t value;
					value = jit_insn_address_of
						(dpas_current_function(), dpas_sem_get_value($2));
					type = jit_type_create_pointer(dpas_sem_get_type($2), 1);
					if(!type)
					{
						dpas_out_of_memory();
					}
					dpas_sem_set_rvalue($$, type, value);
				}
				else if(dpas_sem_is_lvalue_ea($2))
				{
					/* Turn the effective address into an r-value */
					type = jit_type_create_pointer(dpas_sem_get_type($2), 1);
					if(!type)
					{
						dpas_out_of_memory();
					}
					dpas_sem_set_rvalue($$, type, dpas_sem_get_value($2));
				}
				else
				{
					if(!dpas_sem_is_error($2))
					{
						dpas_error("l-value required for address-of operator");
					}
					dpas_sem_set_error($$);
				}
			}
	| '@' Factor					{
				jit_type_t type;
				if(dpas_sem_is_lvalue($2))
				{
					jit_value_t value;
					value = jit_insn_address_of
						(dpas_current_function(), dpas_sem_get_value($2));
					type = jit_type_create_pointer(dpas_sem_get_type($2), 1);



( run in 1.316 second using v1.01-cache-2.11-cpan-63c85eba8c4 )