[ < ] [ > ] [ << ] [ Up ] [ >> ] [Top] [Contents] [Index] [ ? ]

A. Full expression example code

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.

AltStyle によって変換されたページ (->オリジナル) /