Usuario:ManuelRomero/preferencias/compiladores/analisisSemático

PROGRAMA
programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones
 * primera producción
 * Producción obligatoria
 * define de qué consta un programa
 * Acciones a realizar
 * 1) Dar de alta el identificador del programa para no volver a usarlo
 * 2) Después de la última instrucción eliminamos items de la tabla de símbolos
 * 3) Para crear el XML del programa, cada vez que hay un identificador creo un tag diciendo lo que es y lo cierro al final de su ámbito

declaracion_variables
Vemos que puede estar vacía (épsidon) o que puede contener lista de declaraciones seguido del token punto y coma  ; declaracion_variables: |   lista_declaraciones ';' ;
 * produccion optativa (puede haber o no variables en un programa)
 * lista de variables que puede tener un programa
 * Acciones a realizar
 * 1) ninguna ya que no tenemos ninún terminal solo producciones
 * Produccion para yacc
 * Código en yaac

lista_declaraciones

 * En este caso va a ser una lista de declaraciones: una (declaracion) o varias declaraciones (lista_declaraciones)
 * En yacc siempre usaremos una recursividad por la izquierda (ver producción)
 * Acciones a realizar
 * 1) ninguna ya que no tenemos ningún terminal solo producciones

declaracion
imagen:declaracion.png variable_simple lista_identificadores |variable_compuesta identificadores_variable_compuesta ;
 * Una declaracion puede ser de variables simple o un variables compuesta
 * La forma de daclarar es decir el tipo de variable y luego una lista (1 o mas) de identificadores
 * Acciones a realizar
 * 1) ninguna ya que no tenemos ninún terminal solo producciones
 * Producción
 * codigo en yacc

variable_simple
imagen:variableSimple.png %type variable_simple
 * Producción
 * Atributos
 * Acción
 * Asignar al atributo el valor de tipo de variable
 * Código Yacc

Lista_identificadores

 * Producción
 * Atributos


 * Acción
 * Análisis semántico: Verificar que no existe dicho identificador en la tabla de símbolos a ese nivel
 * Tabla de simbolos: Dar de alta el identificador con el tipo de variable heredado o sintetizado


 * Código Yacc

variable_compuesta
imagen:variableCompuesta.png
 * Producción

ESTRUCTURA_VECTOR vector %type variable_compuesta resto_variable_compuesta variable_compuesta: tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;} ;
 * Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta
 * 1) Vector
 * 2) Matriz
 * Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz)
 * Vamos a crear la produccion resto_variable_compuesta la cual puede o no empeza por rango como veremos
 * Ademas a la produccion resto_variable_compuesta le vamos a asignar el siguiente atributo atributo
 * Atributo
 * Accion
 * La acción {$$=$5;} preciamente pasa el valor de dicho atributo de la producción ' resto_variable_compuesta a la producción variable_compuesta
 * Código en yacc

Resto_variable_compuesta
imagen:RestoVariableCompuesta.png ESTRUCTURA_VECTOR vector %type variable_compuesta resto_variable_compuesta
 * Producción
 * Atributos
 * Vemos los mismos que en 'variable_compuesta'


 * Acción
 * Aqui sabemos si en el 'resto_variable_compuesta' tenemos uno o dos rangos de índices
 * También sabemos cuál es el tipo base de la estructura compuesta
 * Y recogemos el /los rangos y los cargamos en el atributo de la producción
 * No se detectan errores semánticos
 * Código Yacc

rango
imagen:rango.png
 * Producción


 * Esta producción va a aportar información de los valores del rango así como de qué tipo son

RANGO_VECTOR indice; %type rango
 * Atributos
 * Para ello hemos creado el atributo indice de tipo RANGO_VECTOR cuya composición podemos ver:

tipoIndice puede ser ENTERO, CARACTER o BOOLEANO


 * Acciones
 * 1) Comprobaciones
 * 2) Almacenar los valores para poderlos llevar a la tabja de símbolos
 * Comprobaciones
 * Como vemos el rango especifica dos valores
 * Aquí hay que hacer comprobaciones, dando error semántico en caso de no ser respetadas
 * 1) Que los dos valores del rango no sean del mismo tipo es un error sintáctico (no existe esa producción)
 * 2) Que el valor izquierdo sea estrictamente menor que el derecho hay que comprobarlo
 * 3) En caso de haber un sólo valor que sea entero en este caso el límite inferior lo tomaremos como 0 (DUDA A CONSULTAR)
 * tabla de símbolos
 * Necesitamos los valores de límite inferior y superior
 * También necesitamos saber de qué tipo son los índices (ENTERO, BOOLEANO, CARACTER) son los permitidos
 * Código de yacc con las comprobaciones realizadas es el siguiente

cBooleano
imagen:cBooleano.png VALOR_BOOLEANO bool; %type cBooleana
 * Producción
 * Atributos

Asignamos el valor al atributo (ver código yacc)
 * Acción
 * Código Yacc

lista_identificadores_VC
imagen:ListaIdentificadoresVC.png
 * Producción
 * Atributos


 * Acción
 * Analisis semántica: Verificar que el identificador no existe en este nivel en la tabla de símbolos

Código Yacc
 * Tabla de simbolos : Dar de alta dicho identificador con todos los atributos heredados de Vector/Matriz y rangos correspondientes

identificadores_variable_compuesta
imagen:IdentificadoresVariableCompuesta.png
 * Producción