Вы находитесь на странице: 1из 18

!"#$%&'(")*+*$),*$)"!

,-'(")*
!
!
,-.)/!./)'*(,&**
$),*$)"!,-'(")!
#$%&'(!)*+,-+! #$%&'(!)*+,-+ #$%&'(!)*+,-+
! ! !
!!!!!! !!!!!! !!!!!!

"!"!"

!
"#$!
"#%&$'()%#!

! !
#$%&'(!)*+,-+ (*(+,-()%#!
.#(,!!)(/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:

Ppal.pas

A.pas B.pas

B.pas C.pas C.pas

C.pas

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:

C.pas
B.pas
C.pas " se repite
A.pas
C.pas " se repite
B.pas " se repite
Ppal.pas

3
Los archivos que se repitan se incluyen una sola vez, por lo que el recorrido quedaría:

C.pas
B.pas
A.pas
Ppal.pas

Lo que significa que la concatenación de los archivos C.pas, B.pas, A.pas, se coloca en ppal.pas
después de la cabecera del programa, es decir ppal.pas quedaría:

Program X;
C.pas
B.pas
A.pas
Resto de ppal.pas

4
Program X; Le indican al
{$I A.pas} pre-procesador que nuevo principal +formato
hay que procesar una Son comentarios para el
{$I B.pas} librería ppal.pas línea 1 -> Program X; analizador léxico, por lo
que los va a ignorar (no
ppal.pas línea 2 -> {$I A.pas}
Ppal.pas

forman parte del código


declaraciones X ppal.pas línea 3 -> {$I B.pas} fuente a analizar)

funciones X ppal.pas línea 4 ->

begin C.pas línea 1 -> declaraciones C


instrucciones X C.pas línea 1 -> funciones C
end.
B.pas línea 1 -> {$I C.pas}
B.pas línea 2 ->
B.pas línea 3 -> declaraciones B

PRE PROCESADOR
{$I B.pas}

COMPILADOR
B.pas línea 4 -> funciones B
Librería

{$I C.pas}
A.pas

declaraciones A A.pas línea 1 -> {$I B.pas}


funciones A A.pas línea 2 -> {$I C.pas}
A.pas línea 3 ->
A.pas línea 4 -> declaraciones A
A.pas línea 5 -> funciones A
{$I C.pas}
Librería
B.pas

ppal.pas línea 5 -> declaraciones X


declaraciones B ppal.pas línea 6 -> funciones X
funciones B ppal.pas línea 7 ->
ppal.pas línea 8 -> begin
ppal.pas línea 9 -> instrucciones X
ppal.pas línea 10 -> end.
declaraciones C
Librería

funciones C
C.pas

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

Вам также может понравиться