Академический Документы
Профессиональный Документы
Культура Документы
Documentacin Tcnica
Xpres 0.7
1 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
ahora
usen
2 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
2 INTRODUCCIN
2.1 Descripcin
Xpres es un framework que permite implementar intrpretes y
compiladores para lenguajes tipados e imperativos, usando el entorno de
desarrollo Lazarus y el compilador Free Pascal.
Xpres es tambin el nombre de un lenguaje de muestra que se ha
creado como una demostracin de las capacidades del framework Xpres para
implementar lenguajes compilados.
Xpres es tambin el nombre del proyecto que se cre para desarrollar
el framework y el lenguaje.
El proyecto Xpres, est basado en la librera SynFacilSyn, que es
usada como analizador lxico.
2.2 Caractersticas
Xpres se caracteriza por:
1.
2.
3.
4.
5.
6.
07/07/2016
Xpres 0.7
Documentacin Tcnica
2.3 Arquitectura
Xpres, est organizado por capas. El nivel ms bajo es el analizador
lxico, que est implementado en la unidad XpresBas. Por encima de l
est el analizador sintctico y semntico (Parser) implementado en la unidad
XpresParser.
U n id a d e s d e U s u a r io
C d ig o d e im p le m e n t a c i n d e l c o m p ila d o r o in t r p r e t e p a r a
u n le n g u a je p a r t ic u la r .
U n id a d X p r e s P a r s e r
P a rs e r
U n id a d X p r e s B a s
T P E rro r
T C o m p ile r B a s e
U n id a d X p r e s E le m e n ts
Lexer
U n id a d X p r e s T y p e s
TT ype
El tratamiento
se maneja a travs del objeto TPError,
T e x t o de
F u e nerrores
te
definido tambin en la unidad XpresBas.
La unidad XpresTypes, contiene las definiciones de los objetos TType,
que representan a los tipos de datos del lenguaje. El framework Xpres resalta
el manejo de tipos, por eso se define una unidad especial para las
definiciones referidas a tipo. Esta unidad prcticamente no tiene
dependencias, as que se puede considerar una de las unidades
fundamentales de Xpres.
La unidad XpresElements, incluye las definiciones y los contenedores
para las constantes, variables y funciones.
La implementacin de un intrprete/compilador se debe hacer en una
unidad, o varias unidades adicionales, que incluyan a XpresParser y a
XpresTypes. Una implementacin muy sencilla (como la de los ejemplos
4 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
U n id a d P a r s e r . p a s
C d ig o d e im p le m e n t a c i n d e l
c o m p ila d o r .
A r c h iv o G e n C o d . p a s
G e n e r a d o r d e C d ig o
U n id a d X p r e s P a r s e r
U n id a d
X p r e s E le m e n ts
U n id a d X p r e s B a s
U n id a d X p r e s T y p e s
Los proyectos de los ejemplos usan un archivo adicional, incluido con la directiva $I, pero
en la prctica se trata de una sola unidad.
5 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
6 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
3 ANLISIS LXICO
El analizador lxico (lexer) est contenido en la unidad XpresBas, y
est basado en el resaltador de sintaxis TSynFacilSyn, al cual usa como
analizador lxico para construir la primera capa de accesos al contenido.
Tener al analizador lxico ya desarrollado, es una gran ayuda, porque nos
evita tener que lidiar con el manejo de extraccin de tokens.
3.1 Contextos
Para acceder a un texto cualquiera, se usa el objeto TContext, que usa
un objeto TSynFacilSyn, para acceder al Texto Fuente.
La clase TContext, representa a un objeto Contexto, que vendra a ser
algo as como el medio que usaremos para ir extrayendo los tokens del texto
o archivo fuente. Tambin puede funcionar como el contenedor del texto
fuente, dependiendo de cmo se haya creado.
El siguiente diagrama muestra los niveles del anlisis lxico.
U n id a d X p r e s B a s
U n id a d S y n F a c ilH ig h lig h t e r
T C o n te x t
S y n F a c ilS y n
T e x to F u e n te
Como un contexto trabaja sobre TSynFacilSyn, lo que ve son tokens.
Todo lo que se extrae de un contexto son Tokens. No existe un nivel por
debajo de los token en un Contexto.
Todo contenido a leer, debe ser cargado o asignado un objeto TContext,
para trabajar. La fuente de datos a usar pude ser de tres tipos: Una cadena
de texto, un archivo de texto, o un objeto TStrings.
Para usar un contexto, primero hay que crearlo y usar alguno de los
siguientes mtodos para definir su contenido:
//Fija el contenido del contexto con cadena
procedure SetSource(txt : string);
//Fija contenido a partir de una lista
procedure SetSource(lins: Tstrings; MakeCopy: boolean = false);
//Fija el contenido del contexto con archivo
procedure SetSourceF(file0: string);
7 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
3.2 TContexts
En XpresBas, existe una capa ms de abstraccin, a travs de la clase
TContexts. Esta clase permite administrar varios contextos y cambiar la
posicin de lectura entre ellos, de forma transparente. Pare ello maneja una
lista de contextos de tipo TContext, y siempre mantiene una referencia al
T C o n te x ts
contexto actual.
8 de 30
T C o n te x t
T C o n te x t
T e x to F u e n te
T e x to F u e n te
T C o n te x t
T e x t o F u 07/07/2016
e n te
Xpres 0.7
Documentacin Tcnica
...
cIn.Destroy; //Limpia lista de Contextos
9 de 30
07/07/2016
Xpres 0.7
cIn.Next;
cIn.Next;
...
Documentacin Tcnica
//explora
//explora
cIn.PosAct := posCxt;
10 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
4 FUNCIONALIDADES PRE-DEFINIDAS
Para la implementacin directa de un compilador/intrprete para un
lenguaje determinado, se debe verificar que el lenguaje sea compatible con
el framework. Para ello se deben cumplir ciertos requerimientos y
mantenerse dentro de las limitaciones.
Como siempre suele pasar, es posible romper alguna (o todas) de estas
limitaciones impuestas, pero eso requerir un trabajo considerable, en
modificar las rutinas bsicas del framework.
07/07/2016
Xpres 0.7
Documentacin Tcnica
E x p r e s io n e s
Tokens
E x p r e s io n e s
O p e ra n d o s
12 de 30
D e lim it a d o r e s
d e e x p r e s i n
O p e ra d o re s
Tokens
07/07/2016
Xpres 0.7
Documentacin Tcnica
13 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
14 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
O p e ra n d o s
d e e x p r e s i n
O p e ra d o re s
15 de 30
07/07/2016
Tokens
Xpres 0.7
Documentacin Tcnica
O p e ra n d o
O p e ra d o re s
O p e ra n d o s
D e lim it a d o r
x := x + 1;
Esta nomenclatura, es bastante conocida y usada en muchos lenguajes
de programacin, sin embargo, la forma como Xpres trata a las expresiones,
es un tanto particular2.
Los operadores se deben definir para los tipos de datos que formarn
parte de las expresiones. Es decir, que los operadores, no existen como
elementos independientes (a nivel sintctico) de los operandos.
Cuando se implementa un lenguaje, primero se crean los tipos, y luego
los operadores que se aplican a esos tipos. Nunca se crean los operadores
independientemente de los tipos (excepto a nivel lexico).
Para clarificar la idea, imaginemos que estamos definiendo un lenguaje
y queremos que pueda sumar enteros. Para que Xpres pueda brindarle el
soporte de su maquinaria de expresiones, primero se define el tipo entero:
tipoEntero := CreateType('entero', t_integer, 1);
16 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
1+2
Se evala considerando que para el operador 1, existe una operacin
definida con el smbolo +, que se aplica al operador 2.
Vindolo de esta forma, los operandos se ven como objetos 3 y los
operadores como simple llamadas a mtodos, usando como parmetros a
otros operandos.
17 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
A n a liz a d o r d e
e x p r e s io n e s
L la m a a
m to d o s
s e n c illo s d e
e v a lu a c i n .
O n E x p rE n d ()
e x p r e s i n d e e n tr a d a :
1 + 2se
* 3 ^ 2llama al analizador de expresiones, a travs del
Cada vez que
18 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
cuyo
valor,
est
19 de 30
Ejemplos
3.1415
cadena
x
variable1
x+1
mximo(1,2)
07/07/2016
Xpres 0.7
Documentacin Tcnica
final de la expresin
del analizador
de expresiones,
DESCRIPCIN
EVENTOS LLAMADOS
Constante nica
<byte>.OnLoad()
Variable nica
<byte>.OnLoad()
Suma de constantes
<byte>.proc(const
Suma de constante y <byte>.proc(const
variable.
Precedencia al final
<byte>.proc(const
<byte>.proc(const
+ const)
+ variab.)
* variab.)
+ expres.)
CATEGORA
coConst
coVariab
coExpres*
coExpres
coExpres
20 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
A n a liz a d o r d e
e x p r e s io n e s
E v a lu a c i n d e
o p e r a c io n e s
u n a r ia s
E v a lu a c i n d e
f u n c io n e s
T x O p e r a tio n . p r o c ( )
< N o im p le m e n ta d o >
T fu n c .p ro c ()
e x p r e s i n d e e n t r a d a :
m a x (1 ,2 )+ 2 * 3
21 de 30
Xpres 0.7
22 de 30
Documentacin Tcnica
07/07/2016
Xpres 0.7
Documentacin Tcnica
5 IMPLEMENTACIN DE COMPILADOR/INTRPRETE
5.1 Preparar el espacio de trabajo
Para implementacin de un compilador/intrprete, primero se debe
tener definido el lenguaje (y que debe cumplir con los requerimientos
indicados en la seccin 4.1).
Luego se debe crear la estructura de archivos para el nuevo proyecto o
tomar como base uno de los proyectos de demostracin que se incluye en la
librera Xpres.
Si queremos crear un proyecto desde cero, debemos primero crear un
proyecto en blanco e incluir a los archivos: XpresBas.pas y XpresParser.pas,
Para que estas unidades funciones se debe incluir las libreras:
A r c h iv o G e n C o d .p a s
U n id a d X p r e s P a r s e r . p a s
U n id a d X p r e s B a s .p a s
A r c h iv o s d e la s lib r e r a s
S y n F a c ilU t ils y M is U t ils
07/07/2016
Xpres 0.7
Documentacin Tcnica
2. Definicin de Tipos
3. Definicin de Operadores
4. Definicin de Operaciones
24 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
Una vez definidos los elementos del lenguaje, se tiene que definir los
tipos de datos que manejar el lenguaje. Todos los tipos se crean como
subtipos, de los tipos base.
Los tipos base son:
1. Nmeros Enteros (de hasta 64 bits)
2. Nmeros Enteros sin signo (de hasta 64 bits) No soportado
actualmente
3. Nmeros de coma flotante (de hasta 64 bits)
4. Cadenas
5. Booleanos.
6. Enumerados
Todos los tipos que maneje el lenguaje, deben poder definirse a partir
de estos tipos bsicos, pero no necesariamente deben incluir a todos y en
toda su extensin.
As por ejemplo, podramos simplemente tener un lenguaje con enteros
de hasta 16 bits y sin nmeros en coma flotante (como en una
implementacin para microcontroladores sencillos).
El siguiente cdigo crea un tipo entero de 16 bits, llamado int:
ClearTypes; //para empezar a definir los tipos
tipInt := CreateType('int', t_integer, 2);
//de 2 bytes
07/07/2016
Xpres 0.7
Documentacin Tcnica
26 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
27 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
Esta clase dar lugar a nuestro objeto compilador, que debe ser nico y
que nos servir para realizar todo el procesamiento del texto fuente.
Para implementar correctamente al compilador, es necesario sobreescribir algunos mtodos cruciales, entre ellos:
constructor Create; override;
destructor Destroy; override;
procedure CompileCurBlock; override;
procedure TipDefecString(var Op: TOperand; tokcad: string); override;
28 de 30
07/07/2016
Xpres 0.7
Documentacin Tcnica
E x p r e s io n e s
O p e ra n d o s
D e lim it a d o r e s
d e e x p r e s i n
O p e ra d o re s
Tokens
DESCRIPCIN
Constante.
cualquiera
predefinidos.
CATERGORA DE
OPERANDO
Puede
ser
de coConst
de
los
tipos
07/07/2016
Xpres 0.7
var1
x
(1+x)
x++
log(x)
atan(x+2/3)
30 de 30
Documentacin Tcnica
Variable. Puede ser de cualquiera coVariable
de los tipos predefinidos.
Expresin. Resultado de una coExpres
expresin.
Expresin. Resultado de una coExpres
funcin.
07/07/2016