2016-11-09 13 views
-1

私はFlexの作業をしています& Bisonプロジェクト。私はフレックス& bisonが完璧に働いていますが、私は真のargvに入力文字列を与えようとしています。だから私はyyinを変更してargv [1]を取ったが、実際には動作していない。それはただそれを無視します。ここでArgvのFlex&Bison yyin []

は私のmain.cのである:

#include "parser.hpp" 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 

int main(int argc, char const *argv[]) { 
extern FILE* yyin; 
yyin = fopen(argv[1],"r"); 
yyparse(); 
} 

そして、ここでは私のメイクです:

all: bison flex main.cpp 
    g++ parser.cpp lexer.cpp main.cpp -o parser 
    rm lexer.cpp parser.cpp parser.hpp 
bison: parser.y 
    bison -o parser.cpp parser.y 
flex: lexer.l 
    flex -o lexer.cpp lexer.l 

その後、私は次のように実行します。 ./parser "(2+5)"

しかし、それは何もしません。 たぶん私は正しい方法でやっていません。

+0

実際に 'fopen'が何をしているかを見てください。 – rici

+0

ええ、私はexempleからそれを取ったが、私たちがfopenを使用する私には奇妙に見えます。しかし、私は基本的にはwrightできません 'yyin = argv [1]; ' タイプが一致しません。 申し訳ありません、私は愚かな質問をしています。 –

+0

@ G.Courmont:あなたは**(2 + 5)**と呼ばれるファイルを開き、そこから読み取ろうとしています。 –

答えて

1

フレックスはを提供します。これはヌルで終了する文字列(たとえばargv[1])から新しいバッファを作成し、そのバッファを使用するようにレキシングを切り替えます。あなたはそれをのようなものを使用することができます

:バッファを作成し、管理するための他の方法があります

int main(int argc, char const * argv[]) { 
    YY_BUFFER_STATE buf; 

    buf = yy_scan_string(argv[1]); 
    yyparse(); 
    yy_delete_buffer(buf); 

    return 0; 
} 

を、より多くの詳細については、Flexドキュメントのスキャン文字列セクションを参照してください。

関連する問題