2016-11-15 6 views
4

私はFlex & Bisonプロジェクトで作業しています。私はフレックス& bisonが完璧に働いていますが、私はargvを入力(yyin)として与えようとしています。だから私はyyinを変更してargv [1]を取ったが、実際には動作していない。それはargv [1]を取ったが、私の文字列が完璧に働いていても構文エラーがあるようだ。その後、私のメインのyyinをargvに変更する[1] Flex&Bison

%defines 
%{ 
#include <iostream> 
#include <math.h> 
using namespace std; 
extern int yylex(); 
extern void yyerror(char const* msg); 
%} 

%union {double num;} 

/* CARACTERES */ 
%token <num> NUMBER PI 
%token OP CP SEP END 

/* TRIGO */ 
%token COS SIN TAN 
%token ACOS ASIN ATAN 
/* CALCUL */ 
%token ADD SUB 
%token MUL DIV 
%token ROOT POW MODULO EXP ABS 

/* CALCUL ORDER */ 
%left ADD SUB 
%left MUL DIV 

/* TRASH */ 
%token ERROR 

%type <num> calclist exp factor term 
%start calclist 
%% 
calclist: /* nothing */ 
| calclist exp END {cout << $2 << endl;} 
; 
exp: factor 
| exp ADD factor { $$ = $1 + $3; } 
| exp SUB factor { $$ = $1 - $3; } 
; 
factor: term 
| factor MUL term { $$ = $1 * $3; } 
| factor DIV term { $$ = $1/$3; } 
; 
term: NUMBER 
| OP exp CP {$$ = $2;} 
; 
%% 



extern void yyerror(char const* msg){ 
    cerr << "Error " << msg << endl; 
} 

その後
%{ 
#include "parser.hpp" 
extern int yyparse(); 
%} 

%option noyywrap 


texte [a-zA-z]+ 
entier [0-9]+(\.[0-9])? 

%% 

{entier} { yylval.num = atoi(yytext); return(NUMBER);} 

"pi" return(PI); 
"," return(SEP); 
"(" return(OP); 
")" return(CP); 
"+" return(ADD); 
"-" return(SUB); 
"*" return(MUL); 
"/" return(DIV); 
"%" return (MODULO); 
"sin" return(SIN); 
"cos" return(COS); 
"tan" return(TAN); 
"acos" return(ACOS); 
"asin" return(ASIN); 
"atan" return(ATAN); 
"sqrt" return(ROOT); 
"pow" return(POW); 
"exp" return(EXP); 
"\n" return(END); 
{texte} return(ERROR); 
%% 

私のバイソン(私が読んでするのが最も簡単であることをCOS SINやその他を実装していませんでした):ここでは

は私のフレックスです

#include <iostream> 
#include "parser.hpp" 
#include <string.h> 
using namespace std; 

extern FILE *yyin; 
extern int yy_scan_string(const char *); 


int main(int argc, char const *argv[]) { 
    /*string buf(argv[1]); 
    buf.append("\0");*/ 
    yy_scan_string(argv[1]); 
    return yyparse(); 
} 

最後に私のメイクファイル:

all: bison flex main.cpp 
    g++ parser.cpp lexer.cpp main.cpp -o parser 
    rm lexer.cpp parser.cpp parser.hpp 
    ./parser "(1+2)" 
bison: parser.y 
    bison -o parser.cpp parser.y 
flex: lexer.l 
    flex -o lexer.cpp lexer.l 

私も./parser (1+2)を試しましたが、もっとエラーがあります。 助けてくれてありがとう!

Flex & Bison book

答えて

1
(ページ124)から

ルーチンyy_scan_bytesyy_scan_stringをスキャンするテキストのコピーをバッファを作成します。

(重点鉱山)

そして

文字列バッファを作成したら、そこから読み取るようにスキャナを伝えるためにyy_switch_to_bufferを使用して...

yy_scan_stringは、明示的にuにする必要があるバッファオブジェクトを作成します。 se:

YY_BUFFER_STATE bp = yy_scan_string(...); // Creates a buffer from the string 
yy_switch_to_buffer(bp);     // Use the buffer 
int ret = yyparse();      // Parse the string 
yy_delete_buffer(bp);      // Free the buffer 
+0

ありがとうございました! YY_BUFFER_STATEに何かを含める必要がありますか?私はそれとバッファへの切り替えのためのエラーを持っている! –

+0

@ G.Courmont私は覚えていない、それはずっと前にFlex/Bisonを自分で使いました。私は基本的にちょうどリンクされた本を今読んでいて、私が読んだセクションで何も言わない。自動生成されたヘッダーファイル、およびシステムにインストールされているFlex/Bisonに関連するその他のヘッダーファイルを検索する必要があります。 –

+0

この回答は正しくありません。 flexのドキュメントを参照してください。 – rici

0

私はついに答えを見つけました。 yyinが0で終了ですので

string str = argv[1]; 
str += '\n'; 
yy_scan_string(str.c_str()); 

: 私は私のメインの少し変更しなければならなかったジュスト。 これは他の人に役立つことを願っています!

関連する問題