Diferencia entre revisiones de «Usuario:ManuelRomero/preferencias/compiladores/analisisSemático»
De WikiEducator
Línea 89: | Línea 89: | ||
tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;} | tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;} | ||
; | ; | ||
− | *Vamos a crear la produuccion '''resto_variable_compuesta la cual puede o no empeza por rango como veremos | + | *Vamos a crear la produuccion '''resto_variable_compuesta''' la cual puede o no empeza por rango como veremos |
− | *Ademas a la produccion '''resto_variable_compuesta ''' le vamos a asignar un atributo TIPO_VARIABLE_COMPUESTA | + | *Ademas a la produccion '''resto_variable_compuesta''' le vamos a asignar un atributo TIPO_VARIABLE_COMPUESTA |
<source lang=C> | <source lang=C> | ||
typedef enum{ | typedef enum{ | ||
Línea 100: | Línea 100: | ||
#accion | #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''' | *La acción '''{$$=$5;}''' preciamente pasa el valor de dicho atributo de la producción '''' resto_variable_compuesta''' a la producción '''variable_compuesta''' | ||
+ | ====rango==== | ||
+ | *Esta producción va a aportar información que debemos almacenar en la tabla de simbolos, | ||
+ | *El problema que ya conocemos es que hasta que no tengamos el identificador de la variable que va a tener este rango no lo podemos hacer, así que hay que porpagar esto con atributos heredados. | ||
+ | ==PROGRAMA== | ||
+ | *primera producción | ||
+ | *Producción obligatoria | ||
+ | *define de qué consta un programa | ||
+ | programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones | ||
+ | *Acciones a realizar | ||
+ | #Dar de alta el identificador del programa para no volver a usarlo | ||
+ | #Después de la última instrucción eliminamos items de la tabla de símbolos | ||
+ | #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 | ||
+ | |||
+ | <source lang=cpp> | ||
+ | programa: | ||
+ | tPROGRAMA tIDENTIFICADOR ';' | ||
+ | { | ||
+ | nivel = 0; | ||
+ | inicializar_tabla (tabsim); | ||
+ | /*El identificador del programa | ||
+ | Es el primer símbolo y por lo tanto seguro | ||
+ | que no va a exixtir, por lo que no lo buscamos*/ | ||
+ | introducir_programa(tabsim,$2.NId,0); | ||
+ | AbreTag(xmlin,$2.NId,nivel-1); | ||
+ | } | ||
+ | |||
+ | declaracion_variables | ||
+ | declaracion_acciones | ||
+ | bloque_instrucciones | ||
+ | { | ||
+ | eliminar_variables (tabsim, nivel); | ||
+ | eliminar_parametros_ocultos(tabsim,nivel+1); | ||
+ | eliminar_acciones (tabsim, nivel); | ||
+ | eliminar_programa(tabsim); | ||
+ | CierraTag(xmlin,$2.NId,nivel-1); | ||
+ | } | ||
+ | ; | ||
+ | </source> | ||
+ | |||
+ | ==declaracion_variables== | ||
+ | *produccion optativa (puede haber o no variables en un programa) | ||
+ | *''lista de variables'' que puede tener un programa | ||
+ | *Acciones a realizar | ||
+ | #ninguna ya que no tenemos ninún terminal solo producciones | ||
+ | *Produccion para yacc | ||
+ | [[Archivo:declaracionVariables.png]] | ||
+ | Vemos que puede estar vacía (épsidon) o que puede contener '''lista de declaraciones''' seguido del token '''punto y coma''' ''';''' | ||
+ | ;Código en yaac | ||
+ | declaracion_variables: | ||
+ | | lista_declaraciones ';' | ||
+ | ; | ||
+ | |||
+ | ===lista_declaraciones=== | ||
+ | <br><br/> | ||
+ | {{Definicion|'''Una lista''' de elementos uno o varios elementos}} | ||
+ | *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 | ||
+ | #ninguna ya que no tenemos ningún terminal solo producciones | ||
+ | |||
+ | <source lang=cpp> | ||
+ | lista_declaraciones ';' declaracion | ||
+ | | declaracion | ||
+ | ; | ||
+ | </source> | ||
+ | ===declaracion=== | ||
+ | <br><br/> | ||
+ | {{Definicion|'''declaracion de una variable''' es un tipo de variable seguido de una serie de identificadores que representan las variables}} | ||
+ | *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 | ||
+ | #ninguna ya que no tenemos ninún terminal solo producciones | ||
+ | ;Producción | ||
+ | [[imagen:declaracion.png]] | ||
+ | ;codigo en yacc | ||
+ | variable_simple lista_identificadores | ||
+ | |variable_compuesta identificadores_variable_compuesta | ||
+ | ; | ||
+ | |||
+ | ===variable_simple=== | ||
+ | ===identificadores=== | ||
+ | ===variable_compuesta=== | ||
+ | *Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta | ||
+ | #Vector | ||
+ | #Matriz | ||
+ | *Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz) | ||
+ | ;Producción | ||
+ | [[imagen:rango.png]] | ||
+ | ;Acciones | ||
+ | #Comprobaciones | ||
+ | #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 | ||
+ | #Que los dos valores del rango sean del mismo tipo | ||
+ | #Que el valor izquierdo sea estrictamente menor que el derecho | ||
+ | #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 | ||
+ | *Para ello hemos creado los atributos: | ||
+ | ;Código de yacc con las comprobaciones realizadas | ||
+ | |||
+ | ====resto_variable_compuesta==== | ||
===identificadores_variable_compuesta=== | ===identificadores_variable_compuesta=== | ||
Revisión de 13:15 17 ago 2012
PROGRAMA
- primera producción
- Producción obligatoria
- define de qué consta un programa
programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones
- Acciones a realizar
- Dar de alta el identificador del programa para no volver a usarlo
- Después de la última instrucción eliminamos items de la tabla de símbolos
- 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
programa: tPROGRAMA tIDENTIFICADOR ';' { nivel = 0; inicializar_tabla (tabsim); /*El identificador del programa Es el primer símbolo y por lo tanto seguro que no va a exixtir, por lo que no lo buscamos*/ introducir_programa(tabsim,$2.NId,0); AbreTag(xmlin,$2.NId,nivel-1); } declaracion_variables declaracion_acciones bloque_instrucciones { eliminar_variables (tabsim, nivel); eliminar_parametros_ocultos(tabsim,nivel+1); eliminar_acciones (tabsim, nivel); eliminar_programa(tabsim); CierraTag(xmlin,$2.NId,nivel-1); } ;
declaracion_variables
- produccion optativa (puede haber o no variables en un programa)
- lista de variables que puede tener un programa
- Acciones a realizar
- ninguna ya que no tenemos ninún terminal solo producciones
- Produccion para yacc
Vemos que puede estar vacía (épsidon) o que puede contener lista de declaraciones seguido del token punto y coma ;
- Código en yaac
declaracion_variables: | lista_declaraciones ';' ;
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
- ninguna ya que no tenemos ningún terminal solo producciones
lista_declaraciones ';' declaracion | declaracion ;
declaracion
declaracion de una variable es un tipo de variable seguido de una serie de identificadores que representan las variables |
- 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
- ninguna ya que no tenemos ninún terminal solo producciones
- Producción
- codigo en yacc
variable_simple lista_identificadores |variable_compuesta identificadores_variable_compuesta ;
variable_simple
identificadores
variable_compuesta
- Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta
- Vector
- Matriz
- Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz)
- Producción
- codigo en yacc
variable_compuesta: tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;} ;
- Vamos a crear la produuccion resto_variable_compuesta la cual puede o no empeza por rango como veremos
- Ademas a la produccion resto_variable_compuesta le vamos a asignar un atributo TIPO_VARIABLE_COMPUESTA
typedef enum{ VECTOR, MATRIZ };TIPO_VARIABLE_COMPUESTA
- para poder saber si es VECTOR O MATRIZ necesitamos propagar dicho atributo de TIPO_VARIABLE_COMPUESTA, por lo que la proudccuín variable_compuesta también tiene dicho 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
rango
- Esta producción va a aportar información que debemos almacenar en la tabla de simbolos,
- El problema que ya conocemos es que hasta que no tengamos el identificador de la variable que va a tener este rango no lo podemos hacer, así que hay que porpagar esto con atributos heredados.
PROGRAMA
- primera producción
- Producción obligatoria
- define de qué consta un programa
programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones
- Acciones a realizar
- Dar de alta el identificador del programa para no volver a usarlo
- Después de la última instrucción eliminamos items de la tabla de símbolos
- 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
programa: tPROGRAMA tIDENTIFICADOR ';' { nivel = 0; inicializar_tabla (tabsim); /*El identificador del programa Es el primer símbolo y por lo tanto seguro que no va a exixtir, por lo que no lo buscamos*/ introducir_programa(tabsim,$2.NId,0); AbreTag(xmlin,$2.NId,nivel-1); } declaracion_variables declaracion_acciones bloque_instrucciones { eliminar_variables (tabsim, nivel); eliminar_parametros_ocultos(tabsim,nivel+1); eliminar_acciones (tabsim, nivel); eliminar_programa(tabsim); CierraTag(xmlin,$2.NId,nivel-1); } ;
declaracion_variables
- produccion optativa (puede haber o no variables en un programa)
- lista de variables que puede tener un programa
- Acciones a realizar
- ninguna ya que no tenemos ninún terminal solo producciones
- Produccion para yacc
Vemos que puede estar vacía (épsidon) o que puede contener lista de declaraciones seguido del token punto y coma ;
- Código en yaac
declaracion_variables: | lista_declaraciones ';' ;
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
- ninguna ya que no tenemos ningún terminal solo producciones
lista_declaraciones ';' declaracion | declaracion ;
declaracion
declaracion de una variable es un tipo de variable seguido de una serie de identificadores que representan las variables |
- 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
- ninguna ya que no tenemos ninún terminal solo producciones
- Producción
- codigo en yacc
variable_simple lista_identificadores |variable_compuesta identificadores_variable_compuesta ;
variable_simple
identificadores
variable_compuesta
- Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta
- Vector
- Matriz
- Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz)
- Producción
- Acciones
- Comprobaciones
- 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
- Que los dos valores del rango sean del mismo tipo
- Que el valor izquierdo sea estrictamente menor que el derecho
- 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
- Para ello hemos creado los atributos:
- Código de yacc con las comprobaciones realizadas