Related articles |
---|
Unable to use error recovery with bison f.tomassetti@gmail.com (2005-04-11) |
Re: Unable to use error recovery with bison haberg@math.su.se (2005-04-16) |
Re: Unable to use error recovery with bison f.tomassetti@gmail.com (2005-04-26) |
From: | f.tomassetti@gmail.com (Federico Tomassetti) |
Newsgroups: | comp.compilers |
Date: | 11 Apr 2005 00:15:41 -0400 |
Organization: | http://groups.google.com |
Keywords: | parse, yacc, errors |
Posted-Date: | 11 Apr 2005 00:15:40 EDT |
I spent the last days trying to make error recovery working but I
can't catch one and yyerror is always invoked:
I report a portion from the lex source, yacc source and file parsed.
I always obtain the message "syntax error, unexpected NEWLINE,
expecting SPACE"
I use bison 2.0 and flex 2.5.31
(I'm a bit frustrated so tryed to pollute my code with "error" to
solve the problem but seems it not worked...)
YACC SOURCE
-----------
start: /* empty */
| components
;
components:
| components component
| components voidspace
| error voidspace { printf("ERROR\n"); }
| error ENDOFFILE { printf("ERROR\n"); }
;
voidspace: SPACE | TAB | NEWLINE
;
component: class_decl
| error voidspace { printf("ERROR\n");}
| error NEWLINE { printf("ERROR\n"); }
| error ENDOFFILE { printf("ERROR\n"); }
;
class_decl: class_decl_header block_decls NEWLINE KWENDC
{
if (State::verbose_) {
print_pos();
printf("Exiting decl of class %s\n", $1);
}
}
| class_decl_header error KWENDC {printf("E\n");};
;
class_decl_header:
KWCLASS SPACE CLASSNAME
{
$$=$3;
if (State::verbose_) {
print_pos();
std::cout << "Entering decl of class " << $3 << std::endl;
}
try_start_class_decl( std::string( $3 ), pos_line, pos_char );
}
| KWCLASS error { printf("ciao\n");fflush(stdout);} NEWLINE
| error { printf("ciao\n");fflush(stdout);}
| KWCLASS error voidspace { printf("1a\n");}
| error voidspace { printf("1a\n");}
| error NEWLINE { printf("1a\n");}
| KWCLASS error NEWLINE { printf("1a\n");}
;
LEX SOURCE
----------
/* Save the whole line */
^.*/\n {
char str[MAXLINELENGTH+30];
snprintf(str, MAXLINELENGTH+30, "LINE READ (%s)", yytext);
verbose_info( str );
strncpy(current_line,yytext,MAXLINELENGTH);
REJECT;
}
/* Comments */
"//".*\n {
// ignore comments
}
/* Keywords */
"class" {
increment_len( strlen(yytext), 0 );
verbose_info("CLASS");
return KWCLASS;
}
"endc" {
increment_len( strlen(yytext), 0 );
verbose_info("ENDC");
return KWENDC;
}
"block" {
increment_len( strlen(yytext), 0 );
verbose_info("BLOCK");
return KWBLOCK;
}
[A-Z]+[_[A-Z]+]* {
char str[100];
increment_len( strlen(yytext), 0 );
snprintf( str, 100, "classname(%s)\n", yytext);
verbose_info( str );
yylval.string=strdup(yytext);
return CLASSNAME;
}
[a-z]+[_[a-z]+]* {
char str[100];
increment_len( strlen(yytext), 0 );
snprintf( str, 100, "methodname(%s)\n", yytext);
verbose_info( str );
yylval.string=strdup(yytext);
return METHODNAME;
}
"\n" {
increment_len( 0, 1 );
verbose_info( "NEWLINE" );
return NEWLINE;
}
\t {
increment_len( TABSIZE, 0 );
verbose_info("TAB");
return TAB;
}
\b {
increment_len( strlen(yytext), 0 );
verbose_info("SPACE");
return SPACE;
}
<<EOF>> {
increment_len(0,0); /* causa aggiornamento posizione */
verbose_info( "ENDOFFILE" );
return ENDOFFILE;
}
. {
char str[100];
increment_len( strlen(yytext), 0 );
snprintf( str, 100, "unexpected char (%c)\n", yytext[0]);
verbose_info(str);
lex_error(str);
}
/* Example file */
------------------
class
class
class
------------------
Thanks in advance for the help you can give me,
Federico Tomassetti
Return to the
comp.compilers page.
Search the
comp.compilers archives again.