Vous êtes sur la page 1sur 46

Anlisis Semntico

Objetivos

Verificar la semntica de la cadena de entrada:

Verificar que las variables han sido declaradas previamente


Comprobacin de tipos en las expresiones

Comprobacin de los parmetros de una funcin


Eleccin de la funcin u operador en caso de sobrecarga o polimorfismo

Emitir informes de errores semnticos Construir el rbol de Sintaxis Abstracta

Caractersticas del anlisis semntico 1

Principio de la traduccin dirigida por la sintaxis:

El significado (semntica) de una frase est directamente relacionado con su estructura sintctica Se inserta en la especificacin sintctica

Especificacin semntica

Se amplan las gramticas libres de contexto:


Se asocia informacin a los smbolos (atributos) Se asocian acciones semnticas (cdigo) a las producciones

Caractersticas del anlisis semntico 2

rbol de Sintaxis Abstracta


Recoge toda la informacin sintctica y semntica Elimina los smbolos que no aportan significado

Los nodos reflejan los datos asociados a cada smbolo


El objetivo de las acciones semnticas es construir este rbol

Ejemplo

a=b+c;

Gramticas atribuidas

Atributos:

Elementos de los smbolos del lenguaje que almacenan informacin semntica:


Tipo de datos Referencia a las variables Etc.

Reglas semnticas

Expresiones que permiten calcular el valor de los atributos

Gramticas atribuidas

Tipos de atributos:

Atributos sintetizados:
Aquellos cuyo valor se calcula a partir de la informacin de los nodos hijos. Representan un flujo de informacin ascendente en el rbol Ej.: <A> <B> <C> <D> { A.a = B.b + C.c + D.d }

Atributos heredados:

Aquellos cuyo valor se calcula a partir de la informacin del nodo padre o de los hermanos
Representan un flujo de informacin descendente

Ej.: <A> <B> <C> <D> { C.c = A.a + B.b }

Especificacin de un traductor

Existen dos notaciones para disear un traductor:


Definiciones dirigidas por la sintaxis (DDS) Esquemas de traduccin dirigidos por la sintaxis (ETDS)

Definiciones dirigidas por la sintaxis (DDS):

Formalismo de alto nivel

Se asocia una regla semntica a cada regla de produccin No impone un orden en la ejecucin de las reglas semnticas
Son una extensin de las gramticas atribuidas en las que las reglas

Semnticas pueden incluir acciones que no se refieran al clculo de un atributo


Los atributos en juego pueden ser los atributos sintetizados del smbolo de la izquierda o los atributos heredados de los smbolos de la derecha

Gramticas con atributos por la izquierda

Son un subconjunto de las gramticas con atributos

Los atributos heredados se calculan exclusivamente a partir de los smbolos a la izquierda del atributo
Cualquier informacin heredada est disponible en el momento de ejecutar la reglas de produccin correspondiente Los flujos de informacin en el rbol de sintaxis abstracta se producen de izquierda a derecha, de arriba hacia abajo o de abajo hacia arriba. Nunca de derecha a izquierda Permiten definir traductores de una sola pasada

Esquemas de traduccin dirigidos por la sintaxis (ETDS)

Son un formalismo para construir traductores de una sola pasada Emplean gramticas con atributos por la izquierda Incluyen acciones semnticas encerradas entre llaves ( { ... } ) en cualquier punto de las reglas de produccin Las acciones semnticas incluyen fragmentos de cdigo en un lenguaje de programacin

Las acciones semnticas pueden incluir instrucciones que no se refieran al clculo de atributos

Desarrollo de un ETDS basado en anlisis descendente

Los atributos sintetizados de cada smbolo S se almacenan en la estructura de datos (objeto) que devuelve la funcin asociada al smbolo S Los atributos heredados de cada smbolo S se describen como parmetros de la funcin asociada al smbolo S Las acciones semnticas incluidas en las reglas de produccin de un smbolo S se aaden directamente al cdigo de la funcin asociada al smbolo S

Desarrollo de un ETDS basado en anlisis ascendente

A cada estado de la tabla se le puede asociar un smbolo (terminal o no terminal) que corresponde al smbolo que provoca la transicin a ese estado. Los atributos sintetizados de cada smbolo S se almacenan en una estructura de datos (objeto)
Se utiliza una pila de atributos, paralela a la pila de estados, para almacenar estas estructuras

