Pregunta

Estoy usando Flex y Bison para un generador de análisis, pero que tienen problemas con los estados de inicio en mi escáner.

Estoy usando reglas exclusivos para hacer frente a comentar, pero no parece que esta gramática para que coincida con las fichas citadas:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

En este sencillo ejemplo la línea:

// a == b

No se corresponde en su totalidad a modo de comentario, a menos que incluyo esta regla:

<COMMENT>"=="             ;

¿Cómo consigo alrededor de esto sin tener que añadir todas estas fichas en mis reglas exclusivos?

¿Fue útil?

Solución

Coincidencia de los comentarios de estilo C en Lex / Flex o lo que sea está bien documentado:

en la documentación , así como diversas variaciones de todo el Internet.

Aquí hay una variación en la que se encuentra en la documentación de Flex:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }

Otros consejos

Trate de añadir una después de la [^ n] regla de "+". No sé por qué el estado exclusivo todavía se está recuperando '==' incluso en un estado exclusivo, pero al parecer lo es. Flex normalmente coincidirán con la regla que coincide con la mayoría de los textos, y añadiendo el signo "+" va a hacer al menos las dos reglas atan de largo. Poner la regla COMENTARIO primera hará que se puede utilizar en caso de empate.

La idea es:

  

El problema es el 'comer comentar'   no parece regla coincida con fichas   más de un carácter

por lo que añadir un * para que coincida con cero o más que no son nuevas líneas. ¿Quieres cero en caso contrario un comentario vacío no coincidirá.

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top