Título: Bisonc++ Publicado por: @nyelit en 21 Febrero 2012, 16:34 pm 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 |