Anda di halaman 1dari 27

ANALIZADOR LXICO

UNIDAD IV
Funcin del Analizador Lxico
Leer los caracteres de entrada y elaborar como salida una secuencia de componentes
lxicos que utiliza el analizador sintctico para hacer el anlisis.
El analizador lxico es la primera fase de un compilador.
Su principal funcin consiste en leer los caracteres de entrada y elaborar como salida
una secuencia de componentes lxicos que utiliza el analizador sintctico para hacer el
anlisis. Esta interaccin, suele aplicarse convirtiendo al analizador lxico en una
subrutina o corrutina del analizador sintctico. Recibida la orden "obtn el siguiente
componente lxico" del analizador sintctico, el analizador lxico lee los caracteres de
entrada hasta que pueda identificar el siguiente componente lxico.
Funciones secundarias.
Como el analizador lxico es .la parte del compilador que lee el texto fuente. Tambin
puede realizar ciertas funciones secundarias en la interfaz del usuario, como eliminar
del programa fuente comentarios y espacios en blanco en forma de caracteres de
espacio en blanco, caracteres TAB y de lnea nueva. Otra funcin es relacionar os
mensajes de error del compilador con el programa fuente. Por ejemplo, el analizador
lxico puede tener localizado el nmero de caracteres de nueva lnea detectados, de
modo que se pueda asociar un nmero de lnea con un mensaje de error.
En algunos compiladores, el analizador lxico se encarga de hacer una copia del
programa fuente en el que estn marcados los mensajes de error. Si el lenguaje fuente
es la base de algunas funciones de pre procesamiento de macros, entonces esas
funciones del preprocesador tambin se pueden aplicar al hacer el anlisis lxico.
Componentes Lxicos, Patrones y Lexemas

Un token es un par que consiste en un nombre de token y un valor de atributo


opcional. El nombre del token es un smbolo abstracto que representa un tipo de
unidad lxica; por ejemplo, una palabra clave especfica o una secuencia de
caracteres de entrada que denotan un identificador. Los nombres de los tokens
son los smbolos de entrada que procesa el analizador sin tctico. A partir de este
momento, en general escribiremos el nombre de un token en negrita. Con
frecuencia nos referiremos a un token por su nombre.

Un patrn es una descripcin de la forma que pueden tomar los lexemas de un


token. En el caso de una palabra clave como token, e l patrn es slo la secuencia
de caracteres que forman la palabra clave. Para los identificadores y algunos otros
tokens, el patrn es una estructura ms compleja que se relaciona mediante
muchas cadenas.
Un lexema es una secuencia de caracteres en el programa fuente, que coinciden
con el patrn para un token y que el analizador lxico identifica como una
instancia de ese token.
Atributos de los Componentes Lxicos
El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos
asociados. Los componentes lxicos influyen en las decisiones del anlisis sintctico y los
atributos en la traduccin de los componentes lxicos:
En la prctica, los componentes lxicos suelen tener un solo atributo -un apuntador a la
entrada de la tabla de smbolos donde se guarda la informacin sobre el componente
lxico; el apuntador se convierte en el atributo del componente lxico. A efectos de
diagnstico, puede considerarse tanto el lexema para un identificador como el nmero de
lnea en el que ste se encontr por primera vez. Estos dos elementos de informacin se
pueden almacenar en la entrada de la tabla de smbolos para el identificador.
Ejemplo 3.1. Los componentes lxicos y los valores de atributos asociados para la
proposicin de FORTRAN.
E = M * e ** 2
Se escriben a continuacin como una secuencia de parejas:
< id, apuntador a la entrada de la tabla de smbolos para E>
< op_asign. >
< id, apuntador a la entrada de la tabla de smbolos para M>
< op-mult,>
< id. apuntador a la entrada de la tabla de si m bolos para e>
< op_exp, >
< nm. valor entero 2 >
Obsrvese que en ciertas parejas no se necesita un valor de atributo: el primer
componente es suficiente para identificar el lexema. En este pequeo ejemplo, se ha
Especificacin de los Componentes Lxicos
Las expresiones regulares son una notacin importante para especificar patrones. Cada
patrn concuerda con una serie de cadenas, de modo que las expresiones regulares
servirn como nombres para conjuntos de cadenas.
Cadenas y lenguajes
El trmino alfabeto o clase de carcter denota cualquier conjunto finito de smbolos.
Ejemplos tpicos de smbolos son las letras y los caracteres. El conjunto {0 , 1} es el
alfabeto binario. Los cdigos ASSCII y EBCDIC son dos ejemplos de alfabetos de
computador.
Una cadena sobre algn alfabeto es una secuencia finita de smbolos tomados de ese
alfabeto. En teora del lenguaje, los trminos frase y palabra a menudo se utilizan como
sinnimos del trmino "cadena". La longitud de una cadena s, que suele escribirse lsl,
es el nmero de apariciones de smbolos en s. Por ejemplo, camino es una cadena de
longitud seis. La cadena vaca, representada por , es una cadena especial de longitud
cero.
El trmino lenguaje se refiere a cualquier conjunto de cadenas de un alfabeto fijo. Esta
definicin es muy amplia, y abarca lenguajes abstractos como , el conjunto vaco, o
{} y el conjunto que slo contiene la cadena vaca, as como al conjunto de todos los
programas de Pascal sintcticamente bien formados y el conjunto de todas las
oraciones en ingls gramaticalmente correctas, aunque los dos ltimos conjuntos son
mucho ms difciles de especificar.

