私は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ファイルに含めることを忘れてしまいます。
確かに、私はオブジェクトの構築が必要であると思っていました(それは馬鹿ですが、私は絶望的でした)。 古典的なFlex/bisonはクラスを持つことができないので、私はC++ flex/bisonに向かい、そのトリックをやりたいと思っています。さもなければ、私はそれがひどい場合でもグローバル変数を使用するように強制されます... – Viridya
@viridya:いつもポインタを使うことができます。あるいは、bisonのC++ apiを使用すると、unionではなくvariantを使用できます。とにかく、私は文字列のベクトルがあなたが望むものだとは思わない。式は通常、子としての式を持ち、ポインタを必要とします。 – rici
私は実際に何らかの理由で文字列のベクトルが必要ですが、ポインタソリューションには大変感謝しています。私はそれを考えなかった。あなたは私を救ってください(そうでなければ、私はreallocでC配列を使うつもりだったのでひどいでしょう)。 もう一度ありがとう – Viridya