为什么bison的结果不显示?
Why is the result of the bison is not displayed?
我测试了这个Flex和Bison组队的例子,但是控制台没有显示计算结果。
test.l:
%{
#include "parser.tab.h"
%}
%option yylineno
%option noyywrap
%%
[/][/].*\n ; // comment
[0-9]+ { yylval = atoi(yytext);
return NUM;
}
[ \t\r\n] ; // whitespace
. { return *yytext; }
%%
parser.y:
%{
#include <stdio.h>
void yyerror(char *s) {
fprintf (stderr, "%s\n", s);
}
%}
%token NUM
%start EVALUATE
%%
EVALUATE: EXPR {printf("=%d\n", $$);} ;
EXPR: EXPR '+' TERM { $$ = + ; }
| EXPR '-' TERM { $$ = - ; }
| TERM
;
TERM: TERM '*' NUM { $$ = * ; }
| TERM '/' NUM { $$ = / ; }
| NUM
;
%%
int main()
{
return yyparse();
}
但是如果你加上了getchar(),那么在你输入这个额外的字符之后,所有的计算结果都是一样的。为什么不是这个 change(EVALUATE: EXPR{printf("=%d\n", $$); getchar();} ;
) ,我看不到结果?
对不起我的英语。
您正在解析来自 stdin
的输入,这是一个 "stream"。在该流终止之前,解析器无法知道完整的解析树。例如,如果您输入表达式 1+1
,完整的输入也可能是 1+11
、1+1-1
或 1+11*4
- 不同的表达式会导致完全不同的解析树结果。
您可以通过执行以下操作之一创建正确终止的输入:
- 输入后按 CTRL+D(在 Unix shell 上)
- 管道输入:
echo "1+1" | ./parser
- 正在从包含输入
1+1
:
的文件 inputfile.txt
中读取输入
./parser < inputfile.txt
我测试了这个Flex和Bison组队的例子,但是控制台没有显示计算结果。 test.l:
%{
#include "parser.tab.h"
%}
%option yylineno
%option noyywrap
%%
[/][/].*\n ; // comment
[0-9]+ { yylval = atoi(yytext);
return NUM;
}
[ \t\r\n] ; // whitespace
. { return *yytext; }
%%
parser.y:
%{
#include <stdio.h>
void yyerror(char *s) {
fprintf (stderr, "%s\n", s);
}
%}
%token NUM
%start EVALUATE
%%
EVALUATE: EXPR {printf("=%d\n", $$);} ;
EXPR: EXPR '+' TERM { $$ = + ; }
| EXPR '-' TERM { $$ = - ; }
| TERM
;
TERM: TERM '*' NUM { $$ = * ; }
| TERM '/' NUM { $$ = / ; }
| NUM
;
%%
int main()
{
return yyparse();
}
但是如果你加上了getchar(),那么在你输入这个额外的字符之后,所有的计算结果都是一样的。为什么不是这个 change(EVALUATE: EXPR{printf("=%d\n", $$); getchar();} ;
) ,我看不到结果?
对不起我的英语。
您正在解析来自 stdin
的输入,这是一个 "stream"。在该流终止之前,解析器无法知道完整的解析树。例如,如果您输入表达式 1+1
,完整的输入也可能是 1+11
、1+1-1
或 1+11*4
- 不同的表达式会导致完全不同的解析树结果。
您可以通过执行以下操作之一创建正确终止的输入:
- 输入后按 CTRL+D(在 Unix shell 上)
- 管道输入:
echo "1+1" | ./parser
- 正在从包含输入
1+1
:
的文件inputfile.txt
中读取输入./parser < inputfile.txt