Alien-LibJIT

 view release on metacpan or  search on metacpan

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

				$$.bounds = $3;
				parameter_list_merge(&($$.bounds), &($6.bounds));
			}
	;

BoundSpecificationList
	: BoundSpecification		{ $$ = $1; }
	| BoundSpecificationList ';' BoundSpecification	{
				$$ = $1;
				parameter_list_merge(&($$), &($3));
			}
	;

BoundSpecification
	: Identifier K_DOT_DOT Identifier ':' TypeIdentifier	{
				if($5 != jit_type_int)
				{
					char *name = dpas_type_name($5);
					dpas_error("`%s' cannot be used for array bounds; "
							   "must be `Integer'", name);
					jit_free(name);
				}
				jit_type_free($5);
				parameter_list_init(&($$));
				parameter_list_add(&($$), $1, jit_type_int);
				if(jit_strcmp($1, $3) != 0)
				{
					parameter_list_add(&($$), $3, jit_type_int);
				}
				else
				{
					dpas_error("`%s' used twice in a parameter or "
							   "field list", $1);
					parameter_list_add(&($$), 0, jit_type_int);
					jit_free($3);
				}
			}
	;

/*
 * Statements.
 */

StatementSequence
	: Statement
	| StatementSequence ';' Statement
	;

Statement
	: Label ':' InnerStatement
	| InnerStatement
	;

InnerStatement
	: AssignmentStatement			{ /* Nothing to do here */ }
	| Variable ActualParameters		{
				/* Call a procedure or an ignored-result function */
				if(dpas_sem_is_builtin($1))
				{
					/* Expand a call to a builtin procedure */
					dpas_expand_builtin
						(dpas_sem_get_builtin($1), $2.exprs, $2.len);
				}
				else if(dpas_sem_is_procedure($1))
				{
					/* Invoke a user-defined procedure */
					dpas_scope_item_t item = dpas_sem_get_procedure($1);
					invoke_procedure
						((jit_function_t)dpas_scope_item_info(item),
						 dpas_scope_item_name(item),
						 dpas_scope_item_type(item), 0, $2.exprs, $2.len);
				}
				else if(dpas_sem_is_rvalue($1) &&
						jit_type_is_signature(dpas_sem_get_type($1)))
				{
					/* Invoke a procedure via an indirect pointer */
					invoke_procedure
						(0, 0, dpas_sem_get_type($1), dpas_sem_get_value($1),
						 $2.exprs, $2.len);
				}
				else
				{
					if(!dpas_sem_is_error($1))
					{
						dpas_error("invalid function or procedure name");
					}
				}
				expression_list_free($2.exprs, $2.len);
			}
	| K_GOTO Label		{
				/* TODO */
				dpas_error("`goto' statements not yet implemented");
			}
	| CompoundStatement
	| IfStatement
	| WhileStatement
	| RepeatStatement
	| ForStatement
	| CaseStatement
	| K_WITH VariableList K_DO Statement	{
				/* TODO */
				dpas_error("`with' statements not yet implemented");
			}
	| K_THROW Expression		{
				/* TODO */
				dpas_error("`throw' statements not yet implemented");
			}
	| K_THROW					{
				/* TODO */
				dpas_error("`throw' statements not yet implemented");
			}
	| TryStatement
	| K_EXIT		{
				/* Exit from the current loop level */
				if(loop_stack_size > 0)
				{
					if(!jit_insn_branch
						(dpas_current_function(),
						 &(loop_stack[loop_stack_size - 1].exit_label)))
					{
						dpas_out_of_memory();

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

					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);
					if(!type)
					{
						dpas_out_of_memory();
					}
					dpas_sem_set_rvalue($$, jit_value_get_type(value), 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($$);
				}
			}
	| '(' Expression ')'			{ $$ = $2; }
	| Variable '(' ExpressionList ')'		{
				/* Call a function, with no ignored result */
				if(dpas_sem_is_builtin($1))
				{
					/* Expand a call to a builtin procedure */
					$$ = dpas_expand_builtin
						(dpas_sem_get_builtin($1), $3.exprs, $3.len);
				}
				else if(dpas_sem_is_procedure($1))
				{
					/* Invoke a user-defined function */
					dpas_scope_item_t item = dpas_sem_get_procedure($1);
					$$ = invoke_procedure
						((jit_function_t)dpas_scope_item_info(item),
						 dpas_scope_item_name(item),
						 dpas_scope_item_type(item), 0, $3.exprs, $3.len);
				}
				else if(dpas_sem_is_rvalue($1) &&
						jit_type_is_signature(dpas_sem_get_type($1)))
				{
					/* Invoke a function via an indirect pointer */
					$$ = invoke_procedure
						(0, 0, dpas_sem_get_type($1), dpas_sem_get_value($1),
						 $3.exprs, $3.len);
				}
				else if(dpas_sem_is_type($1) && $3.len == 1 &&
						dpas_sem_is_rvalue($3.exprs[0]))
				{
					/* Cast a value to a new type */
					jit_value_t conv;
					conv = jit_insn_convert
						(dpas_current_function(),
						 dpas_sem_get_value(dpas_lvalue_to_rvalue($3.exprs[0])),
						 dpas_sem_get_type($1), 0);
					if(!conv)
					{
						dpas_out_of_memory();
					}
					dpas_sem_set_rvalue($$, dpas_sem_get_type($1), conv);
				}
				else
				{
					if(!dpas_sem_is_error($1))
					{
						dpas_error("invalid function name");
					}
					dpas_sem_set_error($$);
				}
				expression_list_free($3.exprs, $3.len);
				if(dpas_sem_is_void($$))
				{
					dpas_error("cannot use a procedure in this context");
					dpas_sem_set_error($$);
				}
			}
	| K_VA_ARG '(' TypeIdentifier ')'		{
				/* TODO */
				dpas_error("`va_arg' not yet implemented");
				dpas_sem_set_error($$);
			}
	| K_SIZEOF '(' Variable ')'				{
				jit_nuint size;
				jit_value_t value;
				if(dpas_sem_is_rvalue($3) || dpas_sem_is_type($3))
				{
					size = jit_type_get_size(dpas_sem_get_type($3));



( run in 1.196 second using v1.01-cache-2.11-cpan-5b529ec07f3 )