Especificación de la Identificación
Extracción de Requisitos
Los requisitos de esta fase son las reglas de ámbito del lenguaje. Sin embargo, en la descripción del lenguaje no se menciona ninguna regla de este tipo. Por tanto, es de suponer que las reglas de ámbito sean las habituales:
- Toda variable es accesible desde la sección CODE.
- No se puede definir una variable con el mismo nombre que otra previamente definida (independientemente del tipo de ambas).
Es razonable suponer que si hubiera reglas de ámbito excepcionales, estas se hubieran mencionado en la especificación (por ejemplo, que se pudiera cambiar el tipo de una variable volviéndola a definir de nuevo).
Especificación en Gramática Atribuida
Los requisitos semánticos anteriores se expresarán mediante una gramática atribuida. Este metalenguaje es una forma sencilla de expresar:
- Qué información se añade al árbol, en qué nodos y con qué valor (atributos y funciones semánticas).
- Qué condiciones deben cumplir los nodos de un árbol para que este sea válido (predicados).
Concretando para el caso de MLang:
- La información que se añade al árbol es un enlace entre las variables y su definición.
- Las condiciones que debe cumplir el árbol es que no se defina dos veces una variable o que no se use una que no se haya definido (predicados).
Para hacer la gramática atribuida, en vez de comenzar con un documento vacío, se puede utilizar el esqueleto de dicho metalenguaje generado por VGen en vgen.output/skeleton.specifications. Ahí se generó un fichero Attribute Grammar.template.html en el cual ya aparece la estructura de la gramática atribuida.
En el esqueleto generado se puede ver:
- Hay una primera tabla en la que se indicarán los atributos que se añadirán al árbol y en qué nodos.
- En la segunda tabla hay tres columnas:
- En la primera está la gramática abstracta del lenguaje.
- En la segunda segunda y tercera columnas se pondrán los predicados y las funciones semánticas respectivamente.
Ahora sólo quedaría abrir dicho esqueleto html en Word (o editor equivalente), y rellenar las tablas con las especificaciones del lenguaje a compilar.
La gramática atribuida resultado de este proceso se muestra a continuación:
Attributes
Symbol | Atribute Name | Java Type | Syn/Inh | Description |
variable | varDefinition | VarDefinition | Synthetized | Enlace a la definición de esta variable |
Auxiliary Elements
Name | Java Type | Description |
variables | Map<String, VarDefinition> | Registro de las definiciones de variables que se han ido encontrando en el árbol |
Rules
Node | Predicates | Functions |
program → varDefinition* statement* | ||
varDefinition → type name:string | variables[name] == ∅ | variables[name] = varDefinition |
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 | variables[name] ≠ ∅ | variable.varDefinition = variables[name] |
intLiteral:expression → intValue:int | ||
floatLiteral:expression → floatValue:float |