Есть вот такая КС-грамматика:
S::=E E::=E+T E::=T T::=T*F T::=F F::=c|d|e|(E)Вот такой файл с bison-кодом:
%{
#define YYSTYPE char
#include <stdio.h>
int yylex (void);
int yyerror (const char *s);
%}
%token 'c' 'e' 'd' '(' ')'
%%
S: E'\n' { printf("Правильная строка\n"); }
;
E: E'+'T
|T
;
T: T'*'F
|F
;
F: 'c'
|'e'
|'d'
|'('E')'
;
%%
#include <stdio.h>
#include <ctype.h>
#include "bison.tab.hh"
int yyparse(void);
int yyerror (const char *s) /* Called by yyparse on error */
{
printf ("%s\n", s);
}
int yylex(void) {
int c;
while ( (c = getchar()) == ' ' || c == '\t' );
if (c == EOF)
return 0;
return c;
}
int main (void)
{
return yyparse();
}
Всё это компилируется, и запускается, но во второй раз почему-то работает совсем не так, как во второй:
$ ./a.out e+c Правильная строка e+c syntax errorЧто я не так сделал-то?