Gramática multilínea de Bison
Frecuentes
Visto 1,050 veces
0
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?
1 Respuestas
1
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 interpreter bison flex-lexer or haz tu propia pregunta.
Tenga cuidado al etiquetar... Flex es para Adobe/Apache UI Framework. Flex-lexer es para el analizador léxico. - JeffryHouser
@Reboog711 Lo tengo. no me di cuenta de eso
flex
es para Adobe/Apache Flex, no para elflex-lexer
- inixsoftware