Bison 简单解析器生成器的yylex错误

Bison 简单解析器生成器的yylex错误,bison,flex-lexer,Bison,Flex Lexer,我只是在做一个家庭作业,我要做一个简单的多项式解析器生成器。因此,它必须接受赋值,比如:a=2x2+2,也必须接受赋值,比如[2]将打印10。如果单独输入a,则应打印2x2+2。它应该适用于任何多项式。我应该使用的另一个文件中定义了一个typedef结构: typedef struct Polyn { int sign; int coeff; int exp; struct Polyn *next; } Polyn; lex文件: %option noyywrap %{ #i

我只是在做一个家庭作业,我要做一个简单的多项式解析器生成器。因此,它必须接受赋值,比如:a=2x2+2,也必须接受赋值,比如[2]将打印10。如果单独输入a,则应打印2x2+2。它应该适用于任何多项式。我应该使用的另一个文件中定义了一个typedef结构:

typedef struct Polyn {
  int sign;
  int coeff;
  int exp;
  struct Polyn *next;
} Polyn;
lex文件:

%option noyywrap

%{
#include <stdio.h>
#include <string.h>
#define YY_DECL int yylex()

#include "calc.tab.h"

%}

%%

[0-9]+      {yylval = atoi(yytext); return T_INT;}
[a-wy-z]+    {yylval.string=strdup(yytext); return T_IDENT;}
.         {return 1;}
<<EOF>>   {return 0;}
%%
%选项noyywrap
%{
#包括
#包括
#定义YY_DECL int yylex()
#包括“计算表h”
%}
%%
[0-9]+{yylval=atoi(yytext);返回T_INT;}
[a-wy-z]+{yylval.string=strdup(yytext);返回T_IDENT;}
.         {返回1;}
{返回0;}
%%
野牛档案:

%{

#include <stdio.h>
#include <stdlib.h>
#include "polyn.h"
#include "symbtab.h"

extern int yylex();
extern int yyparse();
void yyerror(const char* s);
%}


%token T_INT 
%token T_EQUAL
%token T_IDENT T_POLYN

%start input



%%

input:
    %empty
    | input line
;

line: 
    T_NEWLINE
    | expression T_NEWLINE { printf("\tResult: %i\n", $1); }
    | assign T_NEWLINE ;
    | T_QUIT T_NEWLINE { exit(0); }
;


expression: 
    T_INT               { $$ = $1; }
      | expression T_PLUS expression    { $$ = $1 + $3; }
      | expression T_MINUS expression   { $$ = $1 - $3; }
      | expression T_MULTIPLY expression    { $$ = $1 * $3; }
    | expression T_DIVIDE expression      { $$ = $1 / $3; }
      | T_LROUND expression T_RROUND        { $$ = $2; }
;

%%

int main() {
    while (yyparse());
    return 0;
}

void yyerror(const char* s) {
    fprintf(stderr, "Parse error: %s\n", s);
}
%{
#包括
#包括
#包括“polyn.h”
#包括“symbtab.h”
extern int yylex();
extern int yyparse();
无效错误(常量字符*s);
%}
%令牌T_INT
%令牌T_等于
%令牌T_IDENT T_POLYN
%开始输入
%%
输入:
%空的
|输入线
;
行:
新线
|表达式T_新行{printf(“\tResult:%i\n”,$1);}
|指定T_换行符;
|退出新行{exit(0);}
;
表达方式:
T_INT{$$=$1;}
|表达式T_加表达式{$$=$1+$3;}
|表达式T_减去表达式{$$=$1-$3;}
|表达式T_乘法表达式{$$=$1*$3;}
|表达式T_除表达式{$$=$1/$3;}
|T_LROUND表达式T_{$$=$2;}
;
%%
int main(){
while(yyparse());
返回0;
}
无效错误(常量字符*s){
fprintf(stderr,“分析错误:%s\n”,s);
}
当我现在运行它进行测试时,我得到了一个错误

./m
calc.y:54.5-11: warning: type clash on default action: <p> != <> [-Wother]
     T_POLYN
     ^^^^^^^
calc.l: In function ‘yylex’:
calc.l:15:9: error: incompatible types when assigning to type ‘YYSTYPE {aka union YYSTYPE}’ from type ‘int’
 [0-9]+  {yylval = atoi(yytext); return T_INT;}
         ^
calc.l:26:8: error: ‘YYSTYPE {aka union YYSTYPE}’ has no member named ‘string’
 [a-wy-z]+    {yylval.string=strdup(yytext); return T_IDENT;}
/m
计算y:54.5-11:警告:在默认操作时键入clash:!=[-Wother]
图波林
^^^^^^^
calc.l:在函数“yylex”中:
calc.l:15:9:错误:从类型“int”分配给类型“YYSTYPE{aka union YYSTYPE}”时,类型不兼容
[0-9]+{yylval=atoi(yytext);返回T_INT;}
^
calc.l:26:8:错误:“YYSTYPE{aka union YYSTYPE}”没有名为“string”的成员
[a-wy-z]+{yylval.string=strdup(yytext);返回T_IDENT;}

YYSTYPE
是由.y文件中的
%union
指令定义的(联合)类型:

%union {
    int intval;
    char *chstr;
    struct Polyn *p;
}
因此,它是一个包含3个字段的联合体:
intval
chstr
p
。现在看看你的错误:

calc.l:15:9: error: incompatible types when assigning to type ‘YYSTYPE {aka union YYSTYPE}’ from type ‘int’
 [0-9]+  {yylval = atoi(yytext); return T_INT;}
您正在尝试将
atoi
(int)的返回值分配给联合。不是相同的类型,因此您从C编译器得到一个类型错误。您需要
yylval.intval=atoi(

calc.l:26:8: error: ‘YYSTYPE {aka union YYSTYPE}’ has no member named ‘string’
 [a-wy-z]+    {yylval.string=strdup(yytext); return T_IDENT;}
您正试图分配给您的联合的
字符串
字段,该字段不存在。您需要
yylval.chstr=

calc.l:26:8: error: ‘YYSTYPE {aka union YYSTYPE}’ has no member named ‘string’
 [a-wy-z]+    {yylval.string=strdup(yytext); return T_IDENT;}
这些错误是简单的C错误,使用flex和bison是偶然的