es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Está haciendo demasiado mi analizador léxico, está haciendo el trabajo del analizador sintáctico?

Mi entrada consiste en una serie de nombres, cada uno en una nueva línea. Cada nombre se compone de un nombre de pila, una inicial opcional en el medio y un apellido. Los campos de nombre están separados por tabulaciones. Aquí hay una muestra de entrada:

Sally M. Smith
Tom V. Jones
John Doe

A continuación se presentan las reglas para mi lexer Flex. Funciona bien, pero me preocupa que mi lexer esté haciendo demasiado: está determinando que un token es un nombre de pila o una inicial en el medio o un apellido. ¿Debería esa determinación hacerse en el parser y no en el lexer? ¿Estoy abusando de la capacidad del estado de Flex? Lo que busco es una crítica de mi lexer. Soy solo un principiante, ¿cómo crearía un experto en análisis sintáctico reglas de lexer para esta entrada?

{
[a-zA-Z]+ { yylval.strval = strdup(yytext); return(FIRSTNAME); }
\t { BEGIN MI_STATE; }
. { BEGIN JUNK_STATE; }
}
{
[A-Z]. { yylval.strval = strdup(yytext); return(MI); }
\t { BEGIN LASTNAME_STATE; }
. { BEGIN JUNK_STATE; }
}
{
[a-zA-Z]+ { yylval.strval = strdup(yytext); return(LASTNAME); }
\n { BEGIN INITIAL; return EOL; }
. { BEGIN JUNK_STATE; }
}
. { printf(“JUNK: %s\n”, yytext); }

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándose en la entrada de ejemplo y en las reglas proporcionadas, parece que el analizador léxico está funcionando correctamente. Está determinando correctamente que cada token es un nombre de pila, inicial del segundo nombre o apellido. El uso de los estados Flex es apropiado en este caso, ya que permite al analizador léxico diferenciar entre los diferentes tipos de tokens.

    La única sugerencia que podría hacerse es agregar una regla al estado JUNK_STATE para que regrese al estado inicial después de imprimir el token de basura. Esto aseguraría que el analizador léxico no quede atrapado en el estado JUNK_STATE si encuentra un carácter inesperado.

Comments are closed.