c – 将yyin改为argv [1] Flex&Bison
发布时间:2020-12-16 07:17:53 所属栏目:百科 来源:网络整理
导读:我正在研究Flex野牛项目.我得到了我的flex野牛完美的工作,但我想把argv作为输入(yyin).所以我改变了yyin以便它采用了argv [1],但它实际上不起作用.似乎它花了argv [1]但是后来我得到了语法错误,即使我的字符串我想要完美地工作. 这是我的flex: %{#include "
我正在研究Flex&野牛项目.我得到了我的flex&野牛完美的工作,但我想把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和其他最简单的阅读): %defines %{ #include <iostream> #include <math.h> using namespace std; extern int yylex(); extern void yyerror(char const* msg); %} %union {double num;} /* CARACTERES */ %token <num> NUMBER PI %token OP CP SEP END /* TRIGO */ %token COS SIN TAN %token ACOS ASIN ATAN /* CALCUL */ %token ADD SUB %token MUL DIV %token ROOT POW MODULO EXP ABS /* CALCUL ORDER */ %left ADD SUB %left MUL DIV /* TRASH */ %token ERROR %type <num> calclist exp factor term %start calclist %% calclist: /* nothing */ | calclist exp END {cout << $2 << endl;} ; exp: factor | exp ADD factor { $$= $1 + $3; } | exp SUB factor { $$= $1 - $3; } ; factor: term | factor MUL term { $$= $1 * $3; } | factor DIV term { $$= $1 / $3; } ; term: NUMBER | OP exp CP {$$= $2;} ; %% extern void yyerror(char const* msg){ cerr << "Error " << msg << endl; } 然后我的主要: #include <iostream> #include "parser.hpp" #include <string.h> using namespace std; extern FILE *yyin; extern int yy_scan_string(const char *); int main(int argc,char const *argv[]) { /*string buf(argv[1]); buf.append(" ");*/ yy_scan_string(argv[1]); return yyparse(); } 最后我的makefile: 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 我也试过./parser(1 2),但是我得到了更多的错误. 解决方法
从
Flex & Bison book(第124页):
(强调我的) 和
yy_scan_string只创建一个需要显式使用的缓冲区对象: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |