g ++ flex和bison'yylex'未在此范围内声明

时间:2018-04-18 06:23:51

标签: c++ bison flex-lexer

我是flex和bison的新手 我编译代码时请帮忙‘yylex’ was not declared in this scope
这是我的sample.ll文件:

%{
#include <iostream>
using namespace std;
%}
%%
[ \t\n]         /*do nothing*/
("//")(.)*      { cout << "comments" << endl; }
"("         { cout << "start (" << endl; }
")"         { cout << "end )" << endl; }
"+"         { cout << "+ detected" << endl; }
"-"         { cout << "- detected" << endl; }
"/"         { cout << "/ detected" << endl; }
"*"         { cout << "* detected" << endl; }
"="         { cout << "= detected" << endl; }
"=="            { cout << "==" << endl; }
"<"         { cout << "<" << endl; }
"<="            { cout << "<=" << endl; }
">"         { cout << ">" << endl; }
">="            { cout << ">=" << endl; }
"!="            { cout << "!=" << endl; }
("\"")([a-zA-Z0-0\ ]*)("\"")    { cout << "string : " << yytext << endl; }
[0-9]+          { cout << "int = " << yytext << endl; }
([0-9]+)(".")([0-9]+)   { cout << "double = " << yytext << endl; }
[a-zA-Z][a-zA-Z0-9]*    { cout << "a varible or error : " << yytext << endl; }
"."         { cout << ". detected" << endl; }
.           { cout << "unknown : " << yytext <<  endl; }
%%
int main(int argc, char** argv) {
    // lex through the input:
    yylex();
}  

和我的sample.y文件是:

%start init
%token NUMBER
%{
#include <iostream>
using namespace std;
%}
%%
init : exp
;
exp : term
| exp '+' term { cout << "+"; }
| exp '-' term { cout << "-"; }
;
term : factor
| term '*' factor { cout << "*"; }
| term '/' factor { cout << "/"; }
;
factor : NUMBER { cout << $1; }
| '('exp')'
;
%%
#include "lex.yy.cc"

我使用flex -+ sample.l编译.l文件,使用bison -L c++ sample.y编译.y文件,当我运行g++ sample.tab.cc时出现错误 我尝试int yylex();void yyerror(char const*);进行修复,但我收到了另一个错误error: too many arguments to function ‘int yylex()
请帮帮我

1 个答案:

答案 0 :(得分:2)

如果要使用C ++模板,则需要使用完全不同的接口。这些内容在FlexBison手册中有所描述,您的第一步将是阅读并相应调整您的代码。

如果您只是想使用C ++(因为显然,您比cout << s << endl;更轻松地编写printf("%s\n", s);),您可以删除要求使用C ++模板的选项({ {1}}和-+)。然后,您将获得熟悉的界面,包括-L C++。您需要明确指定输出文件的文件名(例如yylex-o calc.lex.cc)。使用C ++编译器可以很好地编译C模板,但只能使用POD作为语义类型。