Las acciones semnticas situadas al final de una regla se ejecutan al reducir la regla

Desarrollo de un ETDS basado en anlisis ascendente

Las acciones semnticas situadas en puntos intermedios se sustituyen por smbolos ficticios (marcadores) a los que se asocia una regla de produccin seguida de la accin semntica
Conocida la longitud de una regla, se puede saber la posicin de cada estructura de datos tomando como base la cima de la pila Los atributos heredados de un smbolo no se pueden tratar directamente, sino que se introducen como atributos sintetizados del smbolo anterior

Anlisis semntico en compiladores

La semntica de los lenguajes de programacin de propsito general

El diseo de analizadores semnticos es una herramienta muy til dentro del desarrollo de software:

Para procesar cualquier fichero de datos almacenado en un formato descrito por un lenguaje formal se necesita un analizador semntico.

Ejemplos de formatos descritos por lenguajes formales:


HTML (hipertexto) XML (informacin etiquetada)

ARFF (conjuntos de datos)


XPM (grficos)

TEX (documentos)
...

La semntica de los lenguajes de programacin de propsito general


Para almacenar los diseos de una herramienta CAD Para importar datos de versiones anteriores o de herramientas externas Cualquier transaccin de datos descrita por medio de un lenguaje formal

La semntica de los lenguajes de programacin de propsito general

El diseo de compiladores es el origen de los analizadores semnticos. En un compilador, la entrada a analizar es un fichero escrito en un lenguaje de programacin.

El objetivo del analizador semntico, dentro de la estructura del compilador, es generar el rbol de sintaxis abstracta con toda la informacin del fichero analizado. Las etapas posteriores del compilador convierten esta estructura de datos en una descripcin en cdigo ensamblador.

La semntica de los lenguajes de programacin de propsito general

Los lenguajes de programacin se pueden clasificar de varias formas:

Imperativos / declarativos

De propsito general / de propsito especfico De alto nivel / de bajo nivel


Estructurados / no estructurados Orientados a objetos / orientados a proceso

Fuertemente tipados / dbilmente tipados

La semntica de los lenguajes de programacin de propsito general

Aspectos comunes en los lenguajes de programacin imperativos de propsito general:

Expresiones

Sentencias Estructuras de datos, funciones, objetos.


Sistema de tipos

Expresiones

Caractersticas:

Definen un proceso que permite calcular un valor mediante una sucesin de operaciones bsicas.

Se representan mediante una estructura de rbol.


El tipo de datos que genera es conocido.

Expresiones

Ejemplo de expresiones:

Literales ( 125, 0x4FFF, 2578356L, 3.4, 0.5e-10, A, HOLA MUNDO )


Variables ( x, var, aux125 )

Operaciones unarias ( !x, -x ) Operaciones binarias ( x+y, x&y, x&&y, x>>3)


Operaciones ternarias ( inicio? 0 : 1 ) Llamadas a funciones ( pow( 2.0, 3.5) )

Referencia a un elemento de un array ( x[2], y[0][3][7] )


Referencia al campo de una estructura ( alumno.nombre )

Expresiones Estructura de datos en C

Estructura nica con todos los campos posibles y un cdigo para expresar el tipo de expresin
typedef struct { int code; int integerLiteral; float floatLiteral; Expr* left; Expr* right; ... } Expr;

Expresiones Estructura de datos en C

Unin de varias estructuras, cada una de ellas con los campos necesarios y un cdigo para expresar el tipo de expresin.
typedef struct { int code; int intLiteral; } IntegerLiteral; typedef struct { int code; float floatLiteral; } FloatLiteral;

typedef struct { int code; Expr* left; Expr* right; } BinaryExpr;

typedef union { IntegerLiteral intLiteral; FloatLiteral floatLiteral; BinaryExpr binary; } Expr;

Expresiones Estructura de datos en Java

Clase abstracta que describe una expresin genrica

