2016-11-09 36 views
-1

我正在研究Flex & Bison項目。我得到了我的flex &野牛完美的工作,但我試圖給真正的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(); 
} 

這裏是我的makefile:

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

是的,我把它從一個例子中拿出來,但對我來說似乎很奇怪,我們使用fopen。但我基本上不會懷疑 'yyin = argv [1];' 因爲類型不匹配。 對不起,如果我問愚蠢的問題。 –

+0

@ G.Courmont:您正試圖打開名爲**(2 + 5)**的文件並從中讀取。 –

回答

1

Flex提供了yy_scan_string(),它從一個以空字符結尾的字符串(如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文檔的掃描部分獲取更多細節。