Materiais da sala virtual Livro do Aho ( Compiladores principios, tecnicas e ferramentas, capitulos 1,2 e 3 ) 1) Na compilacao, a anlise consiste em tres fase. Explique como este processo se desenvolver na compilacao: Resp.: A primeira fase da compilacao normalmente a analise lexica, tb conhecida co linear, na qual um fluxo de caracteres contituindo um programa lido da esquerda para a direita e agrupados em tokens. Na segunda fase, analise sintatica ou hierarquica, o tokens so agrupados hierarquicamente em colecoes anhinhadas com significado coletivo. Na terceira e ultima fase da analise da compilacao ocorrem as verificacoes no sentido de assegurar que os componentes de um programa se combinam de forma significativa. Podemos interpretar a resposta acima tambem desta forma: 1 fase analise lexica : identifica os tokes 2 fase analise sintatica: analisa as frase ou gramatica da linguagem 3 fase analise semantica : analise o contexto, um visao mais ampla de abrangente dos comandos e definicoes 2) H diferenca entre analise lexica e analise sintatica ? Resp: esta divisao entre analise lexica e sintatica arbitraria. O determina esta separacao a recursividade da linguagem fonte. As contrucoes lexicas no requerem recursao, enquanto a sintaticas frequentemente a exigem. As gramaticas livres de contexto so uma formalizacao das regras recursivas que podem ser usadas para guiar a analise sintatica
3) A analise de tipo, seja de uma variavel ou de uma constante, em uma expresao
normalmente efetuada em qual fase do compilador ? Explique. Resp: Na fase semantica captura se as informacoes de tipo paa a fase subsequente de geracao de codigo. Utlizamos a estrutura hierarquica determinada na fase sintatica, a fim de identificar os operadores e operandos das expressoes e enunciados, ou seja temos a necessidade de uma visao de contexto para esta analise, funcao de responsabilidade da analise semantica. 4) Tabela de simbolos normalmente utilizada em varias fase do compilador. Fale um pouco a mesma. Resp.: a tabela de simbolos um estrutura de dados contendo um registro para cada identificador, com os campos contendo os atributos do identificador. A estrutura de dados permite, rapidamente, encontrar cada registro, armazenar e/ou recuperar dados do mesmo. O analisador lexico insere os dados na tabela de simbolos, no entanto, os atributos do identificador no podem ser normalmente determinados durante esta fase(analise lexica). As fase seguintes iram colocar mais informacoes sobre os identificadores na tabela de simbolos e em seguida as usam de varias maneiras, por exemplo a analise semantica na fase de analise das expressoes(operandos e operadores).
5) Um compilador no tem por entrada apenas programas fontes mas tambem
entradas produzidas por pr-processadores. Fale sobre a funcao dos prprocessadores. Resp.: os pre-processadores produzem entradas para os compiladores e podem realizar as seguintes funcoes: a) processamento de macros b) incluso de arquivos c) pre-processadores racionais d) extensores de linguagens
6) Escrever um compilador completo nos dias de hoje pode parecer um trabalho
arduo e quase como querer criar a roda, mas no precisa ser assim. Como poderiamos criar um compilador de uma forma mais agil ? Resp: Sim como muitas linguagem j foram criadas ate hoje desde o primeiro compilador Fortran, foram criadas ferramentas de software para ajudar neste processo, tais como: a) geradores de analisadores gramaticais b) geradores de analisadores lexicos c) dispositivos de traducao dirigida pela sintaxe d) geradores automaticos de codigo e) dispositivos de fluxo de dados
7) Um programa pode conter varios tipos de erros, no planejamento do tratamento
dos tipos de erros para melhorar a resposta do compilados identifique os nveis de erros. Resp.: Os erros pode ser: Lexicos, tais como errar a grafia de um identificador, palavra-chave ou operador; Sintaticos, tais como uma expressao aritmetica com parenteses no-balanceados; Semanticos, tais como um operador aplicado a um operador incompativel
8) Identifique os erros na listagem abaixo e aponte o nivel de cada um.
var x, y: char; Function max (i: integer; j: integer) : integer; { return maximum of integers i and j } begin if i > j them max := i; else max = j end; begin readln (x, y); writeln (max (x,y)) end.
var x, y: char; Function max (i: integer; j: integer) : integer; { return maximum of integers i and j } begin if i > j them max := i; else max = j; end; begin readln (x, y); writeln (max (x,y)) end.
Linha (7) erro lexico THEM o correto then
Linha (7) erro sintatico no pode ter ponto-e-virgula pois h else depois Linha (8) erro sintatico na atribuicao faltou dois-ponto (:=) Linha (12) erro semantico passagem de parametro de tipo incompativel