public abstract class Expr { public abstract Type getType();

Expresiones Estructura de datos en Java

Clases distintas para los distintos tipos de expresiones


public class Binary extends Expr { private int code; private Expr left; private Expr rigth; public Binary(int code, Expr l, Expr r) { ... } public Type getType() { ... } }

public class IntegerLiteral extends Expr {


private int value; public IntegerLiteral(int v) { ... } public Type getType() { return Type.integer; } }

Expresiones Gramticas

Expr LogicExpr { Expr.s = LogicExpr.s }

LogicExpr AndExpr1 { LogicExpr.s = AndExpr1.s }


( OR AndExpr2 { LogicExpr.s = new Binary(OR, LogicExpr.s, AndExpr2.s); } )*

AndExpr NotExpr1 { AndExpr.s = NotExpr1.s }


( AND NotExpr2 { AndExpr.s = new Binary(AND, AndExpr.s, NotExpr2.s); } )* NotExpr NOT CompExpr { NotExpr.s = new Unary(NOT, CompExpr.s); }

| CompExpr { NotExpr.s = CompExpr.s; }

CompExpr AritExpr1 { CompExpr.s = AritExpr1.s; } ( CompOp AritExpr2 { CompExpr.s = new Binary(Comp.s, CompExpr.s, AritExpr2.s); } )? CompOp EQ { CompOp.s = EQ }

| GT { CompOp.s = GT; }
|...

Expresiones Gramticas

AritExpr (MINUS { minus = true; } )? TermExpr1


{ AritExpr.s = minus? new Unary(MINUS, ermExpr1.s) : TermExpr1.s ;} ( AddOp TermExpr2

{ AritExpr.s = new Binary(AddOp.s, AritExpr.s, TermExpr2.s); } )*

AddOp PLUS { AddOp.s = PLUS } | MINUS { AddOp.s = MINUS }

TermExpr FactorExpr1 { TermExpr.s = FactorExpr1.s }


( ProductOp FactorExpr2 { TermExpr.s = new Binary(ProductOp.s, TermExpr.s, FactorExpr2.s); } )* ProductOp PROD { ProductOp.s = PROD; } | DIV { ProductOp.s = DIV; }

| MOD { ProductOp.s = MOD; }

Expresiones Gramticas

FactorExpr LPAREN Expr RPAREN { FactorExpr.s = Expr.s; }


| Literal { FactorExpr.s = Literal.s; } | ID { FactorExpr.s = new VariableExpr(ID.lex); }

| ID LBRACKET Expr RBRACKET


{ Factor.Expr.s = new Element(ID.lex,Expr.s); }

| ID LPAREN { Vector<Expr> v = new Vector<Expr>(); }


( Expr1 {v.add(Expr1.s);} ( COMMA Expr2 {v.add(Expr2.s);} )* )?

RPAREN { FactorExpr.s = new Call(ID.lex,v); }

Expresiones Gramticas

Literal INT_LITERAL { Literal.s = new IntLiteral(INT_LITERAL.lex); }

| LONG_LITERAL { Literal.s = new LongLiteral(LONG_LITERAL.lex); } | FLOAT_LITERAL { Literal.s = new FloatLiteral(FLOAT_LITERAL.lex); }

| DOUBLE_LITERAL { Literal.s = new DoubleLiteral(DOUBLE_LITERAL.lex); }


| CHAR_LITERAL { Literal.s = new CharLiteral(CHAR_LITERAL.lex); } | STRING_LITERAL { Literal.s = new StringLiteral(STRING_LITERAL.lex); }

| TRUE { Literal.s = new BooleanLiteral(true); }


| FALSE { Literal.s = new BooleanLiteral(false); }

| NULL { Literal.s = new NullLiteral(); }

Ejemplo: 2.0 * pow(x,3.0)/(-b + c);

Expresiones

Verificaciones semnticas:

Verificaciones de tipos (p.e. no se pueden sumar expresiones booleanas)

Verificaciones de variables y campos (deben estar declaradas previamente)


Verificaciones de funciones y mtodos (deben existir)

Instrucciones

Describen el flujo de control de las operaciones que se llevan a cabo en una funcin.

Tipos de instrucciones:

Declaraciones Asignaciones

Condicionales: if then else, switch-case Bucles: while, do-while, for


Saltos: break, continue, return, throw Bloques de instrucciones

Tratamiento de errores: try-catch-finally

Instrucciones Estructura de datos en C

Estructura nica con todos los campos posibles y un cdigo para expresar el tipo de instruccin

typedef struct { int code; Expr cond; Statement* next; Statement* body; Statement* elseStm; ... } Statement;

Instrucciones Estructura de datos en C

Unin de varias estructuras, cada una de ellas con los campos necesarios y un cdigo para expresar el tipo de expresin.
typedef struct { int code; Expr cond; Statement* thenStm; Statement* elseStm; } IfStatement;

typedef struct { int code; Expr cond; Statement* body; } WhileStatement;

typedef struct { int code; Variable* left; Expr* right; } AssignStatement;

typedef union { IfStatement ifStm; Whilestatement whileStm; AssignStatement assignStm; } Statement;

Instrucciones Estructura de datos en Java

Clase abstracta que describe una expresin genrica

public abstract class Statement { }

Instrucciones Estructura de datos en Java

Clases distintas para los distintos tipos de expresiones


public class WhileStatement extends Statement { private Expr cond; private Statement body;

public class IfStatement extends Statement { private Expr cond; private Statement thenStm; private Statement elseStm;

public WhileStatement(Expr c, Statement b) { public IfStatement(Expr c, Statement t, ... Statement e) { ... } } } }

Instrucciones

Instrucciones (gramtica)

Instruccion Decl | Asign | IfThen | SwitchCase | While | DoWhile | For | Break | Continue | Return | Bloque

Instrucciones (atributos)

Tabla de smbolos (ToS): es un atributo heredado en todas las instrucciones. Almacena las variables declaradas, los argumentos de las funciones, las variables y constantes globales, etc. Instruccin (inst): es un atributo sintetizado que contiene la estructura de datos asociada a la instruccin reconocida

Instrucciones Declaraciones

Gramtica:

Decl Tipo ID { Var v = Decl.ToS.add(Tipo.t,ID.lexema); Decl.inst = new Block(); } ( EQ Expr { Decl.inst.add( new AssigStm(v,Expr.s) ); } )? ( COMMA ID { v = Decl.ToS.add(Tipo.t,ID.lexema); } ( EQ Expr { Decl.inst.add( new AssigStm(v,Expr.s) ); } )? )* PYC

Instrucciones Declaraciones

Verificaciones semnticas

Hay que evitar variables duplicadas


El tipo de la variable y de la expresin debe ser compatible La declaracin de una variable produce su insercin en la tabla de smbolos

Acciones semnticas

Si se admite la declaracin con asignacin, el atributo inst debe contener la instruccin de asignacin. Si se admite la declaracin de una lista de variables, las asignaciones formarn un bloque de instrucciones.

Instrucciones Asignaciones

Gramtica:
Asign ID { Var v = Asign.ToS.search(ID.lexema); } EQ Expr { Asign.inst. = new AssignStm(v,Expr.s); } PYC

Verificaciones semnticas:

La variable debe existir


El tipo de la variable y de la expresin debe ser compatible

Instrucciones Instruccin IF-THEN-ELSE

Gramtica:
IfThen IF LPAREN Expr RPAREN Instruccin { IfThen.inst = new IfStm(Expr.s,Instruccin.inst); } (ELSE Instruccin { IfThen.inst.setElse(Instruccin.inst); } )?

Verificaciones semnticas

La expresin debe ser booleana

Instrucciones Instruccin SWITCH-CASE

Gramtica:

SwitchCase SWITCH LPAREN Expr RPAREN LBRACE { SwitchCase.inst = new SwitchCaseStm(Expr.s); } ( Case { SwitchCase.inst.addCase(Case.clause); } | Default { SwitchCase.inst.addDefault(Default.clause); } )* RBRACE

Case CASE Valor DOSP { Case.clause = new CaseClause(Valor.v); } ( Instruccion { Case.clause.add( Instruccin.inst ); } )* Default DEFAULT DOSP { Default.clause = new DefaultClause(); }

( Instruccion { Default.clause.add( Instruccin.inst ); } )*

Instrucciones Instruccin SWITCH-CASE

Verificaciones semnticas:

La expresin debe ser entera Los valores de las clusulas CASE no se pueden repetir No puede haber ms de una clusula DEFAULT

Instrucciones Instruccin WHILE

Gramtica:

While WHILE LPAREN Expr RPAREN Instruccin { While.inst = new WhileStm(Expr.s,Instruccin.inst); }

Verificaciones semnticas

La expresin debe ser booleana

Instrucciones Instruccin DO-WHILE

Gramtica:

DoWhile DO Instruccin WHILE LPAREN Expr RPAREN PYC { DoWhile.inst = new DoWhileStm(Expr.s,Instruccin.inst); }

Verificaciones semnticas

La expresin debe ser booleana

Vous aimerez peut-être aussi