1

我正在使用 Flex 和 Bison 编写一个 nor 计算器。这是我的 .l 文件:

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

%% 
("true"|"false")    {return BOOLEAN;}
"nor"               {return NOR;}
.                   {return yytext[0];}

%%

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

int yywrap(void)
{
     return 0;
}
int yyerror(void)
{
    getchar();
    printf("Error\n");
}

这是我的 .y 文件:

/* Bison declarations.  */
 %token BOOLEAN
 %token NOR
 %left 'nor'

 %% /* The grammar follows.  */
 input:
   /* empty */
 | input line
 ;

 line:
   '\n'
 | exp '\n'  { printf ("%s",$1); }
 ;

 exp:
   BOOLEAN            { $$ = $1;           }
 | exp 'nor' exp      { $$ = !($1 || $3);  }
 | '(' exp ')'        { $$ = $2;           }
 ;
 %%

问题是,如果我输入诸如“true or false”之类的输入,词法分析器只会到达return BOOLEAN, 然后return yytext[0],然后抛出我的错误(在 flex 代码中)。任何人都看到有什么问题吗?

4

2 回答 2

1

问题在这里:

%left 'nor'

exp:
   BOOLEAN            { $$ = $1;           }
 | exp 'nor' exp      { $$ = !($1 || $3);  }
 | '(' exp ')'        { $$ = $2;           }
 ;

您已将其编写'nor'为终端令牌,您的解析器无法将 'nor' 识别为令牌,因此您应该NOR在词法分析器返回时将其替换为:

"nor"               {return NOR;}

解决方案

    %left NOR

and 

    exp:
       BOOLEAN            { $$ = $1;           }
     | exp NOR exp      { $$ = !($1 || $3);  }
     | '(' exp ')'        { $$ = $2;           }
     ;
于 2013-02-28T16:02:56.503 回答
0

您的词法分析器还需要识别空白。制定另一个规则“”。你不需要采取行动

于 2013-02-28T15:14:17.837 回答