您好,我试图在3地址代码生成器上进行作业,其中包括:
input:x=a+3*(b/7)
output: t1=b/7
t2=3*t1
t3=a+t2
x=t3
[无论我提供什么输入作为输出,都是“语法错误”。我使用的是Windows 10 OS。yacc文件:file.y弹性档:file.l
显示控制台:error message
yacc code:
%{
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int yylex(void);
int t_count = 1;
void yyerror(char *s)
{
fprintf(stderr,"%s\n",s);
return;
}
char * generateToken(int i)
{
char* ch=(char*)malloc(sizeof(char)*5);
sprintf(ch,"t%d",i++);
return ch;
}
%}
%union { double dval; char ivar[50]; }
%token <ivar> DOUBLE
%token <ivar> NAME
%token <ivar> DIGITS
%type <ivar> expr
%type <ivar> term
%left "+" "-"
%left "*" "/"
%left "(" ")"
%%
program:
line program {
}
| line {
}
;
line:
expr "\n" {
t_count =1;
}
| NAME "=" expr "\n" {
printf("%s = %s", $3,$1);
t_count=1;
}
;
expr:
expr "+" expr {
char * x=generateToken(t_count);
printf("%s = %s + %s",x,$1,$3);
strcpy($$,x);
}
| expr "-" expr {
strcpy($$,generateToken(t_count));
printf("%s = %s - %s",$$,$1,$3);
}
| expr "*" expr {
strcpy($$,generateToken(t_count));
printf("%s = %s * %s",$$,$1,$3);
}
| expr "/" expr {
strcpy($$,generateToken(t_count));
printf("%s = %s / %s",$$,$1,$3);
}
| term {
strcpy($$, $1);
}
| "(" expr ")" {
strcpy($$,generateToken(t_count));
printf("%s =( %s )" ,$$,$2);
}
;
term:
NAME {
strcpy($$, $1);
}
| DIGITS {
strcpy($$, $1);
}
;
%%
int main(void)
{
yyparse();
return 0;
}
lex代码:
#include <stdio.h>
#include <string.h>
#include "threeAdd.tab.h"
void yyerror(char*);
extern YYSTYPE yylval;
%}
NAME [a-zA-Z]
DIGITS [0-9]
DOUBLE {DIGITS}(\.{DIGITS})?
%%
[ \t]+ { }
{DIGITS}+ {//sscanf(yytext,"%s", &yylval.ivar);
strcpy(yylval.ivar,yytext);
}
"+" {
return *yytext;
}
"-" {
return *yytext;
}
"*" {
return *yytext;
}
"/" {
return *yytext;
}
"=" {
return *yytext;
}
"(" {
return *yytext;
}
")" {
return *yytext;
}
{NAME} {
//sscanf(yytext,"%s", &yylval.ivar);
strcpy(yylval.ivar,yytext);
}
"\n" {
return *yytext;
}
exit {
return 0;
}
. {
char msg[25];
sprintf(msg," <%s>","invalid character",yytext);
yyerror(msg);
}
%%
错误消息:
C:\ Users \ USER \ OneDrive \ Desktop \ Compiler \ ICG> flex file.lC:\ Users \ USER \ OneDrive \ Desktop \ Compiler \ ICG> bison -d file.yC:\ Users \ USER \ OneDrive \ Desktop \ Compiler \ ICG> gcc lex.yy.c file.tab.c-o ICG.exe C:\ Users \ USER \ OneDrive \ Desktop \ Compiler \ ICG> ICG.exe3 + 9
语法错误
基本问题是,您在yacc文件中的令牌中使用双引号("
-字符串)(没有为它们定义任何代码,因此它们没有用),并返回单字符令牌([C0 ])在您的lex文件中。结果,解析器中不会识别任何令牌。
将yacc文件中所有单个字符标记上的所有'
字符替换为"
字符(因此'
变为"+"
)