[ < ] | [ > ] | [ << ] | [ 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.