Flex&来自Argv的Bison yyin []

时间:2016-11-09 10:48:11

标签: bison flex-lexer argv

我正在开发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)"

但它什么都没做。 也许我没有以正确的方式做到这一点。

1 个答案:

答案 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文档的扫描字符串部分。