Comience estados de Lex / Flex
-
16-09-2019 - |
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?
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; }
. ;