Prof. Alexandre Monteiro

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

Software Básico Silvio Fernandes
Tópicos em Compiladores
Marco Antonio Montebello Júnior
Compiladores Claudio Benossi
Vamos contar D U De 10 até 69 Professor Vaz Nunes 1999 (Ovar-Portugal). Nenhuns direitos reservados, excepto para fins comerciais. Por favor, não coloque.
II – Análise léxica DEI Papel do analisador léxico.
II – Análise léxica DEI lex: linguagem de especificação para analisadores léxicos Implementação de simuladores de autómatos finitos Bibliografia aconselhada:
Compiladores I Cristiano Damiani Vasconcellos
Operadores e Funções do LINGO
Exercício do Tangram Tangram é um quebra-cabeças chinês no qual, usando 7 peças deve-se construir formas geométricas.
Linguagens Formais e Autômatos
Software Básico Silvio Fernandes
Algoritmos e Programação Linguagens de Programação Teoria Aula 5 (05/05) Universidade Federal do Vale do São.
Curso de ADMINISTRAÇÃO
Prof. Heloise Manica Paris Teixeira
EXPRESSÕES ARITMÉTICAS
EXPRESSÕES ARITMÉTICAS
Curso Sistemas de Informação Disciplina: Arquitetura de Software
Construção de Compiladores
André Luis Meneses Silva
Aula 4 Nomes, Vinculações, Tipos e Escopos
Aula 5 Tipos de Dados Universidade do Vale do Rio dos Sinos
Linguagem C Strings.
Listas Encadeadas.
Revisão da Linguagem C.
Classes e objetos Arrays e Sobrecarga
Estrutura de decisão e repetição em JAVA
Paradigmas de programação
Semana 03: Comandos de desvio de fluxo. Expressões lógicas.
Análise Semântica e Representação Intermédia
PROGRAMAÇÃO I UNIDADE 1.
Aula prática - análise contextual
Compiladores, Aula Nº 9 João M. P. Cardoso
Estrutura de dados, pseudocódigo
CADEIA DE CARACTERES (Strings)
Fábio de Oliveira Borges
Semana 03 Comandos de desvio de fluxo. Expressões lógicas.
Teoria e Implementação de Linguagens Computacionais – IF688
Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat
Semântica de Linguagens de Programação
Análise Léxica Primeira fase de um compilador
Projeto de Banco de Dados
Aula 6 - Estruturas de Controle
1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.
Geração de Código Intermediário
1 Aplicações do Fecho Regular. 2 A interseção de uma linguagem livre de contexto e uma linguagem regular é uma linguagem livre de contexto livre de contexto.
Análise Léxica.
Olhe fixamente para a Bruxa Nariguda
Computação Eletrônica
Capítulo II Gramáticas e Linguagens
Máquina de Turing Universal
Analise sintática aula-07-analise-sintática.pdf.
Faculdade Talentos Humanos - FACTHUS - Algoritmo I - Rogério Rodrigues
Análise Sintática LR Prof. Alexandre Monteiro
Analise Semântica aula-10-analise-semântica.pdf.
Analisador Léxico Prof. Alexandre Monteiro
Planilha Eletrônica - Excel
Análise Sintática Prof. Alexandre Monteiro
Análise Léxica Prof. Alexandre Monteiro
Revisão Compiladores – AP2
Revisão Compiladores – AP1
Fundamentos de linguagens de programação
Semântica de Linguagens de Programação
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Programação de Computadores - 1
Sintaxe de uma Linguagem
PLP – JavaCC Java Compiler Compiler
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Transcrição da apresentação:

Análise Léxica: Introdução, Tokens, Expressões Regulares, Tabela de Símbolos Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Contatos Prof. Guilherme Alexandre Monteiro Reinaldo Apelido: Alexandre Cordel E-mail/gtalk: alexandrecordel@gmail.com greinaldo@fbv.edu.br Site: http://www.alexandrecordel.com.br/fbv Celular: (81) 9801-1878

Agenda Características das Linguagens de Alto Nível Tipos de Especificação Especificando a Sintaxe – Tokens Especificando a Sintaxe – Gramática

Introdução Para criar uma linguagem de programação, é necessário Escolher as características desejadas Especificar a linguagem A seguir: Características comuns nas linguagens de hoje Como especificar linguagens

Características das Linguagens de Alto Nível

Relembrando... Da linguagem de máquina às linguagens de alto nível... A tendência hoje é de criar linguagens de nível cada vez mais alto, ou seja, mais intuitivas Mas como fazer isso? Que elementos tornam as linguagens de alto nível?

