Зубр / Flex тренируется на языке палиндромных струн - PullRequest
0 голосов
/ 25 апреля 2020

Я тренируюсь с Бизоном и Флексом. Моя цель - создать парсер языка строк палиндрома. Это мой очень простой .l файл:

%{
#include <stdio.h>
#include <string.h>
#include "G1.tab.h"
%}

%%

"a" { return (A);}
"b" { return (B);}

%%

И это мой .y файл:

%{
#include <stdio.h>

int yylex();
int yyerror(char *s);

%}

%token A B 

%%

prog:
  srule
;

srule   
    : A srule A
    | B srule B
    | A A
    | B B
    | A
    | B
;

%%

int yyerror(char *s){
  printf("\nParsing result:  %s\n\n", s);
    return 0;
}

int main()
{
    int parse = yyparse();
    if(parse == 0) printf("\nParsing result:  SUCCESS\n\n");
    return 0;
}

Когда я пытаюсь ababbbbaba или baabaaaaabaab, которые являются правильными строки возвращает синтаксическую ошибку. Я думаю, что, возможно, есть проблема с грамматикой, но, выполняя тот же эксперимент с Antlr, он работает.

Теперь я знаю, что Antlr работает сверху вниз, а Bison Bottom-Up, но это не может быть проблема. Может кто-нибудь объяснить мне проблему? Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2020

Эта грамматика не может быть проанализирована с использованием синтаксического анализатора слева направо, потому что нет способа узнать, когда применять нерекурсивные производства, не зная, как долго вводится.

...