我测试了团队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 { $$ = $1 + $3; }
| EXPR '-' TERM { $$ = $1 - $3; }
| TERM
;
TERM: TERM '*' NUM { $$ = $1 * $3; }
| TERM '/' NUM { $$ = $1 / $3; }
| NUM
;
%%
int main()
{
return yyparse();
}
但是如果添加getchar(),则在输入此附加字符后,将显示所有相同的计算结果。为什么不进行此更改(EVALUATE: EXPR{printf("=%d\n", $$); getchar();} ;
),我看不到结果?
对不起我的英文。
答案 0 :(得分:0)
您正在解析来自stdin
的输入,这是&#34;流&#34;。在该流终止之前,解析器无法知道完整的解析树。例如,如果您输入表达式1+1
,则完整输入也可以是1+11
,1+1-1
或1+11*4
- 不同的表达式会导致完全不同的解析树结果
您可以通过执行以下操作之一来创建正确终止的输入:
echo "1+1" | ./parser
inputfile.txt
的文件1+1
中读取输入:./parser < inputfile.txt