Hay varias operaciones importantes que se pueden aplicar a los lenguajes. Para el
Expresiones Regulares
En Pascal, un identificador es una letra seguida de cero o ms letras o dgitos; es
decir, un identificador es un miembro del conjunto de todas las cadenas de letras y
dgitos que comienzan con una letra.
Con esta notacin, se pueden definir los identificadores de Pascal como
letra ( letra | dgito ) *
La barra vertical aqu significa "o", los parntesis se usan para agrupar sub-
expresiones, el asterisco significa "cero o ms casos de" la expresin entre
parntesis, y la yuxtaposicin de letra con el resto de la expresin significa
concatenacin.
Una expresin regular se construye a partir de expresiones regulares ms simples
utilizando un conjunto de reglas definitorias. Cada expresin regular r representa un
lenguaje L(r). Las reglas de definicin especifican cmo se forma L(r) combinando de
varias maneras los lenguajes representados por las subexpresiones de r.
Las siguientes son las reglas que definen las expresiones regulares del alfabeto .
Asociada a cada regla hay una especificacin del lenguaje representado por la
expresin regular que se est definiendo.
es una expresin regular designada por {}; es decir, el conjunto que contiene la
cadena vaca.
Si a es un smbolo de , entonces a es una expresin regular designada por {a}; por
ejemplo, el conjunto que contiene la cadena a. Aunque se usa la misma notacin
para las tres, tcnicamente, la expresin regular a es distinta de la cadena a o del
smbolo a. El contexto aclarar si se habla de a como expresin regular, cadena o
smbolo.
Se dice que un lenguaje designado por una expresin regular es un conjunto
regular. La especificacin de una expresin regular es un ejemplo de definicin
recursiva. Las reglas 1 y 2 son la base de la definicin; se usa el trmino smbolo
bsico para referirse a o a un smbolo de que aparezcan en una expresin
regular. La regla 3 proporciona el paso inductivo.
Se pueden evitar los parntesis innecesarios en las expresiones regulares si se
adoptan las convenciones:
El operador unario * tiene la mayor precedencia y es asociativo por la izquierda,
La concatenacin tiene la segunda mayor precedencia y es asociativa por la
izquierda,
| tiene la menor precedencia y es asociativo por la izquierda.
Segn estas convenciones, (a)| ((b)*(c)) es equivalente a a|b*c. Estas dos
expresiones designan el conjunto de cadenas que tienen una sola a, o cero o ms b
seguidas de una c.
Definiciones Regulares
Por conveniencia de notacin, puede ser deseable dar nombres a las
expresiones regulares y definir expresiones regulares utilizando dichos
nombres como si fueran smbolos. Si es un alfabeto de smbolos bsicos,
entonces una definicin regular es una secuencia de definiciones de la forma
d1->r1
d2->r2

