0 évaluation0% ont trouvé ce document utile (0 vote)
270 vues38 pages
1) O documento discute análise semântica no contexto de compiladores, incluindo a função da análise semântica, tipos de análise e representação do conhecimento semântico.
2) A tabela de símbolos é uma estrutura essencial para a análise semântica, permitindo armazenar informações sobre variáveis, procedimentos e outros elementos do programa.
3) O tratamento de escopo é importante para diferenciar variáveis com mesmo nome em escopos diferentes, podendo usar níveis na tabela de sí
1) O documento discute análise semântica no contexto de compiladores, incluindo a função da análise semântica, tipos de análise e representação do conhecimento semântico.
2) A tabela de símbolos é uma estrutura essencial para a análise semântica, permitindo armazenar informações sobre variáveis, procedimentos e outros elementos do programa.
3) O tratamento de escopo é importante para diferenciar variáveis com mesmo nome em escopos diferentes, podendo usar níveis na tabela de sí
Droits d'auteur :
Attribution Non-Commercial (BY-NC)
Formats disponibles
Téléchargez comme PDF, TXT ou lisez en ligne sur Scribd
1) O documento discute análise semântica no contexto de compiladores, incluindo a função da análise semântica, tipos de análise e representação do conhecimento semântico.
2) A tabela de símbolos é uma estrutura essencial para a análise semântica, permitindo armazenar informações sobre variáveis, procedimentos e outros elementos do programa.
3) O tratamento de escopo é importante para diferenciar variáveis com mesmo nome em escopos diferentes, podendo usar níveis na tabela de sí
Droits d'auteur :
Attribution Non-Commercial (BY-NC)
Formats disponibles
Téléchargez comme PDF, TXT ou lisez en ligne sur Scribd
Este material baseado nos materiais de autoria da profa. V. Feltrim
Lstrutura geral de um compilador programa-fonte analisador lxico analisador sinttico analisador semntico gerador de cdigo intermedirio otimizador de cdigo gerador de cdigo programa-alvo Tabela de smbolos Tabela de palavras e smbolos reservados Manipulao de erros dados de entrada sada Analise 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, PROLOG Analise 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 programao Analise semantica Semntica 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 semntica Analise 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 traduo 1abela 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 o o de seus elementos, escopo escopo destes, nmero e tipo dos parmetros parmetros de um procedimento, etc. Cada categoria de token tem atributos/informaes diferentes associadas Cadeia 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 programa 1abela 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 colises 1abela 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 tm 1abela 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 existir Blocos 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 blocos 1abela de smbolos program id corpo . programa inserir(lexema,token=id,cat=nome_prog) program meu_prog ... Insero de elementos na tabela Declarao Cadeia 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" 2 1abela de smbolos var id real declarao de variveis inserir(lexema,token=id,cat=var) a partir de pos2 + 1 Cadeia Token Categoria Tipo Endereo ... meu_prog id nome_prog - - ... x id var integer ... y id var integer ... , : integer pos1 e pos2 =ltima posio alocada na tabela inserir(tipo=real) a partir de pos1+1 at pos2 inserir(tipo=integer) a partir de pos1+1 at pos 2 var x, y: integer pos1 pos Exemplo 1abela de smbolos
procedure id real declarao de procedimentos , : integer id ( ) corpo ; inserir(cadeia,token=id,cat=proc) a partir de pos2 + 1 inserir(cadeia,token=id,cat=par) a partir de pos2 + 1 inserir(tipo=real) a partir de pos1+1 at pos2 inserir(tipo=integer) a partir de pos1+1 at pos2 pos1 e pos2 =ltima posio alocada na tabela Lxemplo de procedimento program id corpo . programa inserir(lexema,token=id,cat=nome_prog) procedimento programa(Seg) Inicio se (token=t_program) ento prox_token(lexema,token) seno ERRO(Seg+{id}); se (token=id) ento inserir(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); fim 1ratamento 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 esttico y nesse ponto tem um escopo local diferente do global 1ratamento de escopo Como diferenciar variveis globais de locais na TS Tratamento de variveis de mesmo nome, mas de escopos diferentes program meu_prog var x, y: integer procedure meu_proc(x: integer) var y: real begin read(y); x:=x+y end; begin read(y); x:=x*y end. y: integer est oculto neste ponto 1abela 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 escopos 1ratamento de escopo rvore de smbolos = uma tabela para cada escopo 1ratamento de escopo program meu_prog var x, y: integer procedure meu_proc(x: integer) var y: real begin read(y); read(a); x:=a+y end; begin read(y); x:=x*y end. global meu_prog nomeProg x var integer y var integer a var integer meu_proc nomeProc meu_proc x param integer y var real 1abela 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 smbolos id fator nmero real nmero inteiro ( expresso ) busca(lexema,token=id,cat=var) 1abela de smbolos comando read write ( ) 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 tipo o tipo "menor". O contrrio: sem problemas! problema na atribuio do tipo "maior" para 1ratamento 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 inteiro 1ratamento 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 principal 1ratamento 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 equivalentes Veriicaao 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 inadequado Lquialncia 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 estruturados Exemplo de uma funo que converte milhas para quilmetros e i Lquialncia de 1ipos typedef 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 1ipos typedef 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); //OK z = soma(x,x); //ERRO! //eq nominal } Equivalncia nominal: duas variveis tm tipos compatveis somente se estiverem na mesma declarao ou em declaraes que usam o mesmo nome de tipo 1ratamento semantico Sistema 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 tipos 1ratamento 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 passagem 1ratamento semantico Exemplo: verificao de tipos na gramtica de atributos <exp> 1 ::= <exp> 2 div id se busca(id)=falso ento ERRO(varivel no declarada) seno se exp 2 .tipo<>inteiro ou busca(id.tipo)<>inteiro ento ERRO(tipos invlidos para a operao) seno exp 1 .tipo=inteiro exp 1 .val= exp 2 .val / id.val div = operador de diviso 1ratamento semantico Exemplo: verificao de tipos em uma regra sinttica de atribuio de tipos iguais procedimento atribuio(Seg) Inicio se (token = t_id) ento prox_token(cadeia,token) se busca(cadeia,token,cat=var)=FALSE ento 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 tipo1<>tipo2 ento ERRO(tipos incompatveis na atribuio); se (token=t_ponto-virgula) ento prox_token(cadeia,token) seno ERRO(Seg+P(comandos)); fim atribuio--> id=<expresso>;