| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The full treecc input file for the expression example is as follows:
%enum type_code =
{
int_type,
float_type
}
%node expression %abstract %typedef =
{
%nocreate type_code type = {int_type};
}
%node binary expression %abstract =
{
expression *expr1;
expression *expr2;
}
%node unary expression %abstract =
{
expression *expr;
}
%node intnum expression =
{
int num;
}
%node floatnum expression =
{
float num;
}
%node plus binary
%node minus binary
%node multiply binary
%node divide binary
%node power binary
%node negate unary
%operation void infer_type(expression *e)
infer_type(binary)
{
infer_type(e->expr1);
infer_type(e->expr2);
if(e->expr1->type == float_type || e->expr2->type == float_type)
{
e->type = float_type;
}
else
{
e->type = int_type;
}
}
infer_type(unary)
{
infer_type(e->expr);
e->type = e->expr->type;
}
infer_type(intnum)
{
e->type = int_type;
}
infer_type(floatnum)
{
e->type = float_type;
}
infer_type(power)
{
infer_type(e->expr1);
infer_type(e->expr2);
if(e->expr2->type != int_type)
{
error("second argument to `^' is not an integer");
}
e->type = e->expr1->type;
}
|
The full yacc grammar is as follows:
%union {
expression *node;
int inum;
float fnum;
}
%token INT FLOAT
%type <node> expr
%type <inum> INT
%type <fnum> FLOAT
%%
expr: INT { $$ = intnum_create($1); }
| FLOAT { $$ = floatnum_create($1); }
| '(' expr ')' { $$ = $2; }
| expr '+' expr { $$ = plus_create($1, $3); }
| expr '-' expr { $$ = minus_create($1, $3); }
| expr '*' expr { $$ = multiply_create($1, $3); }
| expr '/' expr { $$ = divide_create($1, $3); }
| expr '^' expr { $$ = power_create($1, $3); }
| '-' expr { $$ = negate_create($2); }
;
|
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Klaus Treichel on January, 18 2009 using texi2html 1.78.