Skip to content

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:

  1. Toda variable es accesible desde la sección CODE.
  2. 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

SymbolAtribute NameJava TypeSyn/InhDescription
variablevarDefinitionVarDefinitionSynthetizedEnlace a la definición de esta variable

Auxiliary Elements

NameJava TypeDescription
variablesMap<String, VarDefinition>Registro de las definiciones de variables que se han ido encontrando en el árbol

Rules

NodePredicatesFunctions
program → varDefinition* statement*
varDefinition → type name:stringvariables[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:stringvariables[name] ≠ ∅variable.varDefinition = variables[name]
intLiteral:expression → intValue:int
floatLiteral:expression → floatValue:float