我正在寫一個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」。
事實上,我用「()」認爲它需要構建對象(這很愚蠢,但是嘿,我絕望了)。 看來,傳統的Flex /野牛不能持有類,所以我正在C++ flex/bison上,希望它能做到這一點。否則,我將被迫使用全局變量,即使它是可怕的... – Viridya
@viridya:你總是可以使用一個指針。或者用bison的C++ api,你可以使用變體而不是聯合。無論如何,我不認爲字符串的矢量是你想要的。表達式通常將表達式作爲子對象,並且需要一個指針。 – rici
由於某些原因,我確實需要一個字符串向量,但非常感謝指針解決方案。我沒有想到這一點。你只是救我(因爲否則,我打算用realloc來使用C數組,並且它會變得很糟糕)。 再次感謝 – Viridya