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
|