2011-11-06 15 views
7

recién estamos comenzando a usar flex para construir un lexer para un proyecto, pero no podemos encontrar la manera de hacerlo funcionar. Copio el código de ejemplo dado en los tutoriales y trato de ejecutar Flex ++ con el archivo tut como su argumento, sin embargo, acabo de recibir un error cada vez. p.ej.Error de carácter incorrecto de Flex ++ y más. nuevo para flex

archivo de entrada (calc.l)

%name Scanner 
%define IOSTREAM 

DIGIT [0-9] 
DIGIT1 [1-9] 

%% 

"+"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"-"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"="    { cout << "operator <" << yytext[0] << ">" << endl; } 
{DIGIT1}{DIGIT}* { cout << " number <" << yytext << ">" << endl; } 
.     { cout << " UNKNOWN <" << yytext[0] << ">" << endl; } 

%% 

int main(int argc, char ** argv) 
{ 
    Scanner scanner; 
    scanner.yylex(); 
    return 0; 
} 

con este código me sale

flex ++ calc.l
calc.l: 1: mal carácter:% calc. l: 1: sección de procesamiento de errores desconocidos 1
calc.l: 1: sección de procesamiento de errores desconocidos 1
calc.l: 1: proceso de error desconocido g sección 1
calc.l: 2: no reconocido '%' Directiva

Podría alguien ayudarme a entender lo que estoy haciendo mal aquí? aplausos

+0

se hizo mediante la posibilidad de obtener esta información de http://www.mario-konrad.ch/index.php?page=20024? Estoy teniendo el mismo problema aunque lo he descargado por segunda vez, así que lo investigaré. – Ell

+0

Me sale el mismo error aquí. – JohnTortugo

+0

Sé que esta es una pregunta muy antigua ... pero encontré al menos una forma de compilar y ejecutar este tipo de archivo si alguna vez lo necesita en el futuro. – summea

Respuesta

3

Se podría intentar algo como:

  • añadiendo %{ ... %} al primer par de líneas en el archivo de
  • añadiendo #include <iostream> y using namespace std;(en lugar de tratar de definir escáner)
  • añadiendo %option noyywrap sobre las reglas sección
  • usando solo yylex()(en lugar de tratar de llamar al método de un escáner inexistente)

Con su ejemplo, podría ser algo como esto:

%{ 
#include <iostream> 
using namespace std; 
%} 

DIGIT [0-9] 
DIGIT1 [1-9] 

/* read only one input file */ 
%option noyywrap 

%% 
"+"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"-"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"="    { cout << "operator <" << yytext[0] << ">" << endl; } 
{DIGIT1}{DIGIT}* { cout << " number <" << yytext << ">" << endl; } 
.     { cout << " UNKNOWN <" << yytext[0] << ">" << endl; } 
%% 

int main(int argc, char** argv) 
{ 
    yylex(); 
    return 0; 
} 
0

¿Cuál es la versión de flex ++ estás usando? Yo uso 'Función: generador de analizador léxico rápido C/C++ V2.3.8-7 (flex ++), basado en 2.3.8 y modificado por [email protected] para C++' (opción -?) Y se procesa su cacl.c perfectamente ..

para Win32, esta versión de Flex ++/++ bisonte es here