Bison Flex&;来自Argv的野牛yyin[]

Bison Flex&;来自Argv的野牛yyin[],bison,flex-lexer,argv,Bison,Flex Lexer,Argv,我在做一个Flex&Bison项目。我让我的flex&bison完美地工作,但我正在尝试为true argv提供输入字符串。所以我改变了yyin,所以它使用了argv[1],但实际上它不起作用。它只是忽略了它 这是我的主要观点 #include "parser.hpp" #include <stdio.h> #include <iostream> #include <stdlib.h> int main(int argc, char const *argv

我在做一个Flex&Bison项目。我让我的flex&bison完美地工作,但我正在尝试为true argv提供输入字符串。所以我改变了yyin,所以它使用了argv[1],但实际上它不起作用。它只是忽略了它

这是我的主要观点

#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();
}
然后我像这样跑:
/parser”(2+5)

但它什么也没做。
也许我做得不对。

Flex提供了
yy_scan_string()
,它从以null结尾的字符串(如
argv[1]
)创建一个新的缓冲区,然后切换lexing以使用该缓冲区

您可以使用它,例如:

int main(int argc,char const*argv[]){
YY_缓冲区_状态buf;
buf=yy_扫描_字符串(argv[1]);
yyparse();
yy_删除_缓冲区(buf);
返回0;
}

还有其他创建和管理缓冲区的方法,请参阅Flex文档的扫描字符串部分以了解更多详细信息。

我认为您应该看看
fopen
的实际功能。是的,我从一个示例中获取了它,但我觉得我们使用fopen很奇怪。但是我基本上不能wright
yyin=argv[1]因为类型不匹配。如果我问了一个愚蠢的问题,很抱歉。@G.Courmont:您正试图打开一个名为(2+5)的文件并从中读取。@ThomasPadron McCarthy我明白,但问题是,我怎么做?读取argv以更改yyin?@G.Courmont;据我所知,在标准C中无法将字符串作为文件打开并从中读取。除非有人找到更好的方法,否则您可以将
argv[1]
的内容写入文件,然后打开该文件。
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