Gramática multilínea de Bison

Usando lo siguiente flex y bison código, puedo imprimir el texto hello cuando el comando print "Hello" se ingresa:

flex file:

%{
#include <iostream>
using namespace std;
#define YY_DECL extern "C" int yylex()
#include "gbison.tab.h"
%}
%%
[ \t\n]            ;
[a-zA-Z0-9]+       { yylval.sval = strdup(yytext); return STRING; }
\"(\\.|[^"])*\"    { yylval.sval = strdup(yytext); return QUOTED_STRING; }
%%

bison file:

%{
#include <cstdio> 
#include <cstring>
#include <iostream>
using namespace std;

extern "C" int yylex();
extern "C" int yyparse();
extern "C" FILE* yyin;

void yyerror (const char* s);
%}

%union {
  char* sval;
}

%token <sval> STRING
%token <sval> QUOTED_STRING
%%

str:
    STRING QUOTED_STRING
    {
       if (strcmp($1, "print") == 0)
       {
           cout << $2 << flush;
       }
       if (strcmp($1, "println") == 0)
       {
           cout << $3 << endl; 
       }
    }
    ;
%%

main(int argc, char* argv[])
{
   FILE* input = fopen(argv[1], "r");
   if (!input)
   {
      cout << "Bad input. Nonexistant file" << endl; 
      return -1;
   } 

   yyin = input;

   do 
   {
       yyparse();
   } while (!feof(yyin));

}
void yyerror(const char* s)
{
   cout << "Error. " << s << endl; 
   exit(-1);   
}

¿Cómo cambiaría el Bison grammar para que no tuviera error de sintaxis si hay más de un comando print o println?

preguntado el 29 de septiembre de 13 a las 22:09

Tenga cuidado al etiquetar... Flex es para Adobe/Apache UI Framework. Flex-lexer es para el analizador léxico. -

@Reboog711 Lo tengo. no me di cuenta de eso flex es para Adobe/Apache Flex, no para el flex-lexer -

1 Respuestas

Añadir a la gramática antes de la primera %% línea:

%start list

y añadir a la gramática justo después de la primera %% línea:

list:
        /* Nothing */
    |   list str
    ;

Esto dice que la gramática completa consiste en una lista, y una lista no es nada (entrada vacía) o una lista seguida de 'str'.

Tal como estaba, su gramática decía que las entradas válidas consistían en exactamente una ocurrencia de 'str', de ahí el error de sintaxis cuando comenzó a repetirse.

Respondido el 30 de Septiembre de 13 a las 00:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.