首页 > 解决方案 > Bison/Flex 练习回文字符串的语言

问题描述

我正在与 Bison 和 Flex 一起练习。我的目标是为回文字符串的语言创建一个解析器。这是我非常简单的.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 自下而上工作,但这不是问题。谁能向我解释这个问题?谢谢你。

标签: bisonflex-lexeryacclex

解决方案


该语法无法使用从左到右的解析器进行解析,因为在不知道输入多长时间的情况下无法知道何时应用非递归产生式。


推荐阅读