Hola, estoy trabajando en la construción de un intérprete para un plc, usando flex y bisonc++, estoy probando unos ejemplos pero me da un error, y no se que puede ser, este es el archivo que estoy compilando con bison,( que es uno de los ejemplos de la ayuda):
%{
#include <stdio.h>
#include <string>
#include <vector>
#include "expression.h"
%}
%require "2.4"
%debug
%start start
%defines
%skeleton "lalr1.cc"
%name-prefix="example"
%define "parser_class_name" "Parser"
%locations
%initial-action
{
@$.begin.filename = @$.end.filename = &driver.streamname;
};
%parse-param { class Driver& driver }
%error-verbose
%union {
int integerVal;
double doubleVal;
std::string* stringVal;
class CalcNode* calcnode;
}
%token END 0
%token EOL
%token <integerVal> INTEGER
%token <doubleVal> DOUBLE
%token <stringVal> STRING
%type <calcnode> constant variable
%type <calcnode> atomexpr powexpr unaryexpr mulexpr addexpr expr
%destructor { delete $$; } STRING
%destructor { delete $$; } constant variable
%destructor { delete $$; } atomexpr powexpr unaryexpr mulexpr addexpr expr
%{
#include "driver.h"
#include "scanner.h"
#undef yylex
#define yylex driver.lexer->lex
%}
%%
constant : INTEGER
{
$$ = new CNConstant($1);
}
| DOUBLE
{
$$ = new CNConstant($1);
}
variable : STRING
{
if (!driver.calc.existsVariable(*$1)) {
error(yyloc, std::string("Unknown variable \"") + *$1 + "\"");
delete $1;
YYERROR;
}
else {
$$ = new CNConstant( driver.calc.getVariable(*$1) );
delete $1;
}
}
atomexpr : constant
{
$$ = $1;
}
| variable
{
$$ = $1;
}
| '(' expr ')'
{
$$ = $2;
}
powexpr : atomexpr
{
$$ = $1;
}
| atomexpr '^' powexpr
{
$$ = new CNPower($1, $3);
}
unaryexpr : powexpr
{
$$ = $1;
}
| '+' powexpr
{
$$ = $2;
}
| '-' powexpr
{
$$ = new CNNegate($2);
}
mulexpr : unaryexpr
{
$$ = $1;
}
| mulexpr '*' unaryexpr
{
$$ = new CNMultiply($1, $3);
}
| mulexpr '/' unaryexpr
{
$$ = new CNDivide($1, $3);
}
| mulexpr '%' unaryexpr
{
$$ = new CNModulo($1, $3);
}
addexpr : mulexpr
{
$$ = $1;
}
| addexpr '+' mulexpr
{
$$ = new CNAdd($1, $3);
}
| addexpr '-' mulexpr
{
$$ = new CNSubtract($1, $3);
}
expr : addexpr
{
$$ = $1;
}
assignment : STRING '=' expr
{
driver.calc.variables[*$1] = $3->evaluate();
std::cout << "Setting variable " << *$1
<< " = " << driver.calc.variables[*$1] << "\n";
delete $1;
delete $3;
}
start : /* empty */
| start ';'
| start EOL
| start assignment ';'
| start assignment EOL
| start assignment END
| start expr ';'
{
driver.calc.expressions.push_back($2);
}
| start expr EOL
{
driver.calc.expressions.push_back($2);
}
| start expr END
{
driver.calc.expressions.push_back($2);
}
%%
void example::Parser::error(const Parser::location_type& l,
const std::string& m)
{
driver.error(l, m);
}
Al compilarlo con el siguiente comando:
bisonc++ parser.yy
lanza los siguientes errores:
[Error 1] Line 1: (parser.yy) unrecognized input (`%') encountered
[Warning] Line 32: (parser.yy) deprecated use of explicit value: `END 0'
[Error 2] Line 41: (parser.yy) at `%': identifier or character-constant expected.
[Error 3] Line 41: (parser.yy) unrecognized input (`destructor') encountered
[Warning] Line 63: (parser.yy) rule `constant' type clash (`calcnode' `doubleVal
Por favor alguien puede decirme donde esta el problema.
Muchas gracias