我正在开发Flex&野牛项目。我得到了我的flex&野牛完美的工作,但我试图给输入字符串真正的argv。所以我改变了yyin以便它采用了argv [1],但它实际上不起作用。它只是忽略了它。
这是我的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 :(得分:1)
Flex提供yy_scan_string()
,它从以空字符结尾的字符串(如argv[1]
)创建一个新缓冲区,然后切换lexing以使用该缓冲区。
你可以使用它:
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文档的扫描字符串部分。