Este formalismo se utiliza para especificar la representación
textual de un árbol de sintaxis abstracta. Un programa
PPML
está constituido por reglas de la forma patrón -> formato, en
la que patrón indica los operadores de la sintaxis abstracta
que reconoce una regla y formato describe su diposición en el
formato de un lenguaje de cajas.
Se pueden escribir múltiples pretty printers para un lenguaje, pero uno de ellos tiene especial relevancia: es el llamado std, que debe respetar y reproducir la sintaxis concreta del lenguaje.
A continuación se muestra una regla del código PPML utilizada en la construcción del pretty printer std para Pascal:
plus(*exp1, *exp2) -> [<hv> if prec(*exp1) = 4 then "(" *exp1 ")" else *exp1 end if "+" if prec(*exp2) >= 1 then "(" *exp2 ")" else *exp2 end if];
El patrón de la regla indica que cuando en el árbol aparezca el operador plus con dos descendientes, se deberá formatear de acuerdo con lo indicado en la parte derecha de la regla. Las variables *exp1 y *exp2 son instanciadas con el árbol de los descendientes izquierdo y derecho, respectivamente.
En la parte de formato de la regla, <hv> se utiliza para indicar la concatenación horizontal de los elemntos siguientes hasta el final de la línea. las cajas que no quepan en la línea actual serán pasadas a la siguiente línea comenzando en el margen izquierdo marcado por la caja hv actual. Una caja puede contener terminales, variables y otras cajas.
La utilización del if para comparar prioridades permite determinar si la expresión definida por el operador plus deberá ser mostrada rodeada de paréntesis o no.
Todos los pretty printers para un lenguaje deben ubicarse bajo el directorio $HOME/centaur/tables/lang/pprinters. En el fichero pascal.rdb debe añadirse la siguiente línea:
Centaur.pascal.ppml.Database.UserDefaults: centaur/tables/pascal/pprinters/pprinters.rdb
En el fichero pprinters.rdb se deberá identificar el fichero de recursos para std:
Centaur.pascal.ppml.std.Datrabase.Userdefaults: centaur/tables/pascal/pprinters/std/std.rdb
Para poder construir un módulo para std, debe existir un fichero Buildfile en el directorio std. Este fichero, en el caso del lenguaje Pascal, es el siguiente:
LANGUAGE=pascal LANGDIR=./ ROOTDIR=../../../../../.CENTAUR_SRC/ USERDIR=../../../../../ MODNAME=cenatur/tables/pascal/pprinters/std PPRINTER=std ATFILE= PPMLOPTIONS='module #include ../../../../../.CENTAUR_SRC/centaur/tables/ppml/BuoldppmlLMdonde: