rom@mvsun.ericsson.se (Robert Malmgren TK/DG) (03/05/91)
I'm trying to learn yacc and lex, but I'm having a tough time. I've written
a simple testprogram that does an arithmetic operation on two args. The
problem is that it works the first time I enter the digits and prints the
correct result, but fails with a 'syntax error'-message the second time. Why?
Could someone please enlighten me.
--------------------------------------- c.l -----------------------------------
%%
[ \t]+ ;
[0-9]+ {
sscanf(yytext, "%d", &yylval);
return INTEGER;
}
[-+\*] return yytext[0];
\n return '\n';
%%
--------------------------------------- c.y -----------------------------------
%token INTEGER
%%
line: '\n'
| expr '\n'
{printf("%d\n", $1);}
;
expr: expr '+' expr
{$$ = $1 + $3;}
| expr '-' expr
{$$ = $1 - $3;}
| expr '*' expr
{$$ = $1 * $3;}
| int
;
int: INTEGER {
$$ = $1;
}
;
%%
#include "lex.yy.c"
-------------------------------------------------------------------------------
Robert Malmgren ! Phone: +46 8 7197937 ! Internet: rom@miranda.ericsson.se
MV/ETX/TK/DG ! Fax : +46 8 7196443 ! UUCP: ..uunet!mvsun.ericsson.se!rom
Ericsson Telecom ! Home : +46 8 933733 ! SUNET : MINDA::ROBERTdclark@b11.ingr.com (Dave Clark) (03/07/91)
rom@mvsun.ericsson.se (Robert Malmgren TK/DG) writes: >I'm trying to learn yacc and lex, but I'm having a tough time. I've written >a simple testprogram that does an arithmetic operation on two args. The >problem is that it works the first time I enter the digits and prints the >correct result, but fails with a 'syntax error'-message the second time. Why? >Could someone please enlighten me. {Lex stuff deleted} >--------------------------------------- c.y ----------------------------------- >%token INTEGER >%% >line: '\n' > | expr '\n' > {printf("%d\n", $1);} > ; {Yacc stuff deleted} Yacc begins parsing with the first production ("line" in your example). To change this, use the %start directive. The first production is successfully parsed -- fine. But your grammar defines that there should be only one "line" per file. To fix this, you can add the following production (before "line" in your file). file: /* empty */ | line file ; This allows a "file" to consist of zero or more lines. -- ---------------------------------------------------------------------------- Dave Clark | System Development | I among men bear the same wounded hand, Intergraph Corp., CR1102 | suffer the same reddened cup