gpt4 book ai didi

c++ - Flex/Bison 评估不正确

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:17 24 4
gpt4 key购买 nike

出于某种原因,bison 不想进行任何评估。所有文件编译顺利,程序运行。当我输入表达式 4+5 并按回车键时,它会分别为 4 + 5 创建标记。我什至可以将一些 printf 放入 bison 识别每个标记的属性的地方,包括加号 (43)。

但是程序从不计算这个产生式 expr '+' term { $$ = $1 + $3; }。至少据我所知,它从来没有被调用过,即使它是这个产品 assign '\n' { printf("%d\n", $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("%d\n", $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, "%s\n", s);
}

void print_welcome()
{
printf("Welcome to the Simple Expression Evaluator.\n");
printf("Enter one expression per line, end with ^D\n\n");
}

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 而烦恼,但它肯定不会造成任何伤害,所以我把它留了下来。)

关于c++ - Flex/Bison 评估不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22003442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com