Upload
others
View
23
Download
0
Embed Size (px)
Citation preview
Lexical Analysis (Scanning)Jose Miguel Rivero
Barcelona School of Informatics (FIB)
Technical University of Catalonia (UPC)
Jose Miguel Rivero Lexical Analysis – p. 1/46
Lexical Analysis. Summary
2.1 El análisis léxico en la compilación
2.2 Motivación
2.3 Descripción del problema
2.4 Construcción de Thompson de AFN(er)a partir de una er
2.5 Algoritmo para decidir si AFN(er) reconoce w
2.6 Alternativa: calcular el AFD(er) para AFN(er)
2.7 Comparación de los dos métodos
2.8 Algoritmo de análisis léxico
2.9 Tratamiento de errores léxicos
2.10 Generación automática de analizadores léxicos:ANTLR, flex, . . .
Jose Miguel Rivero Lexical Analysis – p. 2/46
2.1 Análisis léxico en la compilación
Estructura conceptual vs. estructura real
Objetivo. Tokens
Otros componentes léxicos
Atributos de los tokens
Ejemplo
Jose Miguel Rivero Lexical Analysis – p. 3/46
Estructura conceptual vs. estructura real
Estructura conceptual
programa
fuente ANALISIS LEXICO SINTACTICO
ANALISISSEMANTICO ANALISIS
sintactico
arbol
decorado
lista de
tokens sintactico
arbol
Estructura procedural (real)
ANALISIS LEXICO SINTACTICO
ANALISISSEMANTICO ANALISIS
token
necesito token
fuente
programa
1ª pasada 2ª pasada
sintactico
arbol
decorado sintactico
arbol
representaciones internas
Jose Miguel Rivero Lexical Analysis – p. 4/46
Objetivo. TokensObjetivo:
descomponer la secuencia de caracteresdel programa fuente en una secuencia decomponentes léxicos (tokens)
¿Cúales son los tokens que debemos reconocer yenviar al analizador sintáctico?:
palabras clave del lenguaje (while , endvars ,write , . . .)operadores (+, / , “<=”, OR, “:= ”, . . .)otros símbolos del lenguaje (paréntesis, coma,punto y coma, etc)identificadores (numels ), valores enteros (834 ),cadenas de caracteres ("Hello world!" ),reales (3.04E-3 ), . . .. . .
Jose Miguel Rivero Lexical Analysis – p. 5/46
Otros componentes léxicos
Existen componentes léxicos que deben reconocerseaunque no tengan interés para etapas posteriores delcompilador:
separadores: espacios, tabuladores, . . .comentarios: / * ... * / en C, // ... en C++cambios de línea. Interesa conocer en que líneaencontramos los tokens para situar los errores decompilación
Atributos de los tokensen todos: el número de línea
en identificadores, constantes numéricas, strings, . . . :el texto del token (el prefijo reconocido)
Jose Miguel Rivero Lexical Analysis – p. 6/46
EjemploPrograma fuente:Program
EndVars
i := 1 ; r := 1.17
EndWhile r := r / i ; i := i + 1
Vars
EndProgram
While i < 25 Do // 24 vueltas
Integer i Real r
EndVars
i := 1 ; r := 1.17 While i < 25 Do // 24 vueltas
EndWhile r := r / i ; i := i + 1
EndProgram
Vars Integer i Real r
Write ( "fin" ) Write ( "fin" )
Program1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Secuencia de tokens: PROGRAM VARS INTEGER IDENT("i") REAL
IDENT("r") ENDVARS IDENT("i") ASIG INTCONST("1") PUNTCOM IDENT("r") ASIG
REALCONST("3.14") WHILE IDENT("i") MENOR INTCONST("24") DO IDENT("r") ASIG IDENT("r")
DIVREAL IDENT("i") PUNTCOM IDENT("i") ASIG IDENT("i") MAS INTCONST("1") ENDWHILE
WRITE PARABR STRINGCONST("fin") PARCERR ENDPROGRAM
Jose Miguel Rivero Lexical Analysis – p. 7/46
2.2 Motivación
¿Por qué definir una etapa específica que realiza el análisisléxico de un programa?:
Conceptualmente es una tarea diferenciada: filtra laentrada y la descompone en aquellos elementos quetienen interés para la siguiente etapa, el análisissintáctico.
Las técnicas que veremos seránsencillas y eficientes (no debemos matar moscasa cañonazos)flexibles (los cambios a nivel léxico se puedenresolver fácilmente)transportables y generales
Estas técnicas tienen otras muchas aplicaciones.
Jose Miguel Rivero Lexical Analysis – p. 8/46
Otras aplicaciones
Recuperación de información (análisis de queries)
Problemas de genética
Editores de texto (editores dirigidos por la sintaxis, . . . )
Sistemas operativos (lenguajes de commandos, grep)Ejemplo (en unix): % rm prog * .[ch]
Lenguajes de programación (del tipo patrón/acción :(AWK )
Verificación de circuitos
. . .
Jose Miguel Rivero Lexical Analysis – p. 9/46
2.3 Descripción del problema
Expresiones regulares
Poder expresivo de las expresionesregulares
Problema a resolver por el analizador léxico
Ejemplos
Criterio para deshacer ambigüedades
¡Cuidado al definir el lenguaje!
Jose Miguel Rivero Lexical Analysis – p. 10/46
Expresiones regulares
Los elementos léxicos de un lenguaje de programación seespecifican con expresiones regulares sobre un ciertoalfabeto Σ.Reglas de formación:
er = ǫ es una expresión regular
er = a es una expresión regular para todo a ∈ Σ
si er1 y er2 son expresiones regulares,er = er1| er2 es una expresión regular
si er1 y er2 son expresiones regulares,er = er1er2 es una expresión regular
si er1 es una expresión regular, er = er∗1
es una expresión regular
si er1 es una expresión regular, er = (er1)
es una expresión regular
Jose Miguel Rivero Lexical Analysis – p. 11/46
Poder expresivo de laser’s
Mediante expresiones regulares no podemosreconocer, por ejemplo, expresiones bien parentizadaspor ejemplo del tipo {anbn}: los autómatas finitos nosaben contar.
Tampoco podemos reconocer las palabras del lenguaje{nan : n ≥ 0} ={ 0, 1a, 2aa, 3aaa, . . . }
Strings repetidos no pueden ser especificados conexpresiones regulares. El conjunto {w c w | w ∈ (a|b)∗ }no es un lenguaje regular, ni tampoco puede serdescrito con gramáticas incontextuales.
Jose Miguel Rivero Lexical Analysis – p. 12/46
Problema a resolver en elscanning
Tenemos una lista de expresiones regulares er1, . . . , ern
que describen los componentes léxicos del lenguaje, y unprograma fuente a descomponer (la palabra w).
Dadas las expresiones regulares er1, . . . , ern
y la palabra w, se trata de encontrar el prefijomás largo v de w t.q. v ∈ L(eri) para alguna i.
En caso de encontrar más de una expresión regular para elprefijo v, se elegirá la eri con la i mínima.La siguiente llamada al analizador léxico vuelve a hacer lomismo con el resto de la entrada por tratar (si w = v w′
después buscará el prefijo más largo de w′) y así hastaagotar la entrada.
Jose Miguel Rivero Lexical Analysis – p. 13/46
Ejemplos
Se trata de encontrar el prefijo más largo, por tantosi tenemos "programacion ..." no nos dirá quetenemos la palabra clave program seguido delidentificador acion
si tenemos "while ..." no nos dirá que tenemosel identificador "while"
si tenemos "ab24.8 ..." no nos dirá quetenemos el identificador "ab" seguido del real"24.8" (a menos que los identificadores sólocontengan caracteres alfabéticos)
Jose Miguel Rivero Lexical Analysis – p. 14/46
Ejemplos (cont.)
Si tenemos "10..20 ..." nos dirá que tenemos elentero "10" porque aunque intenta reconocer unreal que empieza por "10." cuando ve el segundo’.’ se da cuenta que no puede y tiene que volver allugar en el que ya había reconocido algo. Despuésreconocerá los dos puntos y por último el segundoentero. ¡Ojo, no linealidad!
Por tanto, se tiene que recordar el punto en que acabóel último prefijo aceptado (y por qué eri) por si nopodemos encontrar uno aún más largo.Si en cambio sí encontramos un prefijo aún más largonos olvidamos del anterior.
Para no perder linealidad podemos exigir que al buscarun prefijo aún más largo, sólo podemos atravesarestados aceptadores.
Jose Miguel Rivero Lexical Analysis – p. 15/46
Deshacer ambigüedades léxicasSe tiene que reconocer el prefijo más largo posible
Se tienen que especificar primero (menor i) lasexpresiones regulares que corresponden a palabrasclave, que la que define los identificadores: una palabraclave forma parte del lenguaje de las dos, pero latenemos que reconocer como palabra clave y no comoidentificador.
Ejemplo de analizador léxico en flex :
program {...; return(PROGRAM) }
vars {...; return(VARS) }
...
"," {...; return(COMA) }
...
[0-9]+ {...; return(ENTERO) }
[A-Za-z][A-Za-z0-9] * {...; return(IDENT) }
... Jose Miguel Rivero Lexical Analysis – p. 16/46
¡Cuidado al definir el lenguaje!
Es importante hacer una definición muy meditada tanto delos componentes léxicos como de la estructura sintácticade un lenguaje. Por ejemplo, estas son algunas de lassituaciones que se podrían dar:
en Fortran, la expresión DO 5 I = 1,25 ...representa el comienzo de un bucle. Si en lugar de1,25 hubiéramos escrito 1.25 estaríamos asignandodicho valor real a la variable DO5I: no free-format
si obligamos a que las etiquetas (pasa también enFortran) estén situadas en la primera columnacomplicaremos el análisis léxico
si permitimos que los reales puedan tener partedecimal vacía, el rango (de un array ) 10..40 no seanalizará correctamente
Jose Miguel Rivero Lexical Analysis – p. 17/46
2.4 Constr. de Thompson de AFN(er)
Construcción del autómata N(er) para las expresionesregulares ǫ, a, er1|er2, er1 er2, er∗1 y (er1), donde er1 y er2
son expresiones regulares con autómatas yaconstruidos N(er1) y N(er2).
er =
a
a
λ
λ
λ
λ
er = er1 er2|
N(er2)
N(er1)
er = er1 er2
N(er2)N(er1) λλ
λ
λ
er = er1*
N(er1)N(er1)
N(er)
er = (er1)
er =
λλ
Jose Miguel Rivero Lexical Analysis – p. 18/46
Construcción de Thompson (cont.)
Invariante de la construcción: todos los AFN’s tienen unestado inicial sin aristas de entrada, y un solo estadofinal sin aristas de salida
El número de estados del AFN(er) ≤ 2|er|, porque seañaden como máximo 2 nuevos estados por cada pasodurante la construcción
Tenemos como máximo 2 aristas salientes (2transiciones) por cada estado del autómata. Por tanto,podemos obtener una representación compacta delmismo.
Jose Miguel Rivero Lexical Analysis – p. 19/46
Ejemplo 1
Autómata finito indeterminista para la expresión regularer = (a|b)∗abb. Estos son los primeros pasos de lasconstrucción del AFN:
er = a
a
λ
λ
er = a | b
a
b
λ
λ
er = b
b
er = (a | b)*
λ
λ
a
b
λ
λ
λ
λ λ
λ
a
er =
λ
λ
a
b
λ
λ
λ
λ λ
λ
(a | b)* a
Jose Miguel Rivero Lexical Analysis – p. 20/46
Ejemplo 2
Combinación de AFN’s en la disyunción de las eri’s pararesolver el problema del análisis léxico
.
.
.
1 | 2 | | ner = er er ... er
λ
λ
N(er )n
N(er )
N(er )
1
2 f2
f1
fn
i
λ
Jose Miguel Rivero Lexical Analysis – p. 21/46
2.5 Algoritmo de decision para AFN(er)Definimos en primer lugar dos funciones auxiliares:
ǫ-clausura(S) es el conjunto de estados accesibles desde los estados deS a través de cero o más ǫ-transiciones.
move(S, a) es el conjunto de estados accesibles desde los estados de S
con una transición etiquetada con a.
Algoritmo que decide si AFN(er) reconoce w:Pre : s0 es el estado inicial del autómata AFN
F es el conjunto de estados finales de AFN
eof es el símbolo con el que acaba w
S := ǫ-clausura({s0});
a := LeerSimbolo( );
while a != eof do
S := ǫ-clausura(move(S, a));
a := LeerSimbolo( );
endwhile
Post : AFN acepta w ssi S ∩ F 6= ∅Jose Miguel Rivero Lexical Analysis – p. 22/46
Análisis del algoritmo
Coste temporal del algoritmo: O(|er| · |w|)
Coste espacial (tamaño de la tabla de transiciones delautómata): O(|er|)
Pero recordemos que el objetivo del análisis léxico enla compilación es obtener el prefijo más largo de w ydar prioridad a la i mínima en caso de “empate”.Para ello hay que modificar ligeramente el algoritmoanterior: tenemos que mantener el estado deaceptación más reciente (si hay varios sólo el de la i
mínima), y además guardar la longitud del prefijocorrespondiente. Así cuando ya no haya transiciónposible, sabremos cúal fue el último prefijo aceptado ypor qué expresión regular.
Jose Miguel Rivero Lexical Analysis – p. 23/46
2.6 Alternativa: calcular el AFD(er)
Algoritmo de determinización a partir de AFN(er)
Ejemplo
Coste espacial del ADF
Algoritmo de minimización de AFD’s
Ejemplo
Algoritmo de aceptación de w por el AFD
Técnicas de compresión
Jose Miguel Rivero Lexical Analysis – p. 24/46
Algoritmo de determinización
Autómata determinista: desde ningún estado hayǫ-transiciones ni tampoco más de una arista de salidapara un mismo símbolo a ∈ Σ.
Técnica de cálculo de subconjuntos. Entenderemoscada subconjunto final de estados como un estado delautómata determinista y calcularemos las transicionesentre estos estados.
Algoritmo: construiremos Dstate (el conjunto deestados de AFD) y Dtran (la tabla de transiciones delAFD). Los estados en Dstate se marcan cuando secalculan sus transiciones en Dtran.
Jose Miguel Rivero Lexical Analysis – p. 25/46
Algoritmo de determinización (cont.)
Pre: s0 es el estado inicial del autómata AFN
F es el conjunto de estados finales de AFN
ǫ-clausura({s0}) es el único estado en Dstate y no está marcado
while exista un estado S sin marcar en Dstate do
marca S
foreach simbolo de entrada a ∈ Σ do
S′ := ǫ- clausura(move(S, a));
if S′ /∈ Dstate then
añade S′ (sin marcar) a Dstate
endif
Dtran[S, a] := S′;
endfor
endwhile
Post: el estado inicial de AFD es ǫ-clausura({s0})
Son estados finales de AFD todos aquellos (conjuntos de)
estados que contengan al menos un estado de F
Jose Miguel Rivero Lexical Analysis – p. 26/46
Ejemplo
Calcular el autómata determinista para la expresión regularer = (a|b)∗abb
λ
λ
a
b
λ
λ
λ
λ
λ
bλ a b
NFA:
0 1
2 3
7 8 9 10
4 5
6
ǫ-clausura({0}) = {0, 1, 2, 4, 7} = A
ǫ-clausura(move(A, a)) = ǫ-clausura({3, 8})
= {1, 2, 3, 4, 6, 7, 8} = B
Dtran[A, a] = B
ǫ-clausura(move(A, b)) = ǫ-clausura({5})
= {1, 2, 4, 5, 6, 7} = C
Dtran[A, b] = C
. . .
Jose Miguel Rivero Lexical Analysis – p. 27/46
Ejemplo (cont.)
Dtran:
símbolo
estado a b
A B C
B B D
C B C
D B E
E B C
A D E
b b
b
a
a b b
a
a a
B
C
DFA:
Jose Miguel Rivero Lexical Analysis – p. 28/46
Coste espacial del AFD
El coste en espacio (número de estados de la tabla Dtran)puede ser exponencial respecto de la longitud de er (elnúmero de subconjuntos distintos de un conjunto de N
elementos es 2N )Ejemplo: Dada la expresión regular (a|b)∗a(a|b)k
construiremos un AFN de la siguiente forma:
Un estado inicial 0 con aristas etiquetadas con a y b
hacia sí mismo, y una arista etiquetada con a hacia elestado 1
Transiciones desde el estado i etiquetadas con a y b
hacia el estado i+1, para i ∈ [1..k]
El estado k+1 es el estado final
Jose Miguel Rivero Lexical Analysis – p. 29/46
Coste espacial del AFD (cont.)
a, b
a a, b . . . ka, b a, b k+10 1
El tamaño del AFD correspondiente es exponencialporque necesita recordar k + 1 bits (los últimos k + 1símbolos leídos)Con k = 3:
abba (estado final) −→a bbaa (estado no final)
baba (estado no final) −→b abab (estado final)
Jose Miguel Rivero Lexical Analysis – p. 30/46
Algoritmo de minimización de AFD’s
Calcula particiones sucesivas del conjunto de estados.
Pre : S es el conjunto de estados de AFD
s0 es el estado inicial de AFD
F es el conjunto de estados finales de AFD
Post : AFD′ acepta el mismo lenguaje que AFD
teniendo el mínimo número de estados posible
Jose Miguel Rivero Lexical Analysis – p. 31/46
Algoritmo de minimización (cont.)
Calcula particiones sucesivas del conjunto de estados.
partición inicial Π = Πnew con dos grupos :
estados finales F y estados no finales S \ F
repeat
Π := Πnew
for each grupo G de Π do
1. divide G en subgrupos t.q. dos estados s y t
de G quedan en el mismo subgrupo ssi para
todo símbolo a ∈ Σ, s y t tienen transiciones
hacia estados en el mismo grupo de Π.
2. reemplaza G en Πnew por el conjunto de
subgrupos formados
endfor
until Πnew = Π
Jose Miguel Rivero Lexical Analysis – p. 32/46
Algoritmo de minimización (cont.)
Se construye AFD′:
1. Sus estados se definen eligiendo un representante
de cada grupo
2. Las transiciones en AFD′ serán las que existen entre
los estados representantes de AFD
3. El estado inicial de AFD′ será el representante del
grupo que contiene s0
4. Los estados finales serán aquellos que tengan
representantes en F
Jose Miguel Rivero Lexical Analysis – p. 33/46
EjemploMinimización del autómata determinista que reconoce(a|b)∗abb
A D E
b b
b
a
a b b
a
a a
B
C
DFA:
Comentario Particiones
estados no finales / finales
(ABCD) (E)
A, B, C →b (ABCD) pero D →b (E)
(ABC) (D) (E)
A, C →b (ABC) pero B →b (D)
(AC) (B) (D) (E)
partición final
Jose Miguel Rivero Lexical Analysis – p. 34/46
Ejemplo (cont.)
Dtran:
símbolo
estado a b
AC B AC
B B D
D B E
E B AC
DFA :min
D Eb b
a
a a
B
b
AC
b
a
Jose Miguel Rivero Lexical Analysis – p. 35/46
Otro forma de calcular AFD(er)
Evita determinizar el AFN(er) y aplicar después elalgoritmo de minimización.Realiza estos dos pasos en uno.
No siempre obtiene el AFD(er) mínimo pero es unabuena técnica en la mayoria de los casos
Jose Miguel Rivero Lexical Analysis – p. 36/46
Algoritmo de decision para AFD(er)
Pre : s0 es el estado inicial del autómata AFD
F es el conjunto de estados finales de AFD
eof es el símbolo con el que acaba w
s := s0;
a := LeerSimbolo( );
while a != eof do
s := Dtran[s, a];
a := LeerSimbolo( );
endwhile
Post : AFD acepta w ssi s ∈ F
Tiene un coste temporal lineal en la longitud de la entrada O(|w|)
Tiene un coste espacial (tamaño de Dtran)O( (número de estados del AFD) ∗ (número de símbolos de Σ) ) = O(2|er|)
Jose Miguel Rivero Lexical Analysis – p. 37/46
Técnicas de compresión
Existen diferentes formas de implementar la función detransición de un AFD. La más directa es usando una tablade transición. El tamaño de esa tabla depende del númerode estados del autómata y del número de símbolos delalfabeto. Dado que:
1. el número de estados puede ser bastante elevado y
2. no existen transiciones desde cada estado para todoslos símbolos (más bien al contrario, o bien es al mismoestado para casi todos los símbolos)
esta enorme tabla se encuentra mayormente vacía (sparse)e interesa trabajar con una representación más compacta.
Jose Miguel Rivero Lexical Analysis – p. 38/46
Técnicas de compresión (cont.)Vector unidimensional de estados. Desde cada estadocuelga la lista de transiciones que sí están definidasdesde él, más eventualmente la transición que se hacepor defecto (o en caso de error). Es la más sencillapero el tiempo de cálculo del nuevo estado puedeempeorar sensiblemente.
Otras técnicas intentan aprovechar (a groso modo) lascasillas vacías contiguas que había en la tabla inicialantes del primero y a partir del último símbolo contransición en cada estado. En esos métodos se utilizanvarias tablas para saber, por ejemplo, donde comienzala fila de transiciones de un estado. Así se mejoramucho el tiempo para calcular una transicióncomparado con la técnica anterior y el espacio seaprovecha bastante mejor que utilizando la tabla inicial.
Jose Miguel Rivero Lexical Analysis – p. 39/46
Técnicas de compresión (cont.)
Podemos también solapar dos o más filas siempre quelas transiciones definidas en una y en otra no coincidan.Esta técnica se muestra en la siguiente figura:
s
s’
. . . . . .
+ a
. . . . . .check
next
base
s s s’ s s’s’s’ s s’s’
t
+ b
next(s, a) = next[base[s] + a]if check[base[s] + a] = s then
else next(s, a) = error
tran(s, a) = t tran(s’, b) = error
Jose Miguel Rivero Lexical Analysis – p. 40/46
2.7 Comparación de los dos métodos
Resumen de costes:
Autómata Coste temporal Coste espacial
AFN O(|er| · |w|) O(|er|)
AFD O(|w|) O(2|er|)
En general, cuando los dos métodos son viables (el costeen espacio del AFD no es excesivamente mayor) podemosconcluir que:
AFN es adecuado cuando |er| ↓↓
AFD es adecuado cuando |w| ↑↑ o |er| ↑↑
Jose Miguel Rivero Lexical Analysis – p. 41/46
Cálculo perezoso (lazy) de transiciones
Combina las necesidades de espacio del autómata AFNcon las ventajas en tiempo del autómata AFD.Se trabaja a partir del autómata indeterminista, calculandosólo los subconjuntos de estados que se van necesitando.Estos subconjuntos (y sus transiciones) se guardan en unacache de forma que no hace falta volver a calcularlos denuevo.Resumiendo sus ventajas:
Menor necesidad de espacio: tamaño de la tabla delAFN ( O(|er|) ) + tamaño de la cache
No se calculan transiciones entre estados que nuncason utilizadas. Esto lo hace casi tan rápido como losAFD
Jose Miguel Rivero Lexical Analysis – p. 42/46
2.8 Algoritmo de análisis léxico
Ejercicio: suponiendo que los carácteres de la entrada w (contando eof )se encuentran en un array A indexado desde 0, se trata de modificar elalgoritmo anterior para que reconozca el prefijo más largov = A[0] · · ·A[k − 1] que encaja con alguna de las expresiones regulareseri.Cuando la tabla Dtran no contiene transición para un cierto estado s ycarácter a entonces contiene el valor -1. Para distinguir un estado final deuno no final tenemos otro array DFin que dado un estado s contiene truesi s es un estado final y false en caso contrario.El algoritmo tiene que devolver el índice k y el estado (final) s tal que:
la palabra A[0] · · ·A[k − 1] es el prefijo más largo que encaja conalguna eri. Si no existe tal prefijo devuelve -1.
en ese momento el autómata se encuentra en estado s (que es elestado final de la expresión regular eri correspondiente)
Jose Miguel Rivero Lexical Analysis – p. 43/46
Algoritmo de análisis léxico (cont.)p := f := 1; l := 0;
∀i : 1 ≤ i ≤ n : qi := Inii; // Estados iniciales
while p ≤ m do
∀i : 1 ≤ i ≤ n : qi := δi( qi, IN[p] ); p :=p + 1; // Transición de estados
if ∃ i : 1 ≤ i ≤ n : qi ∈ Fi then // Estado final
l := p − 1; a = smallest i su ch that qi ∈ Fi;
elseif ∀ i : 1 ≤ i ≤ n : qi ∈ Erri then // Estados pozo
if l ≥ f then
Generate token of type a with word ; IN[f.. l]
p := f := l + 1; l := f − 1;
∀i : 1 ≤ i ≤ n : qi := Inii;
else
Lexical error
endif
endif
endwhile
if l < f then Lexical error endif
Jose Miguel Rivero Lexical Analysis – p. 44/46
2.9 Tratamiento de errores léxicos
¿Cuándo se produce un error léxico?
Recordemos que el analizador léxico intentar obtener elprefijo v más largo de la palabra w que está analizando. Eseprefijo tiene que formar parte del lenguaje de alguna de lasexpresiones regulares er1, er2, . . . , ern.
En este proceso se puede llegar a un estado s desde el cualno haya transición definida para el símbolo en curso a. Esto leobligaría a devolver el prefijo anterior más largo que ya habíareconocido.
¿Qué ocurre si todavía no había podido reconocer ningúnprefijo que encajara en alguna expresión regular antes de intentarbuscar otro aún más largo? Pues que la seqüencia que comienzacon el primer carácter de w no forma parte del lenguaje deninguna de las eri: ⇒ se produce un error léxico.
Jose Miguel Rivero Lexical Analysis – p. 45/46
Tratamiento de errores léxicos (cont.)
Hay diferentes formas de tratar estas situaciones de error.Estas son algunas de ellas:
En modo pánico. Se ignora el primer carácter de w (y sucesivos sitambién es necesario) hasta que podamos reconocer algún prefijo enla entrada
Sólo se borran caracteres extraños. Por ejemplo, aquellos que noforman parte del alfabeto del lenguaje: ’¿’, ’ç’, ’@’, . . . en lenguajescomo C o Pascal
Se realizan correcciones: insertar un carácter, reemplazar uncarácter por otro distinto, intercambiar adyacentes (wihle pasa a serwhile ), etc. En general se intenta que el número de correciones seael mínimo necesario. No es una técnica muy frecuente en la práctica
Jose Miguel Rivero Lexical Analysis – p. 46/46