elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Compilar archivos con Bisonc++ en: 21 Febrero 2012, 16:43 pm
Alguien puede decirme que diferencia existe entre las reglas semanticas de Bison y bisonc++?? Es urgente, por favor ayudenme. Muchas gracias.
2  Programación / Programación C/C++ / Bisonc++ 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
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines