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