{"id":1314,"date":"2012-07-27T22:57:44","date_gmt":"2012-07-27T22:57:44","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=1314"},"modified":"2012-07-27T23:06:24","modified_gmt":"2012-07-27T23:06:24","slug":"creacion-de-un-sencillo-analizador-lexico-caso-practico","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/creacion-de-un-sencillo-analizador-lexico-caso-practico\/","title":{"rendered":"Introducci\u00f3n a la compilaci\u00f3n. Creaci\u00f3n de un sencillo analizador l\u00e9xico. Caso pr\u00e1ctico"},"content":{"rendered":"<p style=\"text-align: justify;\">El analizador l\u00e9xico es la <strong>primera fase de un compilador<\/strong>, <strong>lee caracteres de entrada<\/strong> para <strong>formar componentes e identificarlos<\/strong> o clasificarlos y <strong>pasar la informaci\u00f3n de los componentes al analizador sint\u00e1ctico<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Un\u00a0<strong>compilador<\/strong>\u00a0es un\u00a0programa inform\u00e1tico\u00a0que\u00a0traduce un programa\u00a0escrito en un\u00a0lenguaje de programaci\u00f3n\u00a0a otro lenguaje de programaci\u00f3n, generando un programa equivalente que la m\u00e1quina ser\u00e1 capaz de interpretar. \u00a0Este proceso de traducci\u00f3n se conoce como\u00a0<strong>compilaci\u00f3n<\/strong>.<\/p>\n<p style=\"text-align: justify;\">El analizador l\u00e9xico que incorporan la mayor\u00eda de los compiladores de los lenguajes de programaci\u00f3n realiza adem\u00e1s funciones como eliminar espacios en blanco, saltos de l\u00ednea, tabuladores, ignorar comentarios, detecci\u00f3n y recuperaci\u00f3n de errores. Los errores que un analizador l\u00e9xico reconoce s<strong>on s\u00edmbolos no v\u00e1lidos o no reconocidos por el lexico del lenguaje o que no forman parte de ning\u00fan componente l\u00e9xico<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Existen diversos m\u00e9todos para construir una analizador l\u00e9xico, un m\u00e9todo es usar un <strong>AFD<\/strong> para describir el patr\u00f3n de cada componente. Para este m\u00e9todo se parte de una tabla descriptiva de los componentes l\u00e9xicos que reconocer\u00e1 el analizador, en donde se clasifican los diversos tipos de componentes.<\/p>\n<p style=\"text-align: justify;\">Para cada componente se construye un AFD que permita identificar el patr\u00f3n de simbolos que deber\u00e1 recibir y donde deber\u00e1 terminar ese patr\u00f3n que se\u00f1ale que ahi se encontr\u00f3 un componente. Todos los AFD\u00b4s se integran en un solo diagrama.<\/p>\n<p style=\"text-align: justify;\">Finalmente se determina la matriz de transici\u00f3n de estados, que no es m\u00e1s que transcripci\u00f3n del AFD integrado, en donde<strong> las columnas son los s\u00edmbolos que acepta el analizador<\/strong>. Lo que resta es crear un algoritmo de reconocimiento de cadenas y a\u00f1adir mediante una selecci\u00f3n de casos para tomar la acci\u00f3n correspondiente seg\u00fan la cadena encontrada.<\/p>\n<p style=\"text-align: justify;\">En este post analizaremos como crear uno sencillo, en VB.<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<p style=\"text-align: justify;\"><strong><\/strong>He preferido crear un aut\u00f3mata programable personal, aplicando los conceptos de implementaci\u00f3n del analizador l\u00e9xico. Aut\u00f3mata.<\/p>\n<p style=\"text-align: justify;\">Este aut\u00f3mata se encuentra realizado en <strong>VB<\/strong>.<\/p>\n<p>La tabla de s\u00edmbolos se encuentra en memoria y no en disco.<\/p>\n<p>Tengo que procesar todos los elementos, creados en la tabla de s\u00edmbolos.<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Analizador-lexico-oscar.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1316\" title=\"Analizador-lexico-oscar\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Analizador-lexico-oscar.jpg\" alt=\"\" width=\"673\" height=\"620\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Analizador-lexico-oscar.jpg 673w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Analizador-lexico-oscar-300x276.jpg 300w\" sizes=\"auto, (max-width: 673px) 100vw, 673px\" \/><\/a><\/p>\n<p><strong>Estos son los identificadores definidos (total 49 lexemas) para la tabla de s\u00edmbolos.<\/strong><\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/lexemas.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1333\" title=\"lexemas\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/lexemas.jpg\" alt=\"\" width=\"602\" height=\"190\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/lexemas.jpg 602w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/lexemas-300x94.jpg 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"text-align: justify;\"><br \/>\nDiagrama de transiciones.<\/span><\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/DDT.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1317\" title=\"DDT\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/DDT.jpg\" alt=\"\" width=\"568\" height=\"332\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/DDT.jpg 568w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/DDT-300x175.jpg 300w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Tabla-de-estados.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1318\" title=\"Tabla-de-estados\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Tabla-de-estados.jpg\" alt=\"\" width=\"600\" height=\"131\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Tabla-de-estados.jpg 600w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Tabla-de-estados-300x65.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Ventana del ejemplo aplicado.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/automata-aceptado.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1319\" title=\"automata-aceptado\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/automata-aceptado.jpg\" alt=\"\" width=\"323\" height=\"395\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/automata-aceptado.jpg 323w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/automata-aceptado-245x300.jpg 245w\" sizes=\"auto, (max-width: 323px) 100vw, 323px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">C\u00f3digo cuando se pulsa una tecla.<\/p>\n<pre lang=\"VB\">Private Sub valor_KeyPress(KeyAscii As Integer)\r\n\r\nIf KeyAscii = 8 Then\r\nVtemporal = \"\"\r\nElse\r\n\r\nError.Visible = False\r\naceptado.Visible = False\r\n\r\nVtemporal = Vtemporal &amp; Chr(KeyAscii)\r\ncaracter = Chr(KeyAscii)\r\nIf Not IsNumeric(Chr(KeyAscii)) Then\r\n\r\nEstado2.Value = 1\r\n\r\n'Ahora comparamos si la entrada es correcta con la tabla de simbolos.\r\nFor x = 0 To Me.TablaSimbolos.ListCount - 1\r\n   If Vtemporal = TablaSimbolos.List(x) Then\r\n        Estado3.Value = 1\r\n        aceptado.Visible = True\r\n\r\n        TablaSimbolos.Selected(x) = True\r\n\r\n        Contador = Contador + 1\r\n   End If\r\n\r\nNext x\r\n\r\nElse\r\nEstado1.Value = 1\r\nVtemporal = \"\"\r\nError.Visible = True\r\nContador = 0\r\n\r\nEnd If\r\n\r\nvalor = \"\"\r\n\r\nEnd If\r\nEnd Sub<\/pre>\n<p>Tabla de simbolos<\/p>\n<pre lang=\"VB\">'Alta de elementos en la tabla de simbolos\r\n\r\nTablaSimbolos.AddItem \"Definevar\", 0\r\nTablaSimbolos.AddItem \"Definecons\", 1\r\nTablaSimbolos.AddItem \"Ent\", 2\r\nTablaSimbolos.AddItem \"Carac\", 3\r\nTablaSimbolos.AddItem \"Variable\", 4\r\nTablaSimbolos.AddItem \"Decimal\", 5\r\nTablaSimbolos.AddItem \"*\/\", 6\r\nTablaSimbolos.AddItem \"evalua\", 7\r\nTablaSimbolos.AddItem \"vincula\", 8\r\nTablaSimbolos.AddItem \"color\", 9\r\nTablaSimbolos.AddItem \"arreglo\", 10\r\nTablaSimbolos.AddItem \"=\", 11\r\nTablaSimbolos.AddItem \"==\", 12\r\nTablaSimbolos.AddItem \"!=\", 13\r\nTablaSimbolos.AddItem \"\", 15\r\nTablaSimbolos.AddItem \"&gt;=\", 16\r\nTablaSimbolos.AddItem \"&gt;\", 29\r\nTablaSimbolos.AddItem \"convierte\", 30\r\nTablaSimbolos.AddItem \"si\", 31\r\nTablaSimbolos.AddItem \"entonces\", 32\r\nTablaSimbolos.AddItem \"encasocontrario\", 33\r\nTablaSimbolos.AddItem \"{\", 34\r\nTablaSimbolos.AddItem \"}\", 35\r\nTablaSimbolos.AddItem \"caso\", 36\r\nTablaSimbolos.AddItem \"sinocaso\", 37\r\nTablaSimbolos.AddItem \"desde\", 38\r\nTablaSimbolos.AddItem \"llamada\", 39\r\nTablaSimbolos.AddItem \"hasta\", 40\r\nTablaSimbolos.AddItem \"haz\", 41\r\nTablaSimbolos.AddItem \"&amp;&amp;\", 42\r\nTablaSimbolos.AddItem \"||\", 43\r\nTablaSimbolos.AddItem \"no\", 44\r\nTablaSimbolos.AddItem \"\/\/\", 45\r\nTablaSimbolos.AddItem \"\/*\", 46\r\nTablaSimbolos.AddItem \"funcion\", 47<\/pre>\n<p style=\"text-align: justify;\">\n<p style=\"text-align: justify;\"><strong>Adjunto c\u00f3digo fuente del ejemplo en formato RAR<\/strong><\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/Automata-ejemplo.rar\">Automata-ejemplo<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El analizador l\u00e9xico es la primera fase de un compilador, lee caracteres de entrada para formar componentes e identificarlos o clasificarlos y pasar la informaci\u00f3n de los componentes al analizador sint\u00e1ctico. Un\u00a0compilador\u00a0es un\u00a0programa inform\u00e1tico\u00a0que\u00a0traduce un programa\u00a0escrito en un\u00a0lenguaje de programaci\u00f3n\u00a0a otro lenguaje de programaci\u00f3n, generando un programa equivalente que la m\u00e1quina ser\u00e1 capaz de interpretar. \u00a0Este proceso de traducci\u00f3n se conoce como\u00a0compilaci\u00f3n. El analizador l\u00e9xico que incorporan la mayor\u00eda de los compiladores de los lenguajes de programaci\u00f3n realiza adem\u00e1s funciones como eliminar espacios en blanco, saltos de l\u00ednea, tabuladores, ignorar comentarios, detecci\u00f3n y recuperaci\u00f3n de errores. Los errores que un analizador l\u00e9xico reconoce son s\u00edmbolos no v\u00e1lidos o no reconocidos por el lexico del lenguaje o que no forman parte de ning\u00fan componente l\u00e9xico. Existen diversos m\u00e9todos para construir una analizador l\u00e9xico, un m\u00e9todo es usar un AFD para describir el patr\u00f3n de cada componente. Para este m\u00e9todo se parte de una tabla descriptiva de los componentes l\u00e9xicos que reconocer\u00e1 el analizador, en donde se clasifican los diversos tipos de componentes. Para cada componente se construye un AFD que permita identificar el patr\u00f3n de simbolos que deber\u00e1 recibir y donde deber\u00e1 terminar ese patr\u00f3n que se\u00f1ale que ahi se encontr\u00f3 un componente. Todos los AFD\u00b4s se integran en un solo diagrama. Finalmente se determina la matriz de transici\u00f3n de estados, que no es m\u00e1s que transcripci\u00f3n del AFD integrado, en donde las columnas son los s\u00edmbolos que acepta el analizador. Lo que resta es crear un algoritmo de reconocimiento de cadenas y a\u00f1adir mediante una selecci\u00f3n de casos para tomar la acci\u00f3n correspondiente seg\u00fan la cadena encontrada. En este post analizaremos como crear uno sencillo, en VB.<\/p>\n","protected":false},"author":1,"featured_media":1324,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,5,14],"tags":[145,146,147,44],"class_list":["post-1314","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-formacion","category-programacion","category-varios","tag-analizador-lexico","tag-lenguajes","tag-procesadores","tag-programacion-2"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/1314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=1314"}],"version-history":[{"count":14,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/1314\/revisions"}],"predecessor-version":[{"id":1329,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/1314\/revisions\/1329"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/1324"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=1314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=1314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=1314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}