Bison конфликты сдвиг/вывод
Парсер должен вытаскивать двоичные числа, количество разрядов в которых чётно, а числа на симметричных разрядах различны. Раздел правил выглядит так:
%token ONE ZERO NL
%start smth
%%
smth: S NL
{ printf("valid string\n");
}
;
S: ONE S ZERO
| ZERO S ONE
| ONE ZERO
| ZERO ONE
Работает только на первых введённых 10 и 01, все остальные подходящие (101010 0101 1100101100) трактуются, как не подходящие, + 4 конфликта сдвиг-вывода. Каким образом можно разрешить конфликты?
Полная версия кода:
%{
#include<stdio.h>
#include<stdlib.h>
int yylex();
int yyerror(char *msg);
%}
%token ONE ZERO NL
%start smth
%%
smth: S NL { printf("valid string\n");
}
;
S: ONE S ZERO
| ZERO S ONE
| ONE ZERO
| ZERO ONE
;
%%
int yyerror(char *msg)
{
printf("invalid string\n");
}
int yylex(){
int c;
while ((c = getchar()) != EOF) {
if (c == '0') { yylval = 0; return (ZERO);}
else if (c == '1') {yylval = 1; return (ONE);}
else if (c == '\n') return (NL);
else return(c);
}
}
int yywrap(){ return 1; }
int main(){
printf("enter the string\n");
yyparse();
}