dn->rn
donde cada d1 es un nombre distinto, y cada r1 es una expresin regular
sobre los smbolos de U {d1, d2, , d1_1}, por ejemplo, los smbolos
bsicos y los nombres previamente definidos. Al limitar cada r1 a los smbolos
de y a los nombres previamente definidos, se puede construir una
expresin regular en para cualquier r1, reemplazando una y otra vez los
nombres de las expresiones regulares por las expresiones que designan. Si r1
utilizara d para alguna j i, entonces ri se podra definir recursivamente y
este proceso de sustitucin no tendra fin.
Para distinguir los nombres de los smbolos, se imprimen en negritas los
nombres de las definiciones regulares.
Reconocimiento de los Componentes Lxicos
En esta seccin, se estudia el reconocimiento de los componentes lxicos y se utiliza
como ejemplo el lenguaje generado por la siguiente gramtica.
prop -> if expr then prop
| if expr then prop else prop
|
expr -> trmino oprel trmino
| trmino
trmino -> id
| nm
donde los terminales if, then, else, oprel, id y nm generan conjuntos de cadenas
dados por las siguientes definiciones regulares:
if -> if
then -> then
else -> else
oprel -> < | <= | = | <> | > | >=
id -> letra ( letra | digito )*
nm-> digito+( . dgito+)? (E( + | - )? dgito+ .. )?
donde letra y dgito se han definido anteriormente.
Para este fragmento de lenguaje, el analizador lxico reconocer las palabras clave if,
then, else, al igual que los lexemas representados por oprel, id y nm. Para simplificar
las cosas, se supone que las palabras clave son reservadas; es decir, no se pueden
usar como identificadores, nm representa los nmeros enteros y reales sin signo de
Pascal.
Adems, se supone que los lexemas estn separados por espacio en blanco, formados
por secuencias no nulas de espacios en blanco, caracteres TAB y caracteres de nueva
lnea. El analizador lxico eliminar los espacios en blanco. Esto lo har comparando
una cadena con la definicin de la expresin regular eb siguiente.
delim -> blanco | tab | lineanueva
eb -> delim+
Si se encuentra una concordancia para eb, el analizador lxico no devuelve un
componente lxico al analizador sintctico, sino que se dispone a encontrar un
componente lxico a continuacin del espacio en blanco y lo devuelve al analizador
El objetivo es construir un analizador lxico que aisl el lexema para el siguiente
sintctico.
componente Lxico del buffer de entrada y que produzca como salida un par
formado por el componente lxico apropiado y el valor de atributo, utilizando la
tabla de traduccin mostrada a continuacin. Los valores de atributo para los
operadores relacionales estn dados por las constantes simblicas MEN, MEI, IGU,
MAY, MAI.
Diagrama de Transiciones
Como paso intermedio en la construccin de un analizador lxico, primero se produce
un diagrama de flujo estilizado, llamado diagrama de transiciones. Los diagramas de
transiciones representan las acciones que tienen lugar cuando el analizador lxico es
llamado por el analizador sintctico para obtener el siguiente componente lxico.
Se utiliza un diagrama de transicin para localizar la informacin sobre los caracteres
que se detectan a medida que el apuntador delantero examina la entrada. Esto se
hace cambiando de posicin en el diagrama segn se leen los caracteres.
Las posiciones en un diagrama de transicin se representan con un crculo y se llaman
estados. Los estados se conectan mediante flechas, llamadas aristas. Las aristas que
salen del estado s tienen etiquetas que indican los caracteres de entrada que pueden
aparecer despus de haber llegado el diagrama de transicin al estado s. La etiqueta
otro se refiere a todo carcter que no haya sido indicado por ninguna de las otras
aristas que salen de s. Un estado se etiqueta como el estado de inicio; es en el estado
inicial del diagrama de transicin donde reside el control cuando se empieza a
reconocer un componente lxico. Ciertos estados pueden tener acciones que se
ejecutan cuando el flujo del control alcanza dicho estado. Al entrar en un estado se lee
el siguiente carcter de entrada. Si hay una arista del estado en curso de ejecucin
cuya etiqueta concuerde con ese carcter de entrada, entonces se va al estado
apuntado por la arista. De otro modo, se indica un fallo.
En la figura se muestra un diagrama de transiciones para los patrones >= y >. El
diagrama de transiciones funciona de la siguiente forma. Su estado de inicio es el
estado 0. En el estado 0 se lee el siguiente carcter de entrada. La arista etiquetada
con >del estado O se debe seguir hasta el estado 6 si este carcter de entrada es >.
De otro modo, significa que no se habr reconocido ni > ni >=.

