analise semantica

Upload: siamf

Post on 09-Jul-2015

186 views

Category:

Documents


0 download

TRANSCRIPT

Analise Semantica Este material baseado nos materiais de autoria da profa. V. FeltrimLstrutura geral de um compiladorprograma-fonteanalisador lxicoanalisador sintticoanalisador semnticogerador de cdigo intermediriootimizador de cdigogerador de cdigoprograma-alvoTabela de smbolosTabela de palavras esmbolos reservadosManipulaode errosdados deentradasadaAnalise semantica Funo: verificao do uso adequado Anlise contextual: declaraes prvias de variveis, procedimentos, etc. Checagem de tipos Outras coisas que vo alm do domnio da sintaxe Sensitividade ao contexto Tipos de anlise semntica Esttica em tempo de compilao: linguagens tipadas, que exigem declaraes C, Pascal, etc. Dinmica em tempo de execuo: linguagens em que as variveis so determinadas pelo contexto de uso LISP, PROLOGAnalise semantica Devido s variaes de especificao semntica das linguagens de programao, a anlise semntica: No to bem formalizada No existe um mtodo ou modelo padro de representao do conhecimento No existe um mapeamento claro da representao para o algoritmo correspondente A anlise artesanal e dependente da linguagem de programaoAnalise semanticaSemntica dirigida pela sintaxe Contedo semntico fortemente relacionado sintaxe do programa Maioria das linguagens de programao modernas Muitas vezes, a semntica de uma linguagem de programao no claramente especificada O projetista do compilador tem que analisar e extrair a semnticaAnalise semantica Em geral, a gramtica de atributos de uma GLC especifica: Comportamento semntico das operaes Checagem de tipos Manipulao de erros Traduo do programa A gramtica de atributos diz quais aes sero realizadas e quando Pode ser uma ao de verificao semntica ou de traduo1abela de smbolos Tabela de smbolos: estrutura essencial para a anlise semntica Permite saber durante a compilao de um programa o tipo tipo e endere endere oo de seus elementos, escopo escopo destes, nmero e tipo dos parmetros parmetros de um procedimento, etc. Cada categoria de token tem atributos/informaes diferentes associadasCadeia Token Categoria Tipo Endereo ...i id var integer 1 ...fat id proc - - ......1abela de smbolos Exemplo de atributos para identificador de varivel Nome da varivel, tipo (inteira, real, etc.), escopo (global, local, etc.), endereo na memria, etc. Para vetores, ainda seriam necessrios atributos como o tamanho do vetor, valor e tipo de seus limites, etc. Exemplo de atributos para identificador de procedimento Nome do procedimento, lista de argumentos (nmero, ordem e tipo), escopo, etc.1abela de smbolos Principais operaes na tabela de smbolos Inserir: armazena na TS informaes fornecidas pelas declaraes no programa Busca: recupera da tabela informaes de um elemento declarado no programa quando esse elemento utilizado Remover: remove (ou torna inacessvel) da tabela informaes sobre um elemento declarado que no se mostra mais necessrio no programa (p.e., fora de escopo)1abela de smbolos A tabela acessada pelo compilador sempre que um elemento mencionado no programa Verificar ou incluir sua declarao Verificar seu tipo, seu escopo ou alguma outra informao Remover um elemento quando este no se faz mais necessrio ao programa1abela de smbolos Questes de projeto Estrutura da tabela de smbolos: determinada pela eficincia das operaes de inserir, verificar e remover Vrias possibilidades Implementao Esttica ou Dinmica (Melhor opo) Estrutura Listas lineares rvores de busca Hashing Opo mais eficiente O identificador a chave e a funo hash indica sua posio na tabela de smbolos Necessidade de tratamento de colises1abela de smbolos Questes de projeto Tamanho da tabela: tipicamente, de algumas centenas a mil campos Dependente da forma de implementao Na implementao dinmica, no necessrio se preocupar com isso Uma nica tabela para todas as declaraes ou vrias tabelas, sendo uma para cada tipo de declarao (constantes, variveis, procedimentos e funes) Diferentes declaraes tm diferentes informaes/atributos por exemplo, variveis no tm nmero de argumentos, enquanto procedimentos tm1abela de smbolos Representao de escopo de identificadores do programa Vrias tabelas ou uma nica tabela com a identificao do escopo para cada identificador Tratamento de escopo Insero de identificadores de mesmo nome, mas em nveis diferentes Remoo/bloqueio de identificadores cujos escopos deixaram de existirBlocos permitem a criao de escopos globais e locais.1abela de smbolos Exemplos de aes realizadas com acesso TS Insero de elementos na tabela Verificar se o elemento j no consta na tabela Busca de informao na tabela Realizada antes da insero Busca de informaes para anlise semntica Remoo de elementos da tabela Tornar inacessveis dados que no so mais necessrios Por ex., aps o escopo ter terminado Linguagens que permitem estruturao em blocos1abela de smbolosprogram id corpo .programainserir(lexema,token=id,cat=nome_prog)program meu_prog ... Insero de elementos na tabela DeclaraoCadeia Token Categoria Tipo Endereo ...meu_prog id nome_prog - - ...A medida que novos elementos vo sendo inseridos pos2 (que indica a ltima posio da tabela) vai sendo "deslocado"21abela de smbolosvar id realdeclaraode variveisinserir(lexema,token=id,cat=var)a partir de pos2 + 1Cadeia Token Categoria Tipo Endereo ...meu_prog id nome_prog - - ...x id var integer ...y id var integer ...,:integerpos1 e pos2 =ltima posioalocada na tabelainserir(tipo=real) a partir de pos1+1 at pos2inserir(tipo=integer) a partir de pos1+1 at pos 2var x, y: integerpos1posExemplo1abela de smbolos

