Cで書かれたflex, bisonプログラムをC++のflex, bisonに変換したい(長文注意)
解決したいこと
flex、bisonのプログラムを、C++用のものに変換したいです。
ソースコード
%option c++
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"(" { return '('; }
")" { return ')'; }
"\n" { return NL; }
([1-9][0-9]*)|0|([0-9]+\.[0-9]*) {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.double_value = temp;
return NUM;
}
"-"([1-9][0-9]*)|0|([0-9]+\.[0-9]*) {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.double_value = temp;
return NUM;
}
[ \t] ;
. {
fprintf(stderr, "lexical error.\n");
exit(1);
}
%%
%{
#include <stdio.h>
#include <stdlib.h>
static void yyerror(const char* s)
{
fputs(s, stderr);
fputs("\n", stderr);
}
static int yywrap(void)
{
return 1;
}
%}
%union {
double double_value;
}
%type <double_value> expr
%token <double_value> NUM
%token ADD SUB MUL DIV
%token NL
%left '+' '-'
%left '*' '/'
%expect 16
%%
program : statement
| program statement
;
statement : expr NL
{
printf("%g\n", $1);
}
;
expr : NUM
| '(' expr ')'
{
$$ = $2;
}
| expr ADD expr
{
$$ = $1 + $3;
}
| expr SUB expr
{
$$ = $1 - $3;
}
| expr MUL expr
{
$$ = $1 * $3;
}
| expr DIV expr
{
if ($3 != 0) {
$$ = $1 / $3;
} else {
fprintf(stderr, "division by zero\n");
exit(1);
}
}
;
%%
#include "lex.yy.c"
int main()
{
yyparse();
return 0;
}
現在わかっていること
色々と調べた結果、flexの方は最初に%option c++をつけるだけで良いと判明しました。
自分で試したこと
#include <stdio.h>
#include <stdlib.h>
の部分を
#include <cstdio>
#include <cstdlib>
に変えてみたりしたのですが、
/usr/bin/ld: /tmp/ccQaJpf8.o: in function `yyparse()':
calc.tab.cc:(.text+0x361): undefined reference to `yylex()'
/usr/bin/ld: /tmp/ccQaJpf8.o:(.data.rel.ro._ZTV11yyFlexLexer[_ZTV11yyFlexLexer]+0x68): undefined reference to `yyFlexLexer::yywrap()'
collect2: error: ld returned 1 exit status
このようなエラーが出たりしてうまく行きませんでした。
動作環境
OS : ZorinOS
bison : 3.8.2
flex : 2.6.4
コンパイル
今の所
gcc calc.tab.c -o calc