建筑物3地址代码生成器上的弹性野牛语法错误

问题描述 投票:0回答:1

您好,我试图在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

    语法错误

gcc compiler-errors gnu yacc lex
1个回答
0
投票

基本问题是,您在yacc文件中的令牌中使用双引号("-字符串)(没有为它们定义任何代码,因此它们没有用),并返回单字符令牌([C0 ])在您的lex文件中。结果,解析器中不会识别任何令牌。

将yacc文件中所有单个字符标记上的所有'字符替换为"字符(因此'变为"+"

© www.soinside.com 2019 - 2024. All rights reserved.