2017-05-05 7 views
-1

私はflex/bisonプログラムを作成していますが、多くのエラーに直面しています。私は、たとえそれが理解しやすいと思っても、これらのエラーに関するオンラインの回答は見つけられませんでした。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); 
} 

、 "タイプ" ファイル: はここに私のlexコードである

#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を取得します。

答え: "type.h"をflexファイルに含めることを忘れてしまいます。

答えて

0
Expr_t expr(); 

組合員exprExpr_tを返す引数なしの関数であることを宣言します。エラーメッセージには、クラスタイプではなく、addのメンバーが含まれていません。 Expr_tがPODではなく、労働組合のメンバーにすることはできませんので、それはおそらく別のエラーが発生しますが、おそらく、あなたは

Expr_t expr; 

を意味しました。

+0

確かに、私はオブジェクトの構築が必要であると思っていました(それは馬鹿ですが、私は絶望的でした)。 古典的なFlex/bisonはクラスを持つことができないので、私はC++ flex/bisonに向かい、そのトリックをやりたいと思っています。さもなければ、私はそれがひどい場合でもグローバル変数を使用するように強制されます... – Viridya

+0

@viridya:いつもポインタを使うことができます。あるいは、bisonのC++ apiを使用すると、unionではなくvariantを使用できます。とにかく、私は文字列のベクトルがあなたが望むものだとは思わない。式は通常、子としての式を持ち、ポインタを必要とします。 – rici

+0

私は実際に何らかの理由で文字列のベクトルが必要ですが、ポインタソリューションには大変感謝しています。私はそれを考えなかった。あなたは私を救ってください(そうでなければ、私はreallocでC配列を使うつもりだったのでひどいでしょう)。 もう一度ありがとう – Viridya

関連する問題