1 / 29

Software Básico

Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação. Software Básico. Aula 18: Introdução aos compiladores. Silvio Fernandes 2009.1. Funções básicas.

Download Presentation

Software Básico

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação Software Básico Aula 18: Introdução aos compiladores Silvio Fernandes 2009.1

  2. Funções básicas • Veremos as operações fundamentais necessárias para a compilação de um programa típico escrito numa linguagem de alto nível • Usaremos como exemplo o programa em Pascal a seguir

  3. Funções básicas

  4. Funções básicas • Uma linguagem de alto nível pode ser descrita em termos da gramática • Determina a forma, ou sintaxe, das instruções válidas da linguagem • O problema da compilação será comparar as instruções escritas pelo programador com as estruturas definidas pela gramática, e produzir o código-objeto correspondente a cada instrução

  5. Funções básicas • É conveniente considerar cada instrução do programa-fonte como uma sequência de tokens • A tarefa de análise da instrução original para reconhecimento e classificação dos diversos tokens é conhecida como análise léxica • A parte do compilador que executa esta função costuma ser chamada de scanner

  6. Funções básicas • Depois da análise dos tokens, cada instrução deve ser reconhecida como uma das construções válidas da linguagem (definidas pela gramática) • Esse processo é chamado análise sintática ou parsing, executado pelo parser • O último passo é a geração do código-objeto

  7. Gramáticas • A gramática é uma descrição formal da sintaxe, ou forma, dos programas e instruções individuais escritas nessa linguagem • A gramática não descreve a semântica, ou significado, das várias instruções • Ex: I := J + K e I := X + Y • Onde X e Y são variáveis REAIS e I, J e K são INTEIRAS • As instruções tem a mesma sintaxe mas semântica diferentes • As diferenças entre elas seriam reconhecidas durante a geração de código

  8. Gramáticas • Várias notações podem ser usadas para definir a gramática de uma linguagem • Utilizaremos a notação BNF (Backus-Naur Form) por ser simples e muito utilizada • A seguir é mostrado um conjunto restrito da linguagem Pascal na notação BNF

  9. Gramáticas

  10. Gramáticas • Uma gramática BNF consiste num conjunto de regras, cada uma das quais define a sintaxe de alguma construção (construto) da linguagem • Ex: a regra 13 • <read> ::= READ ( <id-list> ) • Esta é a definição da sintaxe da instrução READ do Pascal, identificada como <read> • O símbolo ::= pode ser lido como “é definido como”

  11. Gramáticas • String delimitados pelos sinais “<“ e “>” são chamados símbolos não terminais (contrutos) • Elementos que não ficam entre < e > são denominados símbolos terminais (ex: tokens) • Símbolos não terminais: <read> e <id-list> • Símbolos terminais: “READ”, “(“ e “)” • Para reconhecer <read> é preciso da definição de <id-list>

  12. Gramáticas • Regra 6 • <id-list> ::= id | <id-list>, id • Essa regra oferece 2 possibilidades separadas por “|” • A 1ª alternativa pode-se restringir ao token id (representa um identificador reconhecido pelo scanner) • A 2ª alternativa é uma <id-list> seguida por “,” seguida por um token id

  13. Gramáticas • Repare que esta regra é recursiva, significando que o construto <id-list> é definido em termos de si mesmo • É conveniente mostrar a análise gramatical de uma instrução sob a forma de uma árvore (árvore sintática) • A seguir a árvore sintática da instrução • READ (VALUE)

  14. Gramáticas

  15. Gramáticas • A regra 9 da gramática define a sintaxe de uma instrução de atribuição • <assign> ::= id := <exp> • <assign> é formado por um id seguido do token :=, seguido de uma expressão <exp> • A regra 10 define uma expressão • <exp> ::= <term> | <exp> + <term> | <exp> - <term>

  16. Gramáticas • Percebe-se que <exp> é definida como uma sequência de termos <term>, conectados pelos operadores + e – • A regra 11 define um termo como qualquer sequência de fatores <factor> ligados por * e DIV • A regra 12 estabelece que um fator pode ser formado por um id ou por um inteiro ou por uma expressão delimitada por parênteses

  17. Gramáticas • Árvore sintática da instrução 14 do programa em Pascal

  18. Gramáticas • Observe que segundo a árvore sintática a multiplicação e a divisão são feitas antes da soma e da subtração • A seguir a árvore sintática de todo o programa-exemplo em Pascal

  19. Gramáticas

  20. Gramáticas

  21. Análise léxica • Corresponde à leitura do programa que será compilado e ao reconhecimento dos tokens que compõem o código-fonte • Os scanners (analisadores léxicos) são projetados para reconhecer palavras-chaves, operadores e identificadores, além de inteiros, números com ponto flutuante, strings de caracteres e etc

  22. Análise léxica • Os identificadores e inteiros costumam ser reconhecidos diretamente como tokens simples • Como alternativa, estes tokens poderiam ser definidos como parte da gramática • <ident> ::= <letter> | <ident> <letter> | <ident> <digit> • <letter> ::= A | B | C | D | ... | Z • <digit> ::= 0 | 1 | 2 | 3 | ... | 9

  23. Análise léxica • O scanner costuma reconhecer tokens com 1 ou mais caracteres • Ex: a string READ seria interpretada como um token simples ou como uma sequência de 4 tokens R, E, A, D • A string := seria reconhecida como um operador simples de atribuição, e não como : seguido de = • A saída do scanner é formada por uma sequência de tokens, geralmente representado por um código de tamanho fixo (ex: inteiro)

  24. Análise léxica

  25. Análise léxica • Essa representação fornece informações suficientes quando o token lido é uma palavra-chave ou um operador • No entanto, para identificadores é necessário um especificador de token que informaria o nome, o valor inteiro do identificador encontrado pelo scanner • Para isso, alguns scanners usam tabelas de símbolos assim como os assemblers

  26. Análise léxica • A fig. a seguir mostra a saída de um scanner para o programa-exemplo em Pascal • Para um token do tipo 22 (identificador), o especificador é um ponteiro que indica um item na tabela de símbolos (^SUM, ^SUMSQ, etc) • Para um token do tipo 23 (inteiro), o especificador é o valor do inteiro (#0, #100, etc)

  27. Análise léxica

  28. Análise léxica • Na maioria das vezes, o scanner (análise léxica) funciona como uma procedure chamada pelo parser (análise sintática) quando precisa de outro token • Cada chamada ao scanner produziria a codificação (se necessário o especificador) para o próximo token do programa-fonte • O parser seria responsável por guardar os tokens dos quais ele necessite para outras análises

  29. Referências • Leland L Beck. “Desenvolvimento de software básico”. 2ª ed. Rio de Janeiro: Campus, 1993. 525p.

More Related