gpt4 book ai didi

c++ - 将 yyin 更改为 argv[1] Flex & Bison

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:09 26 4
gpt4 key购买 nike

我正在从事 Flex & Bison 项目。我的 flex & bison 运行良好,但我正在尝试将 argv 作为输入 (yyin)。所以我改变了 yyin 以便它接受 argv[1] 但它实际上不起作用。似乎它采用了 argv[1],但后来我得到了一个语法错误,即使我认为我的字符串可以完美地工作。

这是我的弹性:

%{
#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);
%%

然后我的 Bison (我没有实现 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("\0");*/
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 页):

The routines yy_scan_bytes and yy_scan_string create a buffer with a copy of the text to be scanned.

(强调我的)

Once a string buffer is created, use yy_switch_to_buffer to tell the scanner to read from it...

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

关于c++ - 将 yyin 更改为 argv[1] Flex & Bison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com