Bison / Flex创建列表

我试图从中缀转换为后缀,并使用列表以正确的顺序捕获字符。 这是我的野牛档案:

%{
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
%}
%union{
    char list[100];
    int integer;
};

%token <integer> NUM
%token ENDOFLINE
%left '+' '-'
%left '*' '/'
%right NEGATIVE
%type <list> Exp
%%

Statement: 
    | Statement Line
;
Line: Exp ENDOFLINE{ printf("Result -> %sn", $1);  }
    | ENDOFLINE
;
Exp:  Exp '+' Exp {add($$,(char)$2);}
    |   Exp '*' Exp {add($$,(char)$2);}
    |   Exp '-' Exp {add($$,(char)$2);}
    |   Exp '/' Exp {add($$,(char)$2);}
    |   '-' Exp %prec NEGATIVE {add($$,(char) $1);}
    |   NUM     {$$ = create_list(); add($$,(char) $1);}
;
%%
char * create_list(){
    char expList [100];
    return expList;
}
void add(char* array, char input){
    int length = stlen(array);
    array[length] = input;
}
int main(){
    yyparse();

}

int yyerror (char *msg) {
    return printf ("error YACC: %sn", msg);
}

我有多个问题,其中一个是它说我不能将一个int添加到char [],另一个请求会员添加一个不是结构或联合的东西。 我对Bison / Flex非常陌生,如果我想存储这些值,这是否正确实现,以便我可以在主要(在某个时间点)使用它们?

编辑 :这是我最新的代码。 我更新了我的lex文件,以识别单个运算符并返回该令牌,并将适当的函数及其原型添加到我的野牛文件(a4grammer2.y)。

%{
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>

    char * create_list();
    void add(char* array, char input);
    int yyerror(char* s);
    int main(void);
%}
%union{
    char list[100];
    char character;
    int integer;
};

%token <integer> NUM
%token <character> PLUS
%token <character> MINUS
%token <character> MULTIPLY
%token <character> DIVIDE
%token ENDOFLINE
%right NEGATIVE
%type <list> Exp
%%

Statement: 
    | Statement Line
;
Line: Exp ENDOFLINE{ printf("Result -> %sn", $1);  }
    | ENDOFLINE
;
Exp:  Exp PLUS Exp {add($$,$2);}
    |   Exp MULTIPLY Exp {add($$,$2);}
    |   Exp MINUS Exp {add($$,$2);}
    |   Exp DIVIDE Exp {add($$,$2);}
    |   MINUS Exp %prec NEGATIVE {add($$,$1);}
    |   NUM     {strcpy($$,create_list()); add($$, $1);}
;
%%
char * create_list(){
    char expList [100];
    return expList;
}
void add(char* array, char input){
    int length = stlen(array);
    array[length] = input +'0';
}
int main(){
    yyparse();

}

int yyerror (char *msg) {
    return printf ("error YACC: %sn", msg);
}

现在当我编译这个使用:

yacc -d a4grammer2.y

我得到这个错误

warning: 20 shift/reduce conflicts [-Wconflicts-sr]

当我尝试使用gcc编译我得到这个:

a4grammer2.y: In function ‘create_list’:
a4grammer2.y:44:5: warning: function returns address of local variable [-Wreturn-local-addr]
     return expList;

除了评论中提到的内容之外:

Exp:  Exp '+' Exp {add($$,(char)$2);}

这和每一个生产都应该是一般的形式

Exp:  Exp '+' Exp {$$ = add($1,$3);}

我不知道是什么让你觉得每个Exp都可以转换成char. 生活会很无趣,如果情况确实如此,你的计划就完全没有必要了。

链接地址: http://www.djcxy.com/p/41749.html

上一篇: Bison/Flex creating list

下一篇: Problems with reentrant Flex and Bison