私はFlex & Bisonプロジェクトで作業しています。私はフレックス& bisonが完璧に働いていますが、私はargvを入力(yyin)として与えようとしています。だから私はyyinを変更してargv [1]を取ったが、実際には動作していない。それはargv [1]を取ったが、私の文字列が完璧に働いていても構文エラーがあるようだ。その後、私のメインのyyinをargvに変更する[1] Flex&Bison
%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 "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やその他を実装していませんでした):ここでは
は私のフレックスです#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();
}
最後に私のメイクファイル:
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)
を試しましたが、もっとエラーがあります。 助けてくれてありがとう!
ありがとうございました! YY_BUFFER_STATEに何かを含める必要がありますか?私はそれとバッファへの切り替えのためのエラーを持っている! –
@ G.Courmont私は覚えていない、それはずっと前にFlex/Bisonを自分で使いました。私は基本的にちょうどリンクされた本を今読んでいて、私が読んだセクションで何も言わない。自動生成されたヘッダーファイル、およびシステムにインストールされているFlex/Bisonに関連するその他のヘッダーファイルを検索する必要があります。 –
この回答は正しくありません。 flexのドキュメントを参照してください。 – rici