Professional Documents
Culture Documents
AL
DECLARATIVAS
El diagrama anterior muestra que 1ro se esperan tanto las Declaraciones INT como REAL. Esta entrada al ambiente de Declaraciones lo efecta el analizador lxico (AL) automticamente al inicio. Una vez que el AL detecte una cadena diferente a esas palabras reservadas, entra y permanece en el ambiente de Instrucciones. Esa cadena que sale del ambiente de declaraciones es la transicin que culminan en el nodo 12, el cual pertenece al Ambiente de Instrucciones.
Aa
Ll
Spc
l# 00
NO ES: Rr Ii
l#
12 8
9x
10
Ii
Nn
Tt
Spc
l
11
l#
9x
12
; + - * / ^) =
13 TS?
+-
140
#
141
# +21
;
*/^
22 23
( )
24 25
=
26 5 Wasilio Koslow (cualquier error se corregir)
.
15
Ee
+16
18
# #
17
19
+ * / ^ ) ;
20
En el Diagrama anterior:
Nodos 11 y 140 es para el caso hay signo + o antes del 1er dgito, si no hay pasa de Nodo 11 al 141 con el 1er dgito, el 141 sale como entero por delimitadores o es el . (punto decimal) denotando que es un real lo detectado. Nodo 13 de identificadores NO GRABA TOKEN, porque ya estn declaradas. Solo verifica que existen en la TS. Salida del 15 al 16 es cuando se est expresando la potencia 10 elevada a un exponente, ejemplo: E-5 representa 10-5. Salida del 20 es cuando se detectan constantes numricas en el texto. De una vez se guarda el TOKEN si es entero o real. Del nodo 11-21 al 11-26 solo implica que se va a comprobar en la TS que el operador existe Toda constante numrica se hace TOKEN, si resultare que se repite esa constante, ejemplo un cero que inicializa distintas variables, solo se hace TOKEN de la 1ra ocurrencia del cero. En la TS a continuacin, correlativo significa el consecutivo de la variable o constante real o entera a registrar en la TS. La columna TIPO est por definir su existencia. Lexema de un identificador es el identificador en si, para la constante, es el valor analizado y detectado. Observar los delimitadores definidos.
Wasilio Koslow (cualquier error se corregir) 6
INT REAL + * / ^
INT REAL + * / ^
1 2 3 4 5 6 7
---------------
--------
= (
) IDREAL IDENTERO
= (
)
Lo expresado Lo expresado
8 9
10 11 12
------De 0 a N De 0 a N
------
COREAL COENTERO
Lo expresado
Lo expresado
13 14
De 0 a M De 0 a M
---
Se pueden crear varias TS, con el fin de minimizar sus tamaos y hacer as ms fcil sus manejos. La bsqueda en ellas puede ser lineal o alguna forma de indexamiento ordenado indirecto (no es el propsito de la materia).
Sera una TS para las palabras reservadas, separadores y operadores. Una TS para los Identificadores declarados. Una TS para las Constantes numricas.
Wasilio Koslow (cualquier error se corregir) 8
Para ayudar al anlisis sintctico podemos efectuar una validacin sencilla para las instrucciones de asignacin, una vez alcanzado el delimitador punto-y-coma (;) y no haya errores lxicos en la instruccin analizada: VERIFICAR EXISTENCIA LEGAL DEL =. 1. Solo debe haber un =, despus de la 1ra variable declarada en la instruccin. 2. Presencia de ms de 1 (uno) es error. 3. La ausencia del = es error. 4. Presencia del = sin la variable a asignar, es un error. 5. La presencia del = seguida inmediatamente del delimitador es un error. CONTEO DE PARNTESIS Los parntesis deben estar pareados o equilibrados, lo contrario es error. CHEQUEO DE EMPATAMIENTOS ILEGALES DE OPERADORES ARITMTICOS Solo puede haber un operador aritmtico entre variables y/o constantes, dos o ms unidos es error. Un operador seguido del delimitador es error.
Wasilio Koslow (cualquier error se corregir) 9
10
Ejemplo
EJEMPLO LXICO LEGAL REAL a,b; INT d; REAL c; INT e,f; a=b+c; a=(b+c); a=((b+c)/(d-e))^2.33; a=((b+c*d)^(1.8+e*(-4)); EJEMPLO LXICO ILEGAL REAL# a,%b; INT d; REAL c; INT $,e,f; a=_b+&c; a=(b_+c); a=((b+0c)/{d-2e})^2.A33~ a=((b+c*d)^(1,8+e*(-4!));
EJEMPLO SINTCTICO ILEGAL REAL a b; INT d REAL c; INT e;f; a=b+c=d; =a; ==a; =a b*c; a=((b+c); = ; = REAL x a=((b+c)/(d-e))))^2.33; a=((%b+c*+d)/^(1.8+e*(*4));
En el ejemplo SINTCTICO se muestran errores por Ausencia de , y ; en las DECLARACIONES. Desbalanceo de parntesis Apareamiento ilegal de operadores Unarios ilegales (aun cuando el AL los detecta es
importa aclarar que tambin tiene carcter SINTCTICO).
Mal manejo del = Cules son los errores del anlisis lxico?
11
INT REAL + * / ^ = ( )
a b d c e f
1 2 3 4 5 6 7 8 9 10 11 11 12 11 12 12 13 13 14
--------------------1 2 1 3 2 3 1 2 1
---------------
12
ANLISIS SINTCTICO
Una vez terminado positivamente el anlisis lxico de la lnea de programa en evaluacin, se procede a su anlisis sintctico. Para el caso de este trabajo, que trata de 2 tipos de instrucciones: Declaraciones INT y REAL de variables o identificadores simples. Instrucciones de asignacin. El anlisis termina al alcanzar el delimitador punto-y-coma (;). Para el caso de instrucciones condicionales o de ciclos, debe cumplirse el barrido total de la estructura de ellas antes de alcanzar el (;) para efectos del anlisis sintctico. Aun cuando no est previsto en este semestre, se hace saber que consideraciones especiales deben tomarse cuando se declaran mtodos (procedimientos o subprogramas: funciones y subrutinas). Este tipo de instrucciones se incluirn en un futuro prximo.
13
Instruccin de DECLARACIONES
INT
D0
REAL
D1
Id
D2
D3
Este DT establece los estados y sus transiciones vlidas para aceptar sintcticamente las DECLARACIONES de INT o de REAL. La diferencia con el DT lxico es que la variable o variables - Id as como los delimitadores ya han sido validadas y definidas. Aqu se verifica que las Id estn separadas por las - , - o el - ; -
14
Instruccin de Asignacin
++( Id = U+ Id,K
--)
A0
A1
A2
++(
A3
Id,K
A4
A5
OpA ;
A6
A7
Versin 1.0 del DT del anlisis sintctico de la instruccin de Asignacin, no est excluido que puede haber algn error no previsto. Los dobles ++ y en los () significa que se aade 1 o se sustrae 1 a un contador cada vez que ocurren los parntesis, para controlar al final si estn pareados, y generando las siguientes reglas: ()=0 parntesis pareados ()<0 faltan 1+ ( ()>0 faltan 1+ )
Wasilio Koslow (cualquier error se corregir) 15
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken;
16
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema);
17
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema); A2: SegunCasos ELToken EsId,EsConst: Estado=A4; EsUnarioMASMENOS: Estado=3; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado UNARIO+- o Id o Const, se detect: , ElLexema); FinCasos ElToken;
18
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema); A2: SegunCasos ELToken EsId,EsConst: Estado=A4; EsUnarioMASMENOS: Estado=3; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado UNARIO+- o Id o Const, se detect: , ElLexema); FinCasos ElToken; A3:SegunCasos ELToken EsId,EsConst: Estado=A4; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id o Const, se detect: , ElLexema); FinCasos ElToken;
19
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema); A2: SegunCasos ELToken EsId,EsConst: Estado=A4; EsUnarioMASMENOS: Estado=3; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado UNARIO+- o Id o Const, se detect: , ElLexema); FinCasos ElToken; A3:SegunCasos ELToken EsId,EsConst: Estado=A4; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id o Const, se detect: , ElLexema); FinCasos ElToken;
A4:SegunCasos ELToken EsOpA: Estado=A5; EsParDER: Estado=A4; --Parents; EsFIN: Estado=A7; CasoElse: Error(Esperado +-*&^); se detect: , ElLexema); FinCasos ElToken; justo aqu podemos comenzar el anlisis semntico de la instruccin
20
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema); A2: SegunCasos ELToken EsId,EsConst: Estado=A4; EsUnarioMASMENOS: Estado=3; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado UNARIO+- o Id o Const, se detect: , ElLexema); FinCasos ElToken; A3:SegunCasos ELToken EsId,EsConst: Estado=A4; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id o Const, se detect: , ElLexema); FinCasos ElToken;
A4:SegunCasos ELToken EsOpA: Estado=A5; EsParDER: Estado=A4; --Parents; EsFIN: Estado=A7; CasoElse: Error(Esperado +-*&^); se detect: , ElLexema); FinCasos ElToken; A5:SegunCasos ELToken EsId,EsConst: Estado=A6; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id Const ( se detect: , ElLexema); FinCasos ElToken; justo aqu podemos comenzar el anlisis semntico de la instruccin
21
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema); A2: SegunCasos ELToken EsId,EsConst: Estado=A4; EsUnarioMASMENOS: Estado=3; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado UNARIO+- o Id o Const, se detect: , ElLexema); FinCasos ElToken; A3:SegunCasos ELToken EsId,EsConst: Estado=A4; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id o Const, se detect: , ElLexema); FinCasos ElToken;
A4:SegunCasos ELToken EsOpA: Estado=A5; EsParDER: Estado=A4; --Parents; EsFIN: Estado=A7; CasoElse: Error(Esperado +-*&^); se detect: , ElLexema); FinCasos ElToken; A5:SegunCasos ELToken EsId,EsConst: Estado=A6; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id Const ( se detect: , ElLexema); FinCasos ElToken; A6:SegunCasos ELToken EsOpA: Estado=A5; EsParDER: Estado=A6; --Parents; EsFIN: Estado=7; CasoElse: Error(Esperado +-*&^); se detect: , ElLexema); FinCasos ElToken; justo aqu podemos comenzar el anlisis semntico de la instruccin
22
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
justo acaba de terminar el anlisis lxico de la instruccin para entrar al sintctico Parents=0; AnalizarSIntactico=T; EstadoAS=A0; Mientras AnalizarSIntactico TomarToken (ElToken, ElLexema); SegunCasos EstadoAS A0: SegunCasos ELToken EsId: Estado=A1; EsFIN: Error(Instruccin NULA); FinCasos ElToken; A1: Si ElToken=EsAsignacin then Estado=A2 Else Error (Se esperaba = y se detect: ,ElLexema); A2: SegunCasos ELToken EsId,EsConst: Estado=A4; EsUnarioMASMENOS: Estado=3; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado UNARIO+- o Id o Const, se detect: , ElLexema); FinCasos ElToken; A3:SegunCasos ELToken EsId,EsConst: Estado=A4; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id o Const, se detect: , ElLexema); FinCasos ElToken;
A4:SegunCasos ELToken EsOpA: Estado=A5; EsParDER: Estado=A4; --Parents; EsFIN: Estado=A7; CasoElse: Error(Esperado +-*&^); se detect: , ElLexema); FinCasos ElToken; A5:SegunCasos ELToken EsId,EsConst: Estado=A6; EsParIZQ: Estado=A2; ++Parents; CasoElse: Error(Esperado Id Const ( se detect: , ElLexema); FinCasos ElToken; A6:SegunCasos ELToken EsOpA: Estado=A5; EsParDER: Estado=A6; --Parents; EsFIN: Estado=7; CasoElse: Error(Esperado +-*&^); se detect: , ElLexema); FinCasos ElToken; A7: --Puntero ElToken; FinCasos EstadoAS; Fin Mientras AnalizarSIntactico justo aqu podemos comenzar el anlisis semntico de la instruccin
23
++(
Id,K
OpA
Id,K
A0
A1
A2
A3
A4
A5
A6
A7
++(
Id,K OpA
Si, por ejemplo, pas el lxico y estamos analizando sintcticamente a: KGPROD=HORAS * (TASAHORMAQTIPO1 * NUMMAQTIPO1 / PERDTIPO1+TASAHORMAQTIPO2* NUMMAQTIPO2 / PERDTIPO2 + TASAHORMAQTIPO3 * NUMMAQTIPO3 / PERDTIPO3 ) ; Aqu observamos que hay espacios entre operadores y variables (o Ids), los blancos no son errores aun cuando no los hayamos previsto en el AL; pero su presencia sobrecarga el trabajo de retokenear sin lexemizar la instruccin. Podemos trabajar el AS desde cada lexema , que en este ejemplo son extensos; o desde sus TOKEN. Con TOKEN se normaliza el conjunto de datos, en cambio, con los lexemas deberamos manejar adicionalmente las cadenas String, haciendo una sobrecarga de trabajo en al menos la programacin, porque debemos retokenear . 1. Cmo resolvemos que la instruccin bajo anlisis se transforme en una cadena de TOKEN para efectos del anlisis sintctico y tambin se pueda hallar su lexema para efectos de errores?. 2. Tenemos un contador de () en la variable PARENTS y se conoce cuando hay un error de parntesis pero no hay emisin del error En el DT Cmo lo informo, donde lo informo?. 3. Qu maneja y cmo se efecta el anlisis semntico?. 4. Si hubo al menos un error Cmo manejamos la emisin de cada uno y el control general de ellos para efectos de no compilacin final del programa? . 5. Cundo apagamos y activamos la variable ANALIZAR SINTCTICO?
Wasilio Koslow (cualquier error se corregir)
24