!"#$%&'(")*+*$),*$)"!
,-'(")*
!
!
,-.)/!./)'*(,&**
$),*$)"!,-'(")!
#$%&'(!)*+,-+! #$%&'(!)*+,-+ #$%&'(!)*+,-+
! ! !
!!!!!! !!!!!! !!!!!!
"!"!"
!
"#$!
"#%&$'()%#!
! !
#$%&'(!)*+,-+ (*(+,-()%#!
.#(,!!)(/01-(2 +./,&%!
!
!
!
!
!
! "
! En el programa principal la inclusión de una librería se declara:
Program X;
{$I archivo}
…
{$I archivo}
declaraciones
funciones
bloque principal
.
archivo principal
! Una librería puede incluir otras:
{$I archivo}
…
{$I archivo}
declaraciones
funciones
librería
! El pre-procesador debe unir todos los archivos en uno solo
2
EJEMPLO:
Supongamos que se realiza una inclusión de archivos de la siguiente manera:
[Link]
[Link] [Link]
[Link] [Link] [Link]
[Link]
Debe hacerse un recorrido en profundidad, esto es, primero se incluyen los hijos de izquierda a
derecha antes de incluir al padre.
El recorrido en profundidad sería:
[Link]
[Link]
[Link] " se repite
[Link]
[Link] " se repite
[Link] " se repite
[Link]
3
Los archivos que se repitan se incluyen una sola vez, por lo que el recorrido quedaría:
[Link]
[Link]
[Link]
[Link]
Lo que significa que la concatenación de los archivos [Link], [Link], [Link], se coloca en [Link]
después de la cabecera del programa, es decir [Link] quedaría:
Program X;
[Link]
[Link]
[Link]
Resto de [Link]
4
Program X; Le indican al
{$I [Link]} pre-procesador que nuevo principal +formato
hay que procesar una Son comentarios para el
{$I [Link]} librería [Link] línea 1 -> Program X; analizador léxico, por lo
que los va a ignorar (no
[Link] línea 2 -> {$I [Link]}
[Link]
forman parte del código
declaraciones X [Link] línea 3 -> {$I [Link]} fuente a analizar)
funciones X [Link] línea 4 ->
begin [Link] línea 1 -> declaraciones C
instrucciones X [Link] línea 1 -> funciones C
end.
[Link] línea 1 -> {$I [Link]}
[Link] línea 2 ->
[Link] línea 3 -> declaraciones B
PRE PROCESADOR
{$I [Link]}
COMPILADOR
[Link] línea 4 -> funciones B
Librería
{$I [Link]}
[Link]
declaraciones A [Link] línea 1 -> {$I [Link]}
funciones A [Link] línea 2 -> {$I [Link]}
[Link] línea 3 ->
[Link] línea 4 -> declaraciones A
[Link] línea 5 -> funciones A
{$I [Link]}
Librería
[Link]
[Link] línea 5 -> declaraciones X
declaraciones B [Link] línea 6 -> funciones X
funciones B [Link] línea 7 ->
[Link] línea 8 -> begin
[Link] línea 9 -> instrucciones X
[Link] línea 10 -> end.
declaraciones C
Librería
funciones C
[Link]
En realidad no forman parte del programa fuente, pero el analizador léxico los necesita para llevar la cuenta
de la línea y del archivo que está analizando, por si sucede un error poder dar la ubicación exacta.
5
DEFINICIÓN DEL LENGUAJE “PASCAL”
GRAFOS DE SINTAXIS
COMPILADORES DEFINICIÓN DE “PASCAL” 1
COMPILADORES DEFINICIÓN DE “PASCAL” 2
COMPILADORES DEFINICIÓN DE “PASCAL” 3
COMPILADORES DEFINICIÓN DE “PASCAL” 4
lista expresiones
expresión
COMA
COMPILADORES DEFINICIÓN DE “PASCAL” 5
COMPILADORES DEFINICIÓN DE “PASCAL” 6
COMPILADORES DEFINICIÓN DE “PASCAL” 7
DEFINICIÓN DEL LENGUAJE
“PASCAL”
! Pascal no es “case sensitive” (no es sensible a mayúsculas y minúsculas).
! La gramática está en notación EBNF (Extended Backus-Naur Form), en la cual:
o Un asterisco * significa cero o más repeticiones.
o Un signo de suma + significa una o más repeticiones.
o Un signo de interrogación ? significa que es opcional la aparición de la frase en
cuestión.
o Una barra | representa alternativas
o Los paréntesis ( ) sirven para agrupar.
o La notación [^ U ] representa el complemento de U
COMPILADORES DEFINICIÓN DE “PASCAL” 1
DEFINICIÓN DE LOS
COMPONENTES LÉXICOS
COMPONENTE PATRÓN DESCRIPCIÓN
LÉXICO
COMENTARIO ( " ( [^ " ] | " + [^ " )] )* " +) Frases entre (* *)
|
{ [^ } ]* } Frases entre { }
ID letra ( letra | dígito | _ )* Delimitar a un máximo de n
caracteres
CONST_ENTERA dígito+ Delimitar a un máximo de m
dígitos
CONST_REAL digito+ ( . dígito+ )? (E (+|-)? digito+)?
CONST_ALFA ‘ [^ ’]* ’ Frases entre apóstrofos ‘ ’
CONST_LOGICA true | false
DIV_ENTERA div
MOD mod
Operadores
aritméticos
MAS +
MENOS -
MULT *
DIV_REAL /
AND and
lógicos
NOT not
Op.
OR or
IGUAL =
DIF <>
relacionales
Operadores
MENOR <
MAYOR >
MEN_IGUAL <=
MAY_IGUAL >=
CORCH_IZQ [
CORCH_DER ]
PAR_IZQ (
puntuación
Símbolos
PAR_DER )
ASIGNACION :=
de
PUNTOYCOMA ;
PUNTO .
DOS_PUNTOS :
COMA ,
COMPILADORES DEFINICIÓN DE “PASCAL” 2
PROGRAM program
VAR var
CONST const
ARRAY array
OF of
INTEGER integer
CHAR char
REAL real
BOOLEAN boolean
FUNCTION function
PROCEDURE procedure
BEGIN begin
END end
IF if
THEN then
reservadas
Palabras
ELSE else
WHILE while
DO do
REPEAT repeat
UNTIL until
FOR for
CASE case
READ Read
READLN ReadLn
WRITE Write
WRITELN WriteLn
BREAK Break
CONTINUE Continue
CLRSCR ClrScr
TO to
DOWNTO downto
COMPILADORES DEFINICIÓN DE “PASCAL” 3
DEFINICIÓN DEL LENGUAJE “PASCAL”
! El lenguaje para el cual se construirá el compilador es un subconjunto de Turbo Pascal 7.0.
! La gramática puede ser mejorada por una versión más reciente de Pascal o Delphi.
! Los terminales están en mayúsculas y negritas
TERMINALES
ID CONST_ENTERA CONST_REAL
CONST_ALFA CONST_LOGICA PROGRAMA
VAR CONST ARRAY
OF INTEGER CHAR
REAL BOOLEAN FUNCTION
PROCEDURE BEGIN END
IF THEN ELSE
WHILE DO REPEAT
UNTIL FOR CASE
READ READLN WRITE
WRITELN BREAK CONTINUE
CLRSCR TO DOWNTO
DIV_ENTERA MOD MAS
MENOS MULT DIV_REAL
AND NOT OR
IGUAL DIF MENOR
MAYOR MEN_IGUAL MAY_IGUAL
CORCH_IZQ CORCH_DER PAR_IZQ
PAR_DER ASIGNACION PUNTOYCOMA
PUNTO DOS_PUNTOS COMA
NO TERMINALES
programa declaración Dvariables
Dconstantes lista_identificadores tipo
tipo_estándar dimensiones índice
subrutina nombre_subrutina argumentos
lista_parámetros bloque lista_instrucciones
instrucción variable lista_variables
asignación llamada_a_subrutina caso
lista_expresiones expresión operador_relacional
expresion_simple signo operador_suma
término operador_mult factor
valor_constante
SÍMBOLO INICIAL
programa
COMPILADORES DEFINICIÓN DE “PASCAL” 1
LENGUAJE EN EBNF
programa " PROGRAMA IDENTIFICADOR PUNTOYCOMA
( declaración )*
bloque
PUNTO
declaración " Dvariables | Dconstantes | subrutina
Dvariables " VAR ( lista_identificadores DOS_PUNTOS tipo PUNTOYCOMA )+
Dconstantes " CONST ( IDENTIFICADOR IGUAL expresión PUNTOYCOMA )+
lista_identificadores " IDENTIFICADOR ( COMA IDENTIFICADOR )*
tipo " tipo_estándar | ARRAY dimensiones OF tipo_estándar
tipo_estándar " INTEGER | CHAR | REAL | BOOLEAN
dimensiones " CORCH_IZQ índice ( COMA índice )* CORCH_DER
índice " CONST_ENTERA | IDENTIFICADOR
subrutina " nombre_subrutina ( declaración )* bloque PUNTOYCOMA
nombre_subrutina "
FUNCTION IDENTIFICADOR argumentos DOS_PUNTOS
tipo_estándar PUNTOYCOMA
| PROCEDURE IDENTIFICADOR argumentos PUNTOYCOMA
argumentos " ( PAR_IZQ lista_parámetros PAR_DER )?
lista_parámetros " lista_identificadores DOS_PUNTOS tipo_estándar
( PUNTOYCOMA lista_identificadores DOS_PUNTOS tipo_estándar )*
bloque " BEGIN lista_instrucciones END
lista_instrucciones " instrucción ( PUNTOYCOMA instrucción )*
instrucción "
IDENTIFICADOR ( asignación | llamada_a_subrutina )
| bloque
| WHILE expresión DO instrucción
| REPEAT lista_instrucciones UNTIL expresión
| FOR variable ASIGNACION expresión (TO | DOWNTO) expresión DO instrucción
| CASE expresión OF
( caso (PUNTOYCOMA caso)* )? (ELSE instrucción)? END
| IF expresión THEN instrucción (ELSE instrucción)?
| READ PAR_IZQ lista_variables PAR_DER
| READLN PAR_IZQ lista_variables PAR_DER
| WRITE PAR_IZQ lista_expresiones PAR_DER
| WRITELN ( PAR_IZQ lista_expresiones PAR_DER )?
| BREAK | CONTINUE | CLRSCR
|#
variable " IDENTIFICADOR (CORCH_IZQ lista_expresiones CORCH_DER )?
lista_variables " variable ( COMA variable ) *
asignación " ( CORCH_IZQ lista_expresiones CORCH_DER )? ASIGNACION expresión
COMPILADORES DEFINICIÓN DE “PASCAL” 2
llamada_a_subrutina " ( PAR_IZQ lista_expresiones PAR_DER )?
caso " valor_constante ( COMA valor_constante )* DOS_PUNTOS instrucción
lista_expresiones " expresión (COMA expresión )*
expresión " expresión_simple (operador_relacional expresión_simple )?
operador_relacional " IGUAL | DIF | MENOR | MAYOR | MEN_IGUAL | MAY_IGUAL
expresion_simple " ( signo )? término ( operador_suma término )*
signo " MAS | MENOS
operador_suma " MAS | MENOS | OR
término " factor ( operador_mult factor )*
operador_mult " MULT | DIV_REAL | DIV_ENTERA | MOD | AND
factor " IDENTIFICADOR
(
PAR_IZQ lista_expresiones PAR_DER |
(CORCH_IZQ lista_expresiones CORCH_DER )?
)
| valor_constante | PAR_IZQ expresion PAR_DER | NOT factor
valor_constante " CONST_ENTERA | CONST_REAL | CONST_ALFA | CONST_LOGICA
COMPILADORES DEFINICIÓN DE “PASCAL” 3