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 )