Flex / Bison没有正确评估
由于某种原因,野牛不想做任何评估。 所有文件的编译顺利进行,程序运行。 当我输入表达式4+5
并按回车时,它会分别为4
+
5
创建令牌。 我甚至可以把一些printf
放到野牛认识每个令牌属性的地方,包括加号(43)。
然而,程序从不评估这个生产expr '+' term { $$ = $1 + $3; }
expr '+' term { $$ = $1 + $3; }
。 至少根据我的知识,这绝不会被调用,即使是这样的制作也会assign 'n' { printf("%dn", $1); }
assign 'n' { printf("%dn", $1); }
从不打印出该值。 当^D
退出时,它会触发void yyerror(const char *)
。
任何有关这个问题的帮助,非常感谢。 谢谢!
//FLEX
%{
//#include <stdio.h>
#include "y.tab.h"
%}
%option noyywrap
letter [A-Za-z]
digit [0-9]
space [ t]
var {letter}
int {digit}+
ws {space}+
%%
{var} { yylval = (int)yytext[0]; return VAR; }
{int} { yylval = atoi(yytext); return CONST; }
{ws} { }
. { return (int)yytext[0]; }
%%
/* nothing */
。
//BISON
%{
//INCLUDE
//#include <ctype.h>
//DEFINE
#define YYDEBUG 1
//PROTOTYPE
void yyerror(const char *);
void print_welcome();
int get_val(int);
void set_val(int, int);
%}
%token CONST
%token VAR
%%
session
: { print_welcome(); }
eval
;
eval
: eval line
|
;
line
: assign 'n' { printf("%dn", $1); }
;
assign
: VAR '=' expr { set_val($1, $3); $$ = $3; }
| expr { $$ = $1; }
;
expr
: expr '+' term { $$ = $1 + $3; }
| expr '-' term { $$ = $1 - $3; }
| term { $$ = $1; }
;
term
: term '*' factor { $$ = $1 * $3; }
| term '/' factor { $$ = $1 / $3; }
| term '%' factor { $$ = $1 % $3; }
| factor { $$ = $1; }
;
factor
: '(' expr ')' { $$ = $2; }
| CONST { $$ = $1; }
| VAR { $$ = get_val($1); }
;
%%
void yyerror(const char * s)
{
fprintf(stderr, "%sn", s);
}
void print_welcome()
{
printf("Welcome to the Simple Expression Evaluator.n");
printf("Enter one expression per line, end with ^Dnn");
}
static int val_tab[26];
int get_val(int var)
{
return val_tab[var - 'A'];
}
void set_val(int var, int val)
{
val_tab[var - 'A'] = val;
}
。
//MAIN
//PROTOTYPE
int yyparse();
int main()
{
extern int yydebug;
yydebug = 0;
yyparse();
return 0;
}
您的lex
文件没有任何符合n
规则,因为在lex
/ flex
中.
匹配除行尾以外的任何字符。 lex
(或flex
)的默认规则回声,否则会忽略匹配的字符,所以n
会发生什么情况。 由于解析器无法接受line
除非它看到一个n
标记,它最终将被迫向你提供一个语法错误。
所以你需要改变规则
. { return (int)yytext[0]; }
至
.|n { return (int)yytext[0]; }
(我就不会跟投费心去int
,但它肯定没有做任何伤害,所以我离开它)。
上一篇: Flex/Bison not evaluating properly
下一篇: numbers flex & bison