将 yyin 更改为 argv[1] Flex & Bison
Change yyin to argv[1] Flex & Bison
我正在做一个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);
%%
然后我的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;
}
然后my main:
#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_bytes
和yy_scan_string
用要扫描的文本副本创建一个缓冲区。
<子>(强调我的)子>
和
创建字符串缓冲区后,使用
yy_switch_to_buffer
告诉扫描器从中读取…
yy_scan_string
only 创建一个需要显式使用的缓冲区对象:
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
我终于找到了答案。我只需要稍微改变一下main:
string str = argv[1];
str += 'n';
yy_scan_string(str.c_str());
因为yyin是以0结尾的。
您可以使用文件完全重新启动词法分析器。一个例子:
int main(int argc, char *argv[]) {
if (argc < 2) {
yylineno = 1;
yylex();
}
else {
int i;
for (i = 1; i < argc; i++) {
FILE *f = fopen(argv[i], "r");
// Check we opened the file correctly
if (!f) {
perror(argv[i]);
return 1;
}
// Start next
curfilename = argv[i];
yyrestart(f);
yylineno = 1;
yylex();
fclose(f);
}
}
}
相关文章:
- Bison/flex 在识别规则后等待输入
- Cmake with Flex/Bison on windows
- Flex/Bison标记为HTML程序
- Flex/Bison:构建示例项目以生成 CPP 时出错
- FLEX/BISON在不同的文件夹中生成location.hh,position.hh,stack.hh
- G++ flex 和 bison 'yylex' 未在此范围内声明
- G++ 在编译我的 flex 和 bison 代码时无法识别我的 c++ 类
- 在 Bison 和 Flex 中使用变体
- Flex/Bison从C 中的扫描仪返回字符令牌
- CMake not invoking FLEX/BISON
- Flex/Bison 未正确评估
- Flex Bison构造的编译器打印正确的结果,然后给出语法错误
- Numbers Flex & Bison(英语:Numbers Flex & Bison)
- flex/bison中的多个解析器:包含失败
- Flex/Bison:糟糕的令牌管理
- 将AST从flex+bison输出到main.cpp
- 将 yyin 更改为 argv[1] Flex & Bison
- Flex, Bison, C++ all in Xcode
- 使用 Flex & Bison 解析压缩文件?
- 使用flex/bison进行多行注释声明