LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   [flex & bison] Why does my rule fail from line 2? (http://www.linuxquestions.org/questions/programming-9/%5Bflex-and-bison%5D-why-does-my-rule-fail-from-line-2-a-211398/)

chuanyung 07-30-2004 04:21 AM

[flex & bison] Why does my rule fail from line 2?
 
Dear all,

I am a newbie to use flex and bison.
I don't know how to solve this problem.
My test file has 2 lines which are same.
I can match my rule in first line, but fail in second line.
What's wrong?

And when I need to use loop to yyparse() many times?
Please help, thanks.

Here are my files.

************
test.txt
-----------------------------------------------------
test abc 10 def
test abc 10 def
-----------------------------------------------------


***********
flex.l
--------------------------------------------------------
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bison.h"
int mylineno=1;
bool isEOF=false;
extern void yyerror(char* szErrorMessage);
%}

%option noyywrap
%option outfile="flex.c"
%option yylineno

%x stTEST

white ([ \t\r]+)
digit ([0-9])
letter ([a-zA-Z])
eol (\r?\n)

%%

{white} ;

test{white} {printf("Begin test:\n");BEGIN stTEST;return TEST;}
<stTEST>{white} ;
<stTEST>{digit}+ {yylval.INT=atoi(yytext); printf("Got integer %d\n",yylval.INT);return INTEGER;}
<stTEST>{letter}+ {yylval.STR=strdup(yytext);printf("Got string %s\n",yylval.STR);return TEXT;}
<stTEST>{eol} {printf("Got eof in test\n");BEGIN INITIAL; return EOL;}
<stTEST>. {yyerror("Not an alpha number!");yyterminate();}

. {yyerror("Not a test command\n");yyterminate();}
{eol} {mylineno++;}

<<EOF>> {isEOF=true;printf("end of file\n");return 0;}

%%
-------------------------------------------------------

************
bison.y
-------------------------------------------------------
%{
#include <stdio.h>
extern FILE* yyin;
extern int yylineno;
extern int yylex(void);
extern int mylineno;
extern bool isEOF;
void yyerror(char* szErrorMessage);
%}


%union {
int INT;
char* STR;
}
/* options */
%output="bison.c"
%no-lines
/* end of options*/

%token <INT> INTEGER
%token <STR> TEXT
%token EOL /* end of line */
%token TEST

%%

start: test {printf("test command is ok.\n");}
;

test: test_expression EOL {mylineno++};
;

test_expression: TEST TEXT INTEGER TEXT
;
%%


int main(int argc,char* argv[])
{
if (argc<2) {
printf("No file to parse\n");
return -1;
}

yyin=fopen(argv[1],"r");
if (yyin==NULL) {
printf("Fail to open file %s\n",argv[1]);
return -2;
}

yyparse();

return 0;
}

void yyerror(char* szErrorMessage)
{
printf("My error in %d: %s.\n",mylineno,szErrorMessage);
}
---------------------------------------------------------------------

*********
Makefile
--------------------------------------------------------
test: bison.o flex.o
g++ -o test bison.o flex.o -lfl -ly -lm

bison.o: bison.c bison.h
g++ -c bison.c

flex.o: flex.c bison.h
g++ -c flex.c

bison.c: bison.y
bison -d bison.y

flex.c: flex.l
flex -L flex.l

clean:
rm -rf *.o flex.c bison.c bison.h test test.exe
---------------------------------------------------------------


All times are GMT -5. The time now is 04:39 AM.