2017-05-05 100 views
-1

我正在寫一個flex/bison程序,我面臨着很多錯誤。即使我認爲可能很容易理解這些錯誤,我也沒有在網上找到任何關於這些錯誤的答案。 這裏是我的代碼法:在野牛的錯誤:'yyval.YYSTYPE :: expr'沒有類的類型

%{ 
#include "my_type.hpp" 
#include "bison.tab.h" 
%} 
/* ... */ 
%% 
{int} { 
    yylval.val=strdup(yytext); 
    return(NOMBRE); 
} 
/* other pattern */ 
{id} { 
    yylval.val=strdup(yytext); 
    return(ID); 
} 
%% 

而且野牛文件:

%{ 
#include "my_type.hpp" 
int yylex(void); 
void yyerror(char *s); 
int yyparse(); 
void yy_scan_string(char*); 
%} 

%union{ 
    char* val; 
    Expr_t expr(); 
}; 
%type <val> Scalar 
%type <expr> Expression 

%token <val> ID NOMBRE 
/* other token and precedence*/ 
%start Input 
%% 
/* rules... and the two that create issues*/ 
Scalar: 
     NOMBRE      /* return char* */ 
    | ID /*int or define*/   /* return char* */ 
; 
Expression: 
     Scalar      {$$.add($1);} 
    | Expression PLUS Expression {$$.add($1).add($3);} 
    | Expression MINUS Expression {$$.add($1).add("-").add($3);} 
%% 

void yyerror(char *s) { 
    printf("err: %s\n",s); 
} 

最後, 「類型」 文件:

#include <string> 
#include <vector> 
using namespace std; 
struct Expr_t{ 
    vector<string> expr; 

    Expr_t& add(char* s){ 
     expr.push_back(string(s)); 
     return *this; 
    } 

    Expr_t& add(Expr_t& e){ 
     expr.insert(expr.end(), e.expr.begin(), e.expr.end()); 
    } 
}; 

當我編譯(野牛3.0.4, Flex 2.6.0和G ++ 5.4.0)程序bison -d bison.y ; flex flex.lex ; g++ -std=c++11 bison.tab.c lex.yy.c my_main.cpp -ll我得到了很多此類錯誤(在我的真實程序中,我不僅僅是類型「Expr」,但所有的錯誤都是相同的,不同的名稱):

bison.y: In function ‘int yyparse()’: ‘yyval.YYSTYPE::expr’ does not have class type Scalar {$$.add($1);}

EDIT______________ 我試着用:

%union{ 
    char* val; 
    Expr_t* expr; 
}; 

Expression: 
     Scalar {$$->add($1);} 

,但我得到Expr_t does not name a type

答:我忘了在flex文件中包含「type.h」。

回答

0
Expr_t expr(); 

聲明工會成員expr是沒有參數返回一個Expr_t的功能。正如錯誤消息所述,這不是類的類型,並且它沒有add成員。也許,你的意思是

Expr_t expr; 

儘管這可能會導致不同的錯誤,因爲Expr_t不POD,不能成爲工會會員。

+0

事實上,我用「()」認爲它需要構建對象(這很愚蠢,但是嘿,我絕望了)。 看來,傳統的Flex /野牛不能持有類,所以我正在C++ flex/bison上,希望它能做到這一點。否則,我將被迫使用全局變量,即使它是可怕的... – Viridya

+0

@viridya:你總是可以使用一個指針。或者用bison的C++ api,你可以使用變體而不是聯合。無論如何,我不認爲字符串的矢量是你想要的。表達式通常將表達式作爲子對象,並且需要一個指針。 – rici

+0

由於某些原因,我確實需要一個字符串向量,但非常感謝指針解決方案。我沒有想到這一點。你只是救我(因爲否則,我打算用realloc來使用C數組,並且它會變得很糟糕)。 再次感謝 – Viridya