Al llegar al estado 6 se lee el siguiente carcter de entrada. La arista etiquetada


con = que sale del estado 6 deber seguirse hasta el estado 7 si este carcter de
entrada es un =. De otro modo, la arista etiquetada con otro indica que se deber ir
al estado 8. El circulo doble del estado 7 indica que ste es un estado de
aceptacin, un estado en el cual se ha encontrado el componente lxico >=.
Obsrvese que el carcter > y otro carcter adicional se leen a medida que se
sigue La secuencia de aristas desde el estado inicial al estado de aceptacin 8.
Como el carcter adicional no es parte del operador relacional >, se debe
retroceder un carcter el apuntador delantero. Se usa un * para indicar los estados
En general, puede haber varios diagramas de transiciones, cada uno de los cuales
especifique un grupo de componentes lxicos. Si surge un fallo mientras se est
siguiendo un diagrama de transiciones, se debe retroceder el apuntador delantero
hasta donde estaba en el estado inicial de dicho diagrama, y activar el siguiente
diagrama de transiciones. Dado que los apuntadores de inicio de lexema y los
delanteros marcaban la misma posicin en el estado inicial del diagrama, se
retrocede el apuntador delantero hasta la posicin que marca el apuntador al
inicio de lexema. Si el fallo surge en todos los diagramas de transiciones, es que
se ha detectado un error lxico y se invoca una rutina de recuperacin de errores.
Autmatas Finitos
Un reconocedor de un lenguaje es un programa que toma como entrada una
cadena x y responde "s" si x es una frase del programa, y "no", si no lo es. Se
compila una expresin regular en un reconocedor construyendo un diagrama de
transiciones generalizado llamado autmata finito. Un autmata finito puede ser
determinista o no determinista, donde "no determinista" significa que en un estado
se puede dar el caso de tener ms de una transicin para el mismo smbolo de
entrada.
Tanto los autmatas finitos deterministas como los no deterministas pueden
reconocer con precisin a los conjuntos regulares. Por tanto, ambos pueden
reconocer con precisin lo que denotan las expresiones regulares. Sin embargo,
hay un conflicto entre espacio y tiempo; mientras que un autmata finito
determinista puede dar reconocedores ms rpidos que uno no determinista, un
autmata finito determinista puede ser mucho mayor que un autmata no
determinista equivalente. En la siguiente seccin, se introducen mtodos para
convertir expresiones regulares en ambas clases de autmatas finitos. La
conversin en un autmata no determinista es ms directa, por lo que primero se
estudia este caso.
Autmatas Finitos Deterministas
Un autmata finito determinista (abreviado AFD) es un caso especial de un autmata
finito no determinista en el cual.
Ningn estado tiene una transicin es decir, una transicin con la entrada ,
Para cada estado s y cada smbolo de entrada a, hay a lo sumo un arista
etiquetada a que sale de s.
Un autmata finito tiene a lo sumo una transicin desde cada estado con cualquier
entrada. Si se esta usando una tabla de transiciones para representar la funcin de
transicin de un AFD, entonces cada entrada en la tabla de transiciones es solo un
solo estado. Como consecuencia, es muy fcil determinar si un autmata finito
determinista acepta o no una cadena de entrada, puesto que hay a lo sumo un
camino desde el estado de inicio etiquetado con esa cadena. El siguiente algoritmo
muestra como simular el comportamiento de un AFD con una cadena de entrada.
ENTRADA: Una cadena de entrada x, que se termina con un carcter de fin de archivo
eof. Un AFDD con el estado inicial S0, que acepta estados F, y la funcin de transicin
mover.
SALIDA: Responde s en caso de que D acepte a x no en caso contrario.
MTODO: Aplquese el algoritmo siguiente a la cadena de entrada x. La funcin
mueve: (s, c) da el estado al cual hay una transicin desde el estado S en un carcter
de entrada c. La funcin sigtecar devuelve el siguiente carcter de la cadena de
entrada x.
S: =S0;
C: =sigtecar;
While c eof do
S: = mueve (s,c);
C: =sigtecar;
End:
If s esta en F then
Return si
Else return no;

Ejemplo. En la siguiente figura se ve al grafo de transiciones de un autmata finito