procedure id realdeclarao deprocedimentos,:integerid ( ) corpo;inserir(cadeia,token=id,cat=proc) a partir de pos2 + 1inserir(cadeia,token=id,cat=par) a partir de pos2 + 1inserir(tipo=real) a partir de pos1+1 at pos2inserir(tipo=integer) a partir de pos1+1 at pos2pos1 e pos2 =ltima posioalocada na tabelaLxemplo de procedimentoprogram id corpo .programainserir(lexema,token=id,cat=nome_prog)procedimento programa(Seg)Iniciose (token=t_program) ento prox_token(lexema,token)seno ERRO(Seg+{id});se (token=id) entoinserir(lexema,id,nome_prog)prox_token(lexema,token)seno ERRO(Seg+P(corpo));corpo(Seg+{.});se (token=t_ponto) ento prox_token(lexema,token)seno ERRO(Seg);fim1ratamento de escopo A maioria das linguagens de programao implementa escopo esttico e, para resolver conflito de nomes, aplica a regra do contexto envolvente mais prximo (escopo ancestral mais prximo) Escopo esttico = escopo lxico So criados por subprogramas ou blocos Para vincular uma referncia a uma varivel, deve se encontrar a declarao dessa varivel no escopo atual ou nos seus escopos ancestrais Variveis com o mesmo nome, mas em escopos diferentes, escondem as variveis definidas no pai estticoy nesse ponto tem um escopo local diferente do global1ratamento de escopo Como diferenciar variveis globais de locais na TS Tratamento de variveis de mesmo nome, mas de escopos diferentesprogram meu_progvar x, y: integerprocedure meu_proc(x: integer)var y: realbeginread(y);x:=x+yend;beginread(y);x:=x*yend.y: integer est oculto neste ponto1abela de smbolos Possibilidades para tratamento de escopos Incluso de um campo a mais na tabela de smbolos indicando o nvel da varivel no programa Controle do nvel durante a compilao do programa Quando se chama um procedimento (ou funo), faz-se nvel:=nvel+1 Quando se sai de um procedimento (ou funo), faz-se nvel:=nvel-1 Busca do fim para inicio da TS a fim de encontrar a declarao mais recente Associao das variveis locais a um procedimento (ou funo) entrada relativa ao procedimento (ou funo) por meio, por exemplo, de uma lista encadeada Ateno: para a checagem de tipos, deve-se saber quantos so e quais so os parmetros de um procedimento (ou funo) na tabela de smbolos Tabelas diferentes para diferentes escopos1ratamento de escopo rvore de smbolos =uma tabela para cadaescopo1ratamento de escopoprogram meu_progvar x, y: integerprocedure meu_proc(x: integer)var y: realbeginread(y);read(a);x:=a+yend;beginread(y);x:=x*yend.globalmeu_prog nomeProgx var integery var integera var integermeu_proc nomeProcmeu_procx param integery var real1abela de smbolos Busca de informao Sempre que um identificador do programa utilizado comando e fator Verifica-se se foi declarado, seu tipo, etc.1abela de smbolosidfatornmero realnmero inteiro( expresso )busca(lexema,token=id,cat=var)1abela de smboloscomandoreadwrite( ) id,:= id expresso( ) id;busca(lexema,token=id,cat=var)busca(lexema,token=id,cat=proc)busca(lexema,token=id,cat=par)busca(lexema,token=id,cat=var)1ratamento semantico Verificao do uso adequado dos elementos do programa Declarao de identificadores Erro: identificador no declarado ou declarado duas vezes Compatibilidade de tipos em comandos Checagem de tipos Concordncia entre parmetros formais e atuais, em termos de nmero, ordem e tipoo tipo "menor". O contrrio: sem problemas!problema na atribuio do tipo "maior" para1ratamento semantico Declarao de identificadores Verificado durante a construo da tabela de smbolos Compatibilidade de tipos Atribuio: inteiro:=inteiro, real:=inteiro, string:=cadeia de caracteres Normalmente, tem-se erro quando inteiro:=real Converso implcita (coero) ou explcita dos tipos Comandos de repetio: while booleano do..., if booleano then... Expresses e tipos esperados pelos operadores: inteiro+inteiro, real*real, inteiro+real, inteiro/inteiro, booleano and booleano Erro: inteiro+booleano Arrays: vetor[integer] ndice de um vetor um valor inteiro1ratamento semantico Concordncia entre parmetros formais e atuais, em termos de nmero, ordem e tipo Por exemplo, se declarado: procedure p(var x: integer; var y: real) Erros procedure p(x:integer, y:integer) {erro de tipo} procedure p(y:real, x:integer) {erro de ordem} procedure p(x:integer) {erro de nmero} Tratamento de escopo Erro: varivel local a um procedimento utilizada no programa principal1ratamento semantico Tipos Bsicos (ou primitivos): booleano, char, inteiro, real Estruturados: vetor, registro, ponteiro Regras de compatibilidade de tipos As regras de compatibilidade de tipos so geralmente da forma: se duas expresses so equivalentes,ento retorne um certo tipo, seno erro Precisa-se ter uma definio exata de quando duas expresses so equivalentesVeriicaao de 1ipos Atividade de assegurar que os operandos de um operador possuem tipos compatveis Entenda-se a atribuio como um operador binrio Tipo compatvel: um tipo vlido para ser usado por um dado operador ou um tipo que pode ser convertido implicitamente em um tipo vlido (coero) Coero: converso automtica de tipo Definida no projeto da linguagem e embutida na implementao Um erro de tipo a aplicao de um operador a um operando de tipo inadequadoLquialncia de 1ipos Tipos primitivos: baseada no conceito de incluso Tipos definidos pelo usurio: baseada no conceito de equivalncia Equivalncia estrutural: duas variveis tm tipos compatveis se os seus tipos tiverem estruturas idnticas Equivalncia nominal: duas variveis tm tipos compatveis somente se estiverem na mesma declarao ou em declaraes que usam o mesmo nome de tipo Exemplo: C usa equivalncia estrutural se os tipos forem primitivos e nominal se os tipos forem estruturadosExemplo de uma funo que converte milhas para quilmetroseiLquialncia de 1ipostypedef float km;typedef float mil ;km mile2km (m le m) {return (1.6093 * m);}main() {mile s = 200;km q = mile2km(s);s = mile2km(q); //OK eq estrutural}Lquialncia de 1ipostypedef struct {int a;} tipo1;typedef struct {int a;} tipo2;int soma(tipo1 x, tipo2 y){return (x.a + y.a);}main(){tipo1 x;tipo2 y;x.a = y.a = 1;int z = soma(x,y); //OKz = soma(x,x); //ERRO! //eq nominal}Equivalncia nominal: duas variveis tm tipos compatveissomente se estiverem na mesma declarao ou em declaraesque usam o mesmo nome de tipo1ratamento semanticoSistema de tipos: coleo de regras que atuam sobre os tipos bsicos da linguagem ou os estruturados, definidos ou no pelo usurio Um verificador de tipos implementa um sistema de tipos, utilizando informaes sobre a sintaxe da linguagem, a noo de tipos e as regras de compatibilidade de tipos1ratamento semantico Verificador de tipos Especificado na gramtica de atributos e implementado como tal Especificao do sistema de tipos Compilao em mais de uma passagem, possivelmente Comandado pela anlise sinttica Compilao de uma nica passagem1ratamento semantico Exemplo: verificao de tipos na gramtica de atributos

1::= 2div idse busca(id)=falsoento ERRO(varivel no declarada)seno se exp2.tipointeiro ou busca(id.tipo)inteiroento ERRO(tipos invlidos para a operao)senoexp1.tipo=inteiroexp1.val= exp2.val / id.valdiv = operador de diviso1ratamento semantico Exemplo: verificao de tipos em uma regra sinttica de atribuio de tipos iguaisprocedimento atribuio(Seg)Iniciose (token = t_id)ento prox_token(cadeia,token)se busca(cadeia,token,cat=var)=FALSEento ERRO(varivel no declarada)seno tipo1:=recupera_tipo(cadeia,token,cat=var);seno ERRO(Seg+{t_atrib});se (token = t_atrib)ento prox_token(cadeia,token)seno ERRO(Seg+{id});tipo2 := expressao(Seg+{;});se tipo1tipo2 ento ERRO(tipos incompatveis na atribuio);se (token=t_ponto-virgula)ento prox_token(cadeia,token)seno ERRO(Seg+P(comandos));fimatribuio--> id=;