C++ 将yyin更改为argv[1]Flex&;野牛
我在做一个Flex&Bison项目。我让我的flex&bison完美地工作,但我尝试将argv作为输入(yyin)。所以我改变了yyin,所以它使用了argv[1],但实际上它不起作用。似乎需要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])
%{
#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());