Open paulkokos opened 5 years ago
Example
{id} {yylval.string=strdup(yytext); return(TK_ID);}
Προσθήκη Σημασιολογικών Κανόνων
%{
typedefintYYSTYPE;
%}
program:expression { printf(“Value: %d\n”, $1};)
;
expression : term{ $$ = $1;}
| expression ‘+’ term{ $$ = $1 + $3; }
;
term: factor{ $$ = $1;}
| term ‘*’ factor{ $$ = $1 * $3; }
;
factor: ‘(‘ expression ‘)’{ $$ = $2; }
| TK_NUM{ $$ = $1; }
;
%{
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double / * double type for Bison stack * /
void yyerror(char const*s )
{
fprintf(stderr, "%s\n" , s ) ;
} %}
%token NUMBER
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
lines : lines expr '\n' { printf("%g\n" , $2 ) ; }
| lines '\n'
| / * empty * /
;
expr : expr '+' expr { $$ = $1 + $3 ; }
| expr '-' expr { $$ = $1 -$3 ; }
| expr '*' expr { $$ = $1 * $3 ; }
| expr '/' expr { $$ = $1 / $3 ; }
| '(' expr ')' { $$ = $2 ; }
| '-' expr %precUMINUS { $$ = -$2 ; }
| NUMBER
;
%%
yylex( ) {
intc ;
while ( (c=getchar( ) ) == ' ' ) ;
if ( (c=='.' ) | | (isdigit(c ) ) ) {
ungetc(c , stdin) ;
scanf("%lf" , &yylval) ;
return NUMBER ;
}return c ;
}
Πρεπει να δωσουμε την καταλληλη σημασια στον αναλυτη