determinista aceptar el mismo lenguaje (a | b)*abb aceptado por el AFN de la figura
Con este AFD y la cadena de entrada ababb. el algoritmo sigue la secuencia de
estados 0, 1, 2, 1, 2, 3 y devuelve "s".
Herramientas para la Especificacin de Analizadores Lxicos
Se han desarrollado algunas herramientas para construir analizadores lxicos a partir
de notaciones de propsito especial basadas en expresiones regulares. Ya se ha
estudiado el uso de expresiones regulares en la especificacin de patrones de
componentes lxicos. Antes de considerar los algoritmos para compilar expresiones
regulares en programas de concordancia de patrones, se da un ejemplo de una
herramienta que pueda ser utilizada por dicho algoritmo.
En esta seccin se describe una herramienta concreta, llamada LEX, muy utilizada en
la especificacin de analizadores lxicos para varios lenguajes. Esa herramienta se
denomina compilador LEX, y la especificacin de su entrada, lenguaje LEX. El estudio
de una herramienta existente permitir mostrar cmo., utilizando expresiones
regulares, se puede combinar la especificacin de patrones con acciones, por
ejemplo, haciendo entradas en una tabla de smbolos, cuya ejecucin se pueda pedir
a un analizador lxico. Se pueden utilizar las especificaciones tipo LEX aunque no se
disponga de un compilador LEX.
Figura 1.Creacin de analizador lxico con LEX

Por lo general, se utiliza el LEX de la forma representada en la figura. Primero, se


prepara una especificacin del analizador lxico creando un programa lex.l en
lenguaje LEX. Despus lex . l se pasa por el compilador LEX para producir el
programa en C lex.yy.c. El programa lex.yy.c consta de una representacin tabular
de un diagrama de transiciones construido a partir de las expresiones regulares de
lex.l. junto con una rutina estndar que utiliza la tabla para reconocer lexemas.
Las acciones asociadas a las expresiones regulares de lex son partes de cdigo en
C y se transfieren directamente a lex.yy.c. Por ltimo, lex.yy.e se ejecuta en el
compilador de C para producir un programa objeto a. out. Que es el analizador
lxico que transforma un archivo de entrada en una secuencia de componentes
lxicos.
EspecificacionesenLEX
Un programa en LEX consta de tres partes:
Declaraciones
%%
Reglas de traduccin
%%
Funciones auxiliares
La seccin de declaraciones incluye declaraciones de variables, constantes manifiestas y
definiciones regulares. (Una constante manifiesta es un identificador que se declara para
representar una constante)
Las definiciones regulares se utilizan como componentes de las expresiones regulares que
aparecen en las reglas de traduccin.
Las reglas de traduccin de un programa en LEX son proposiciones de la forma
P1 {accin1}
P2 {accin2}

