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();
     }

Ответы (0 шт):