这是.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;按下任意键后它就会消失。 此代码无法正常运行。将此功能与现有代码集成需要做些什么?
答案 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"); }
/* ... */