mathics 및 symja과 같은 프로젝트를 본 후 C++에서 flex 및 bison을 사용하여 Wolfram 언어 용 오픈 소스 파서를 구현하려고합니다. 들소 -d를 호출하고하는 것은 ++은 어떤 문제를 제기하지 않는 플렉스,하지만 난 g ++ 사용할 때, 나는 다음과 같은 오류 메시지가 얻을 : 여기 flex, bison, C++에서 Wolfram 언어 구현
parser.tab.cpp:1242:16: error: use of undeclared identifier 'yylex'
yychar = YYLEX;
^
parser.tab.cpp:598:16: note: expanded from macro 'YYLEX'
# define YYLEX yylex()
^
1 error generated.
는 참조
렉서 내 .lpp 및 .ypp 파일입니다을. 어떤 도움을 주시면 감사하겠습니다
%{
#include <iostream>
#include <string>
using namespace std;
extern "C"
{
int yyparse(void);
}
void yyerror(const char *s);
%}
%union {
double dval;
char *str;
}
%token <dval> NUM;
%token <str> RBRACE;
%token <str> LBRACE;
%%
expr:
NUM { cout << $1 << endl;}
| NUM "+" NUM { cout << $1 + $3}
| NUM "-" NUM { cout << $1 - $3}
| NUM "*" NUM { cout << $1 * $3}
| NUM "/" NUM { cout << $1/$3}
;
%%
int main(int argc, char **argv)
{
yyparse();
}
void yyerror(const char *s)
{
cout << s << endl;
}
LPP
%{
#include <iostream>
#include "parser.tab.hpp"
using namespace std;
extern "C"
{
int yylex(void);
}
%}
%option c++
%option noyywrap
%%
[1-9][0-9]*(.[0-9]*)? { return NUM; }
"\[" { return LBRACE; }
"\]" cout << "rBrace" << endl;
"\(" cout << "lParen" << endl;
"\)" cout << "rParen" << endl;
"\{" cout << "lBracket" << endl;
"\}" cout << "rBracket" << endl;
"," cout << "comma" << endl;
"@@" cout << "apply" << endl;
"Apply\[" cout << "apply" << endl;
"/@" cout << "map" << endl;
"Map\[" cout << "map" << endl;
"/." cout << "rule" << endl;
"===" cout << "sameQ" << endl;
"SameQ\[" cout << "sameQ" << endl;
"+" cout << "plus" << endl;
"-" cout << "minus" << endl;
"*" cout << "times" << endl;
"/" cout << "divide" << endl;
"^" cout << "power" << endl;
"Power\[" cout << "power" << endl;
--Abbreviated--
. ECHO;
%%
int main()
{
FlexLexer* lexer = new yyFlexLexer;
while(lexer->yylex() != 0)
;
return 0;
}
parser.ypp. 고맙습니다!