hello,
i have a doubt in the parser design program using flex and bison.
can someone please help me find the error.
my scan.l code:
parse.y code:Code:%{ /* a pure (reentrant) parser and scanner */ #include <stdio.h> #include <stdlib.h> #include <string.h> int my_yy_flex_debug; /* my flex debug flag */ extern int fileno(FILE *); /* avoids gcc warning */ static int number(char *, YYSTYPE *); static int string(char *, YYSTYPE *); static char *estrdup( const char *s) { char *r = malloc( strlen(s) + 1); if( r == NULL) abort(); return strcpy( r, s); } %} D [0-9] E [Ee][+\-]?{D}+ A [A-Za-z_][A-Za-z_0-9]* %% %{ yy_flex_debug = my_yy_flex_debug; %} [ \t\v\f] { /* ignore whitespace */ } [()=+*/\-\n] { return yytext[0]; } {D}+({E})? { return number(yytext, yylval); } {D}*"."{D}+({E})? { return number(yytext, yylval); } {D}+"."{D}*({E})? { return number(yytext, yylval); } '+' { return PLUS; } '-' { return MINUS; } '*' { return MULT; } "/" { return DIVI; } "reshape" { return RESHAPE; } ".+" { return DPLUS; } ".-" { return DMINUS; } ".*" { return DMULT ; } "./" { return DDIVI; } \"[^"]*\" { return string( yytext, yylval); } {A}({A}|{D})* { yylval->string = estrdup( yytext); return ID; } '=' { return EQUAL; } abs { return ABS; } avg { return AVG; } "+/" { return SPLUS; } "*/" { return SMULT; } "-/" { return SMINUS; } "//" { return SDIVI; } "#".* { /* ignore comments */ } . { return yytext[0]; /* bad token */ } %% void (*jj_junk)(int,char *,yyscan_t) = yyunput; /* avoids gcc warning */ int number( char *s, YYSTYPE *y) { if( sscanf( s, "%lf", &(y->number) ) != 1 ) return 0; return NUMBER; } int string( char *s, YYSTYPE *y) { y->string = estrdup( s); return STRING; } extern int yyparse( yyscan_t scanner); int main( int argc, char *argv[]) { yyscan_t scanner; #if YYDEBUG yydebug = argc > 1; #endif my_yy_flex_debug = argc > 1; yylex_init( &scanner); yyparse( scanner); yylex_destroy( scanner); return 0; } /* called at EOF */ int yywrap( yyscan_t scanner) { return 1; } /* called for parser syntax error */
errors:Code:%{ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef void *yyscan_t; %} %union{ int count; double number; char *string; } %token <number> NUMBER %token <string> ID %token PLUS MINUS DIVI MULT SPLUS SMINUS SMULT SDIVI DPLUS DMINUS DDIVI DMULT EQUAL ABS AVG RESHAPE %type <count> elist %{ %} %% expr : pri | MINUS expr { printf( "unary - \n"); } | expr MULT expr { printf( "binary * \n"); } | expr DIVI expr { printf( "binary / \n"); } | expr MINUS expr { printf( "binary - \n"); } | expr PLUS expr { printf( "binary + \n"); } | expr DPLUS expr { printf( "binary .+ \n"); } | expr DMINUS expr { printf( "binary .- \n"); } | expr DMULT expr { printf( "binary .* \n"); } | expr DDIVI expr { printf( "binary ./ \n"); } | expr SPLUS expr { printf( "unary +/ \n"); } | expr SMINUS expr { printf( "unary -/ \n"); } | expr SMULT expr { printf( "unary */ \n"); } | expr SDIVI expr { printf( "umary // \n"); } |expr RESHAPE expr { printf( "binary reshape \n"); } | ABS expr { printf( "unary abs\n"); } | AVG expr { printf( "unary avg\n"); } | ID EQUAL expr { printf( "binary = \n"); } ; elist : expr { $$ = 1; } | elist ',' expr { $$ += 1; } ; pri : NUMBER { printf( "push: %f\n", $1);} | '(' expr ')' | '{' { printf( "list start:\n"); } elist '}' { printf( "list end \n"); } | ID { printf( "push: %s\n", $1); } ; %%
gcc -ansi -pedantic -Wall -DDEBUG=1 -c -o scan.o scan.c
scan.l:12: parse error before "YYSTYPE"
scan.l:13: parse error before "YYSTYPE"
scan.l: In function `yylex':
scan.l:44: `yylval' undeclared (first use in this function)
scan.l:44: (Each undeclared identifier is reported only once
scan.l:44: for each function it appears in.)
scan.l:48: `PLUS' undeclared (first use in this function)
scan.l:49: `MINUS' undeclared (first use in this function)
scan.l:50: `MULT' undeclared (first use in this function)
scan.l:51: `DIVI' undeclared (first use in this function)
scan.l:52: `RESHAPE' undeclared (first use in this function)
scan.l:53: `DPLUS' undeclared (first use in this function)
scan.l:54: `DMINUS' undeclared (first use in this function)
scan.l:55: `DMULT' undeclared (first use in this function)
scan.l:56: `DDIVI' undeclared (first use in this function)
scan.l:58: `ID' undeclared (first use in this function)
scan.l:59: `EQUAL' undeclared (first use in this function)
scan.l:61: `ABS' undeclared (first use in this function)
scan.l:62: `AVG' undeclared (first use in this function)
scan.l:64: `SPLUS' undeclared (first use in this function)
scan.l:65: `SMULT' undeclared (first use in this function)
scan.l:66: `SMINUS' undeclared (first use in this function)
scan.l:67: `SDIVI' undeclared (first use in this function)
scan.l: At top level:
scan.l:78: parse error before "yyscan_t"
scan.l:80: parse error before "YYSTYPE"
scan.l: In function `number':
scan.l:82: `s' undeclared (first use in this function)
scan.l:82: `y' undeclared (first use in this function)
scan.l:83: `NUMBER' undeclared (first use in this function)
scan.l: At top level:
scan.l:86: parse error before "YYSTYPE"
scan.l: In function `string':
scan.l:88: `y' undeclared (first use in this function)
scan.l:88: `s' undeclared (first use in this function)
scan.l:89: `STRING' undeclared (first use in this function)
scan.l: At top level:
scan.l:92: parse error before "scanner"
scan.l: In function `main':
scan.l:97: `yyscan_t' undeclared (first use in this function)
scan.l:97: parse error before "scanner"
scan.l:104: warning: implicit declaration of function `yylex_init'
scan.l:104: `scanner' undeclared (first use in this function)
scan.l:108: warning: implicit declaration of function `yylex_destroy'
scan.l: At top level:
scan.l:115: parse error before "scanner"
can some someone please help me out with this one.
Thanx a lot
Regards,
Akshara



LinkBack URL
About LinkBacks


