2016-11-09 37 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文档的扫描部分获取更多细节。