Características Laços (como o while) Controle de fluxo mais rígido Laços (como o while) Comandos de decisão (como o if-else) Sem comandos “goto” Execução Sequencial Expressões em notações próximas da matemática 2 + (temp * 10) / 3

Características Tipos de dados e verificações de tipo Tipos numéricos (int, Integer, double, float), strings, char, booblean, arrays, registros e tipos abstratos dão ao programador maneiras intuitivas de manipular dados binários da memória Cada tipo oferece operações especializadas Ex: adição (para inteiros) e acesso por índice (para arrays) Com isso, a linguagem pode impedir operações inadequadas Ex: uma variável inteira não pode receber valor float

Características Declarações As declarações preparam um nome (de variável, função/método, classe, etc.) para ser usado Geralmente já identificam o tipo, para facilitar o entendimento Regras de escopo vão indicar em que partes do código o nome (que foi declarado) é válido (variáveis globais ou locais)

Características Desalocação automática de memória Quanto menos o programador precisar se preocupar com a gestão de hardware, como a desalocação de memória, melhor. Em C, as variáveis são desalocadas automaticamente, mas o usuário tem que desalocar manualmente endereços que ele alocar com a função malloc(). Em Java, toda posição de memória é desalocada automaticamente pelo Garbage Collector, gc().

Características Abstração (em geral) Tirar do usuário controle de detalhes irrelevantes (ex: alocação de memória, tamanho do array), para facilitar Separar “o que” deve ser feito de “como” é feito Ex: interfaces em Java Uma boa regra é incorporar características de abstração sempre

Linguagem de Alto Nível Outros elementos podem ser criados, mas os que vimos formam o estado atual da área Pode ser o ponto de partida para criar outras linguagens de alto nível Após escolher o que se deseja em uma linguagem é preciso especificá-la...

Tipos de Especificação

O Que Especificar? Sintaxe Semântica Uma linguagem apresenta duas partes que precisam ser especificadas: Sintaxe Restrições de forma, ordem e escrita; Semântica Restrições contextuais, de sentido lógico.

Sintaxe Diz respeito aos formatos dos programas Restringe quais símbolos podem ser usados em cada situação Exemplos: Um declaração é um tipo seguindo de um nome e valor. Todo comando termina em “;” Todo “(“ precisa ter um “)” correspondente int nota = 0 if ( nota > 7 ) { print(“Aprovado!!!”); } else { print(“Reprovado!!!”); }

Semântica Diz respeito ao significado do programa Especifica qual deve ser o comportamento dele quando for compilado e executado Exemplo para um comando while: Primeiro ele avalia a expressão de teste Se for positiva, executa o comando do corpo do while e volta para a primeira etapa Se for negativa, passa para o próximo comando

Restrições Contextuais Tratam o que não pode ser especificado na sintaxe facilmente, pois depende do contexto Regras de escopo Regras de tipo Também chamada “semântica estática” Vamos considerá-la parte da semântica

Como Especificar? Formalmente – Especificações formais São mais precisas Permitem um entendimento uniforme Informalmente – Textos em linguagem natural Geralmente são muito ambíguas Diferentes leitores podem entender diferentemente

Na Prática Sintaxe Semântica Especificada formalmente Formalismos vistos em Teoria da Computação Semântica Especificações formais são muito pouco usadas Informalmente especificada

Na Disciplina Sintaxe especificada formalmente Seguiremos a prática comum: Sintaxe especificada formalmente Semântica especificada informalmente

Especificando a Sintaxe Geralmente, feita em duas partes Tokens (ligada à 1ª etapa da compilação) Gramática (ligada à 2ª etapa da compilação)

Especificando a Sintaxe Parte 1