Pn {accinn}
Donde pi es una expresin regular y cada accin es un fragmento de programa que
describe cul ha de ser la accin del analizador lxico cuando el patrn p1
concuerda con un lexema. En LEX, las acciones se escriben en C, en general, sin
embargo, pueden estar en cualquier lenguaje de implantacin.
La tercera seccin contiene todos los procedimientos auxiliares que puedan
necesitar las acciones. A veces, estos procedimientos se pueden compilar por
separado y cargar con el analizador lxico.
Un analizador lxico creado por LEX se comporta en sincrona con un analizador
sintctico como sigue. Cuando es activado por el analizador sintctico, el analizador
lxico comienza a leer su entrada restante, un carcter a La vez, hasta que
encuentre el mayor prefijo de la entrada que concuerde con una de las expresiones
regulares p1. Entonces, ejecuta la accin1, Generalmente, accin1 devolver el
control al analizador sintctico. Sin embargo, si no lo hace, el analizador lxico se
dispone a encontrar ms lexemas, basta que una accin hace que el control regrese
al analizador sintctico. La bsqueda repetida de lexemas hasta encontrar una
instruccin return explcita permite al analizador lxico procesar espacios en blanco
y comentarios de manera apropiada.
El analizador lxico devuelve una nica cantidad, el componente lxico, al
analizador sintctico. Para pasar un valor de atributo con la informacin del lexema,
se puede asignar una variable global llamada yylval.
Los analizadores lxicos, para ciertas construcciones de lenguajes de
programacin, necesitan ver adelantadamente ms all del final de un lexema
antes de que puedan determinar un token con certeza. En Lex, se puede escribir
un patrn de la forma r1/r2, donde r1 y r2 son expresiones regulares, que significa
que una cadena se corresponde con r1, pero slo si est seguida por una cadena
que se corresponde con r2. La expresin regular r2, despus del operador
lookahead "/", indica el contexto derecho para una correspondencia; se usa
nicamente para restringir una correspondencia, no para ser parte de la
correspondencia.
Recuperacin de errores lexicogrficos: Los programas pueden contener diversos
tipos de errores, que pueden ser:
Errores lexicogrficos: Que veremos a continuacin.
Errores sintcticos: Por ejemplo, una expresin aritmtica con mayor
numero de parntesis de apertura que de cierre.
Errores semnticos: Por ejemplo, la aplicacin de un operador a un tipo
de datos incompatible con el mismo.
Errores lgicos: Por ejemplo, un bucle sin final.
Cuando se detecta un error, un compilador puede detenerse en ese punto e informar
al usuario, o bien desechar una serie de caracteres del texto fuente y continuar con
el anlisis, dando al final una lista completa de todos los errores detectados. En
ciertas ocasiones es incluso posible que el compilador corrija el error, haciendo una
interpretacin coherente de los caracteres ledos. En estos casos, el compilador
emite una advertencia, indicando la suposicin que ha tomado, y contina el
proceso sin afectar a las sucesivas fases de compilacin.
Los errores lexicogrficos se producen cuando el analizador no es capaz de generar
un token tras leer una determinada secuencia de caracteres. En general, puede
decirse que los errores lexicogrficos son a los lenguajes de programacin lo que las
faltas de ortografa a los lenguajes naturales. Las siguientes situaciones producen
con frecuencia
1. la de
Lectura aparicin de errores
un carcter que nolexicogrficos:
pertenece al vocabulario terminal previsto
para el autmata. Lo ms normal en este caso es que el autmata ignore estos
caracteres extraos y continu el proceso normalmente. Por ejemplo, pueden dar
error en la fase de anlisis lexicogrfico la inclusin de caracteres de control de la
impresora en el programa fuente para facilitar su listado.
2. Omisin de un carcter. Por ejemplo, si se ha escrito ELS en lugar de ELSE.
3. Se ha introducido un nuevo carcter. Por ejemplo, si escribimos ELSSE en
lugar de ELSE.
4. Han sido permutados dos caracteres en el token analizado. Por ejemplo, si
escribiramos ESLE en lugar de ELSE.
5. Un carcter ha sido cambiado. Por ejemplo, si se escribiera ELZE en vez de
ELSE.
Las tcnicas de recuperacin de errores lexicogrficos se basan, en general, en la
obtencin de los distintos sinnimos de una determinada cadena que hemos
detectado como errnea. Por otra parte, el analizador sintctico es capaz en
muchos casos de avisar al analizador lexicogrfico de cul es el token que espera
que ste lea.
Para el ejemplo de borrado de un carcter, tenemos que los sinnimos de ELSE
son ELS, ELE, ESE, y LSE. Por tanto, si incluimos en nuestro analizador una rutina
de recuperacin de errores debidos a omisin de caracteres, cualquiera de estos
sinnimos sera aceptado en lugar del lexema ELSE, se emitira la
correspondiente advertencia, y el proceso continuara asumiendo que se ha ledo
el token <pal_res_ELSE>.
Anlogamente, podemos incluir rutinas para los dems casos. Por ejemplo, si el
analizador lee el lexema ESLE, y no puede construir un token correcto para l
mismo, procedera a generar los sinnimos por intercambio de caracteres (es
decir, SELE, ELSE o ESEL) y comprobara si alguno de ellos es reconocible. En
caso afirmativo, genera el token correspondiente y advierte al usuario del posible
error y de su interpretacin automtica, continuando con el proceso.
Todos los procedimientos para la recuperacin de errores lexicogrficos son en la
prctica mtodos especficos, y muy dependientes del lenguaje que se pretende
compilar.
Material Complementario

Anlisis Lxico
https://www.youtube.com/watch?v=pPrBE_czrVc
https://www.youtube.com/watch?v=idnS9MTwfOU
Autmatas
https://www.youtube.com/watch?v=pfJSqvQFOxI
Autmata Finito Determinista
https://www.youtube.com/watch?v=pk17OhAoAOM
https://www.youtube.com/watch?v=P0AxQvJcN2Q

Anda mungkin juga menyukai