Especificación
Extracción de Requisitos
El primer paso de esta la especificación, como en todos los demás capítulos, es la extracción de los requisitos propios de la etapa actual de entre todos los de la descripción del lenguaje. Los requisitos extraídos son:
- En la sección
DATA
se realizan las definiciones de variables (no puede haber definiciones en la secciónCODE
). - Las variables solo pueden ser de tipo
int
tipofloat
. Las variables de tipo entero ocupan 2 bytes y las reales 4.
El primer requisito supone que no habrá variables locales y, por tanto, todas las direcciones son absolutas (no habrá direccionamiento relativo).
Especificación en gramática atribuida
En esta fase se necesita añadir más información al árbol, en concreto, la dirección de cada variable. Por tanto, se utilizarán de nuevo una gramática atribuida, ya que permiten indicar qué información se va a añadir en forma de atributos (las direcciones) y cómo obtienen estos su valor mediante reglas semánticas.
A continuación, se incluye la gramática abstracta finalizada que formaliza los requisitos anteriores:
Attributes
Symbol | Atribute Name | Java Type | Syn/Inh | Description |
varDefinition | address | int | Inherited | Variable address |
Auxiliary Functions
Name | Description |
size(type) | Type size in bytes |
Rules
Node | Predicates | Functions |
program → varDefinition* statement* | varDefinitioni.address = ∑size(varDefinitionj.type) | 0 ≤ j < i | |
varDefinition → type name:string | ||
intType:type → ε | ||
floatType:type → ε | ||
print:statement → expression | ||
assignment:statement → left:expression right:expression | ||
arithmetic:expression → left:expression operator:string right:expression | ||
variable:expression → name:string | ||
intLiteral:expression → intValue:int | ||
floatLiteral:expression → floatValue:float |
La regla semántica en program
simplemente indica que la dirección de una variable es la suma de los tamaños de todas las variables definidas antes que ella.
Nótese que el atributo address se ha definido como heredado, ya que dicho atributo se asigna a las varDefinition desde su nodo padre program.
Por último, nótese que no se ha definido ningún predicado en la gramática (segunda columna de la tabla). Esto es lógico ya que con el semántico acabaron las fases de análisis y, por tanto, ya no hay errores que detectar. Simplemente se usa la parte de las gramáticas atribuidas que nos permite añadir más información al árbol (atributos y funciones semánticas).