加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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页):

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读