如何使用flex bison让他们了解各种规则并根据它们采取行动?

时间:2014-12-04 05:27:16

标签: bison flex-lexer

这是.l文件

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

 %% 
 "true"              {yylval=1;  return BOOLEAN;}
 "false"             {yylval=0;  return BOOLEAN;}
 "nor"               {return NOR;}
 " "                 { }
 .                   {return yytext[0];}

 %%

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

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

 **This is the .y file**

/* 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;}
   ;
   %%

当我使用控制台应用程序在visual studio中执行它们时,会出现一个命令窗口,显示&#34;按任意键继续&#34;按下任意键后它就会消失。 此代码无法正常运行。将此功能与现有代码集成需要做些什么?

1 个答案:

答案 0 :(得分:1)

我不知道它是否仍然与答案相关,但这是我的想法。

这里有几个问题。
1. .在flex中,不包括\n 你对这些工具要求太多了。

至于第一点,它很容易修复。只需添加一条规则即可在flex中匹配\n

对于第二点,bison和flex应该如何知道解析单词true意味着将其内部值设置为布尔值,意味着true
以下是您应该做出的更改:

/* Flex. */
/* ... */
true { yylval = 1; return BOOLEAN; }
false { yylval = 0; return BOOLEAN; }
/* ... */

/* Bison. */
/* ... */
| exp '\n' { printf($1 ? "true\n" : "false\n"); }
/* ... */