110 likes | 275 Views
Análisis Lexicográfico. Definición Un analizador léxico o lexicográfico es un programa que procesa una cadena de caracteres y produce como salida una secuencia de tokens , mismos que serán procesados por el analizador sintáctico.
E N D
Análisis Lexicográfico Definición Un analizador léxico o lexicográfico es un programa que procesa una cadena de caracteres y produce como salida una secuencia de tokens, mismos que serán procesados por el analizador sintáctico. Cada token es un elemento abstracto que identifica una clase de símbolos y puede tener asociado uno o varios atributos.
Análisis Lexicográfico Ejemplo: Evaluación de funciones f(x)=3.1416*X+sin(X/2)-X@2
Análisis Lexicográfico Algunos ejemplos de tokens pueden ser: id – que corresponde a la clase de identificadores: ej. n4, peso, ... Atributos: nombre, lexema, tipo, localidad de memoria, … entero – que identifica a un número como entero: ej. 3, 546, … Atributos: valor, lexema, tipo, localidad de memoria, … real –identifica un número real: ej. 3.14, .89, -2.1, 1.3E-2 Atributos: valor, lexema, tipo, localidad de memoria, … op – identifica un operador: ej. +, -, *, :=, … Atributos: nombre, lexema, tipo, prioridad, …
Errores lexicográficos famosos Regla de FORTRAN Los espacios en blanco son insignificantes. Ej. var r1 es lo mismo que varr1 Nota: la regla fue motivada por la falta de precisión de las perforadoras de tarjetas.
Errores lexicográficos famosos PL/1 Los comandos del lenguaje no eran palabras reservadas. Ej. IF ELSE THEN=ELSE; ELSE ELSE=THEN
Errores lexicográficos famosos PL/1 (cont.) Declaraciones: DECLARE(ARG1,…,ARGN) • No podemos decir si DECLARE es una palabra reservada hasta procesar el “)”. • Requiere de un lookahead arbitrário.
Errores lexicográficos famosos C++ Sintaxis de template: Foo<bar> Sintaxis del stream: cin>>var; El conflicto es cuando generamos templates embebidos: Foo<Bar<Bazz>>
Expresiones Regulares Def. Sea S un conjunto finito de símbolos cualquiera: i). F es una Expresión Regular ii). (la palabra vacía) es una Expresión Regular. iii). Si aS entonces a es una Expresión Regular. iv). Sean u y v dos Expresiones Regulares cualquiera: uv, u + v, y u* son Expresiones Regulares. v). Nada que no este definido por (i)-(iv) es una expresión regular.
Generador de compiladores LEX • %% marca el final de una sección • La sección de reglas: • Cada regla consiste en dos partes: un patrón y una acción, separadas por un espacio en blanco. • Lex ejecuta la acción cada vez que reconoce el patrón. • Los patrones son expresiones regulares. Ejemplo: • [\t ]+ ; /* ignora los espacios en blanco y los tabs */ • Los [] indican que cualquiera de los caracteres dentro de los paréntesis cuadrados encaja en el patrón. • La acción es simplemente “;” -- no hagas nada. • El siguiente ejemplo usa la barra vertical “|”como acción:
Generador de compiladores • Ejemplo: reconocedor de palabras %{ Este ejemplo demuestra la forma en que lex reconoce palabras %} %% [\t ]+ /* ignora los espacios en blanco */ ; did | have | go { printf(“%s: es un verbo\n”, yytext); } [a-zA-Z]+ { printf(“%s: no es un verbo\n”, yytext); } .|\n %% Main() { yylex(); }
Generador de compiladores • Como ejecutar Lex > lex ch1-01.1 > cc lex.yy.c –o first -11 Lex traduce la especificación a un programa en C llamado lex.yy.c que se deberá compilar en C.