野牛引发语法错误,但我看不到我的错误

时间:2018-11-27 17:24:12

标签: c syntax-error bison flex-lexer

我写了一个简单的程序,希望它是输出后缀表示及其值的中缀计算器。我不知道为什么,但是当我运行它并将其传递给简单数据时,我得到了语法错误。这是我通过的内容,以及与src文件一起返回的内容。

执行:

2+2+2
2 2 + 
4
syntax error

野牛文件:

%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

extern int yylex();
extern int yyparse();

void yyerror(const char *msg);
%}

%union {
    int ival;
}

%token <ival> NUM
%type <ival> N M P A

%%

S : A               {printf("\n%d\n", $1);}
    ;

A   : P '-' P       {printf("- "); $$ = (int)($1 - $3);}
    | P '+' P       {printf("+ "); $$ = (int)($1 + $3);}
    | P             {$$ = $1;}
    ;

P   : M '/' M       {printf("/ "); $$ = (int)($1 / $3);}
    | M '*' M       {printf("* "); $$ = (int)($1 * $3);}
    | M '%' M       {printf("% "); $$ = (int)($1 % $3);}
    | M             {$$ = $1;}
    ;

M   : N '^' N       {printf("^ "); $$ = (int)pow($1, $3);}
    | N             {$$ = $1;}
    ;

N   : '(' A ')'     {$$ = $2;}
    | '-' N         {printf("-%d ", $2); (int)($$ = -$2);}
    | NUM           {printf("%d ", $1); (int)($$ = $1);}
    ;

%%

void main() {
    yyparse();
    return;
}

void yyerror(const char *msg) {
    fprintf(stderr, "%s\n", msg);
}

Flex文件:

%{
#include <stdio.h>
#include <stdlib.h>
#include "bison.tab.h"
%}

%%

#.*\n
"\\"\n
[0-9]+      {
                yylval.ival = atoi(yytext); 
                return NUM;
            }

[-+*/^%()]  {
                return yytext[0];
            }
[ \t\n]

%%

您能看到我的错误吗? Maby我只是对Bison文档的阅读不够好。很难在上面找到任何教程。

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案,但是我不知道它为什么起作用。我更改的是:

P   : M '/' M       {printf("/ "); $$ = (int)($1 / $3);}
    | M '*' M       {printf("* "); $$ = (int)($1 * $3);}
    | M '%' M       {printf("% "); $$ = (int)($1 % $3);}
    | M             {$$ = $1;}
    ;

更改为:

P   : P '/' M       {printf("/ "); $$ = (int)($1 / $3);}
    | P '*' M       {printf("* "); $$ = (int)($1 * $3);}
    | P '%' M       {printf("% "); $$ = (int)($1 % $3);}
    | M             {$$ = $1;}
    ;

并相应地对每个非终结符进行了操作。