Análise Léxica A primeira fase da compilação Recebe os caracteres do programa e os converte em um fluxo de tokens Tokens são unidades lógicas que representam um ou mais caracteres Cada palavra-chave é um token: Ex. begin, then, if, int Cada idetificador é um token: Ex. a, soma, num, var1 Cada constante é um token: Ex. 123, 3.14, 1.2E3 Cada sinal é um token: Ex. >, <, =, >=, +, -, /, (

Análise Léxica Scanning: remove espaços e comentários A análise léxica é, usualmente, invocada pelo parser cada vez que um novo token é necessário É uma fase que processa caracter por caracter. (velocidade) Possui 2 fases: Scanning: remove espaços e comentários Análise Léxica: agrupa os caracteres em tokens

Análise Léxica Lê o fluxo de caracteres do código fonte Como funciona a primeira etapa de um compilador Lê o fluxo de caracteres do código fonte Agrupa-os em sequências significativas Classifica essas sequências

Análise Léxica pos = initial + rate * 60; Exemplo de código fonte Exemplo de saída <ID, “pos”> <EQ> <ID,”initial”> <ADD> <ID,”rate”> <MUL> <NUM_INT,60> <PV>

Adiantando... Lexema: sequência de caracteres com significado interligado Token: classificação dada ao lexema Geralmente retornado junto com o próprio lexema ou outro atributo, como um ponteiro Padrão: é uma descrição da forma que os lexemas de um token podem tomar. Ex. sequência de caracteres que formam palavra-chave como um token.

Exemplos

Especificando Tokens Geralmente são especificados com expressões regulares Cada token é associado a uma expressão regular que representa seus lexemas válidos Padrão que representa várias palavras (dizemos que as palavras “casam” com o padrão)

Especificando Tokens Expressões Regulares Formalismo utilizado para definir o conjunto de aceitação de uma linguagem Principais operadores utilizados pelas ERs Expressão Reconhece ε A cadeia de caractedes vazia “” “str” A string “str” A | B Todas as cadeias reconhecidas por A ou B A . B Cadeias formadas pela concatenação das cadeias reconhecidas por A e B A+ Reconhece cadeias formadas pela concatenação de um número finito de cadeias reconhecidas por A

Especificando Tokens Operadores derivados Expressão Equivale a ( A ) Agrupamento de operadores A* A+ | ε A? A | ε [A-Z] A | B | ... | Y | Z A{N} A . A . A ... } N vezes A{M,N} A . A . A ... } entre M e N vezes AB A . B abc String “abc”

Especificadores Especificam o conjunto de caracteres a casar em uma posição. Um metacaractere é um caractere ou sequência de caracteres com significado especial em expressões regulares. Os metacaracteres podem ser categorizados conforme seu uso.

Quantificadores Definem o número permitido repetições da expressão regular precedente.

Âncoras Estabelecem posições de referência para o casamento do restante da regex. Note que estes metacaracteres não casam com caracteres no texto, mas sim com posições antes, depois ou entre os caracteres.

Agrupamentos Definem ou grupos ou alternativas.

Especificando Tokens Defina expressões para expressar: Exercícios Número IP: Números naturais (e inteiros): Números de telefone (com DDD opcional): Horas: E-mails: URLs: Placa de Carro: CEP:

Especificando Tokens Defina expressões para expressar: Exercícios Número IP: \d{3}.\d{3} .\d{3} .\d{3} Números naturais (e inteiros): \d{n} ou [0-9]{n} Números de telefone (com DDD opcional): \([0-9]{2}\).[0-9]{4}. [0-9]{4} Horas: [012]\d:[0-5]\d E-mails: [a-zA-Z0-9\._-]@[A-Za-z]+\\.[A-Za-z]+ Placa de Carro: [A-Z]{3}-\d{4} CEP: \d{5}-\d{3} ou \d\d\d\d\d URLs: - Com http - (http|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? - Sem http - ([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

Especificando Tokens Testar as definições de ERs anteriores (em Java) Exercícios Testar as definições de ERs anteriores (em Java) Pattern Matcher

Especificando Tokens Definições regulares Exemplo Define nomes para expressões regulares Uma definição pode usar definições anteriores Exemplo letra → [a-zA-Z] dígito → [0-9] letra_ → (letra|_) dois_dígt → [1-9][0-9]? data → dois_dígt/dois_dígt/dois_dígt

Especificando Tokens Tokens são, geralmente, especificados na forma de definições definições regulares

Exemplo Linguagem Expressao1 ABRE_PAR → ( FECHA_PAR → ) ATRIB → = ADD → + MULT → * DEF → def ID → [_a-z][_a-z0-9]* NUM_INT → [0-9][0-9]* PT_VG → ; WHITESPACE → [ \t\n\r]+

Especificando Tokens A maioria das linguagens definem tokens para os seguintes elementos: Tokens para os operadores, em grupo ou separadamente Um só token para todos os identificadores (nomes) Tokens diferentes para cada palavra-chave Tokens diferentes para constantes numéricas de tipos diferentes e para as strings literais (int, double, float e char, String) Tokens para cada símbolo de pontuação (;)

Alguns Tokens Fica a critério do criador da linguagem Exemplo 1 Tokens para operadores podem ser definidos individualmente ou agrupados Fica a critério do criador da linguagem Exemplo 1 Exemplo 2 ADD → + MUL → * DIV → / OP → (+|*|/)

Alguns Tokens Identificadores Nomes que podem ser atribuídos a variáveis, funções, classes, etc. Usa-se um único token para todos os casos

Alguns Tokens Parecem identificadores, mas têm significados especiais Palavras-chave Parecem identificadores, mas têm significados especiais Exemplos de Java: “class”, “int”, “float”, “return” Melhor considerar como tokens diferentes

Tokens Especiais Palavras reservadas São palavras-chaves que não podem ser usadas como identificadores Neste caso, não é permitido usar palavras-chave para dar nome a entidades da linguagem (variáveis, etc.) Considerar todas as palavras-chaves como palavras reservadas é muito comum Facilita a construção do compilador

Tokens Especiais Exemplo de PL/I, onde palavras-chave não são palavras reservadas IF (THEN) THEN THEN = ELSE; ELSE ELSE = THEN;

Tokens Especiais Espaços em branco Caracteres que devem ser ignorados Na verdade, é um “não-token” Exemplo de definição A primeira etapa do compilador simplesmente não retorna token para esse padrão WHITESPACE → [ \t\n\r]+

Especificando a Sintaxe Parte 2

Adiantando... Lê a sequência de tokens Como funciona a segunda etapa de um compilador Lê a sequência de tokens Monta uma organização lógica deles na forma de árvore sintática

Árvore sintática Exemplo de árvore sintática Como definir formalmente essa estrutura? DECLARACAO TIPO ID PTO_VIRG INT CHAR

Especificando Sintaxe Pensar na organização dos tokens em frases Uma declaração é um tipo seguido de um identificador seguido de ponto-e-vírgula Um tipo pode ser os tokens INT ou CHAR “Regras de formação” declaração -> tipo ID ; tipo -> INT tipo -> CHAR

Especificando Sintaxe Notação quando há mais de uma produção para o mesmo conceito: Ou simplificando... expressao -> CTE_INT expressao -> ID expressao -> expressao + expressao expressao -> CTE_INT | ID | expressao + expressao

Especificando Sintaxe São usadas gramáticas livres de contexto, que possuem quatro elementos: Símbolos terminais Símbolos não-terminais Símbolo inicial Produções

Especificando Sintaxe Elementos das gramáticas livres de contexto: Símbolos terminais: Símbolos assumidos como atômicos, indivisíveis Assumiremos os tokens como terminais Símbolos não-terminais: Auxiliares usados para organizar os tokens em “frases”

Especificando Sintaxe Elementos das gramáticas livres de contexto: Símbolo inicial: Não-terminal que será a raiz (topo) da árvore Geralmente é um não-terminal chamado programa Produções: São as regras de formação Definem as “frases” de símbolos válidas

Especificando Sintaxe Diferentes notações para as produções BNF (Backus-Naur Form) EBNF (Extended BNF)

BNF (Backus-Naur Form) Não-terminais entre “<“ e “>” Terminais entre aspas ou sem delimitadores Usa “::=“ ao invés de “→” <bloco> ::= BEGIN <comando-l> END <comando-l> ::= <comando> | <comando> <comando-l> <comando> ::= ...

EBNF (Extended BNF) Existem diversas variações... Numa boa especificação, devem vir anotações sobre quais as extensões assumidas A característica mais comum é que não-terminais aparecem sem delimitador bloco = BEGIN comando* END comando = ...

EBNF (Extended BNF) Outras características típicas Chaves ou “*” significam repetições Colchetes ou “?” significam opcional (zero ou um) Oferecer expressões regulares, permitindo que os tokens sejam especificados como não-terminais Identificador = [a-zA-Z]+ Igual = “=“ Comando = Identificador Igual Expresssao

Exemplo Uma linguagem simples para criar expressões Linguagem Expressao1 Uma linguagem simples para criar expressões Apenas dois comandos: Definir um nome para alguma expressão (constante) Avaliar uma expressão

Exemplo Linguagem Expressao1 <programa> ::= <comando>* <comando> ::= <definicao> ; | <expr> ; <definicao> ::= def ID = <expr> <expr> ::= <expr> + <expr> | <expr> * <expr> | ( <expr> ) | NUM | ID

Exemplo Linguagem Expressao1 (com os tokens explícitos) <programa> ::= <comando>* <comando> ::= <definicao> PT_VG | <expr> PT_VG <definicao> ::= DEF ID EQ <expr> <expr> ::= <expr> ADD <expr> | <expr> MUL <expr> | ABRE_PAR <expr> FECHA_PAR | NUM | ID

Especificando Sintaxe As gramáticas livres de contexto podem representar tudo que expressões regulares representam (e algo mais) Por isso, às vezes, a definição completa da sintaxe da linguagem (incluindo tokens) é feita usando apenas uma gramática em EBNF.

Bibliografia AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princípios, técnicas e ferramentas. Ed. Addison Wesley. 2a Edição, 2008 (Capítulo 2)

Análise Léxica: Introdução, Tokens, Expressões Regulares, Tabela de Símbolos Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife