Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将yyin更改为argv[1]Flex&;野牛_C++_Bison_Lex_Argv - Fatal编程技术网

C++ 将yyin更改为argv[1]Flex&;野牛

C++ 将yyin更改为argv[1]Flex&;野牛,c++,bison,lex,argv,C++,Bison,Lex,Argv,我在做一个Flex&Bison项目。我让我的flex&bison完美地工作,但我尝试将argv作为输入(yyin)。所以我改变了yyin,所以它使用了argv[1],但实际上它不起作用。似乎需要argv[1],但随后出现了语法错误,即使我认为我的字符串工作正常 这是我的flex: %{ #include "parser.hpp" extern int yyparse(); %} %option noyywrap texte [a-zA-z]+ entier [0-9]+(\.[0-9])

我在做一个Flex&Bison项目。我让我的flex&bison完美地工作,但我尝试将argv作为输入(yyin)。所以我改变了yyin,所以它使用了argv[1],但实际上它不起作用。似乎需要argv[1],但随后出现了语法错误,即使我认为我的字符串工作正常

这是我的flex:

%{
#include "parser.hpp"
extern int yyparse();
%}

%option noyywrap


texte  [a-zA-z]+
entier [0-9]+(\.[0-9])?

%%

{entier} { yylval.num = atoi(yytext); return(NUMBER);}

"pi" return(PI);
"," return(SEP);
"(" return(OP);
")" return(CP);
"+" return(ADD);
"-" return(SUB);
"*" return(MUL);
"/" return(DIV);
"%" return (MODULO);
"sin" return(SIN);
"cos" return(COS);
"tan" return(TAN);
"acos" return(ACOS);
"asin" return(ASIN);
"atan" return(ATAN);
"sqrt" return(ROOT);
"pow" return(POW);
"exp" return(EXP);
"\n" return(END);
{texte} return(ERROR);
%%
然后是我的野牛(我没有实现COS-SIN和其他最容易阅读的功能):

我也尝试了
/parser(1+2)
,但是我得到了更多的错误。 谢谢你的帮助

来自(第124页):

例程
yy_scan_bytes
yy_scan_string
使用要扫描的文本副本创建缓冲区

(强调矿山)

创建字符串缓冲区后,使用
yy_开关_至_缓冲区
告知扫描仪从中读取

yy_scan_字符串
仅创建需要显式使用的缓冲区对象:

YY_BUFFER_STATE bp = yy_scan_string(...);  // Creates a buffer from the string
yy_switch_to_buffer(bp);                   // Use the buffer
int ret = yyparse();                       // Parse the string
yy_delete_buffer(bp);                      // Free the buffer
我终于找到了答案。 我只是需要改变一下我的主要观点:

string str = argv[1];
str += '\n';
yy_scan_string(str.c_str());
因为yyin是以0结尾的。
希望这能帮助其他人

非常感谢!我需要包括YY_缓冲区_状态的内容吗?我得到了一个错误,它和切换到缓冲区太@我不记得了,很久以前我自己也用过Flex/Bison。我现在基本上只是读了这本链接的书,在我读的章节里什么也没说。您必须搜索自动生成的头文件,以及与系统上安装的Flex/Bison相关的其他头文件。此答案不正确。请参阅flex文档。
all: bison flex main.cpp
    g++ parser.cpp lexer.cpp main.cpp -o parser
    rm lexer.cpp parser.cpp parser.hpp
    ./parser "(1+2)"
bison: parser.y
    bison -o parser.cpp parser.y
flex: lexer.l
    flex -o lexer.cpp lexer.l
YY_BUFFER_STATE bp = yy_scan_string(...);  // Creates a buffer from the string
yy_switch_to_buffer(bp);                   // Use the buffer
int ret = yyparse();                       // Parse the string
yy_delete_buffer(bp);                      // Free the buffer
string str = argv[1];
str += '\n';
yy_scan_string(str.c_str());