·

Ciência da Computação ·

Compiladores

Send your question to AI and receive an answer instantly

Ask Question

Preview text

Ciência da Computação Compiladores Unidade 02 Análise Léxica Introdução O compilador traduz o programa de uma linguagem fonte para outra máquina O frontend do compilador é responsável pela etapa de análise Análise Léxica Fragmenta a entrada em conjunto de símbolos conhecidas como tokens Análise Sintática Analisa a estrutura de lexemas do código fonte entrada Análise Semântica Verifica o significado do programa Análise Léxica Funções do Analisador Léxico Leitura dos caracteres do código fonte Remover espaços em braco tabulações e comentários Agrupamento em lexemas e classificálos Detectar erros e relacionar com a posição no programa Gerar a lista de tokens Manipular a tabela de símbolos Análise Léxica X Análise Sintática Os analisadores léxico e sintático podem ser construídos em um único passo ou em passos individuais do compilador Quando atuam em um único passo o analisador léxico atua como uma subrotina que é chamada pelo analisador sintático sempre que este necessita de mais um token E quando atuam de forma separada em sequência o analisador léxico constrói a lista de tokens e somente depois o analisador sintático é colocado em execução Análise Léxica X Análise Sintática Fluxo do processo Fonte AHO 2008 Análise Léxica X Análise Sintática Razões para dividir a análise léxica da sintática Simplicidade no projeto Maior eficiência Portabilidade Análise Léxica X Análise Sintática Simplicidade do projeto Separação dessas etapas permite simplificar pelo menos uma das tarefas Analisador Sintático que tivesse que tratar comentários e espaços em branco como unidades sintáticas seria muito mais complexo Eficiência do compilador Analisador léxico separado permite aplicar técnicas especializadas que servem apenas à análise léxica melhorando sua eficiência Os reconhecedores construídos a partir da descrição dos tokens gramáticas regulares são mais eficientes e compactos do que os reconhecedores construídos a partir das gramáticas livres de contexto Portabilidade do compilador As peculiaridades específicas do dispositivo de entrada podem ser restringidas ao analisador léxico Análise Léxica É a primeira fase da compilação Essa fase é implementada através de um Analisador Léxico Responsável por lerreceber os caracteres de entrada do programa fonte agrupando em unidades lexicamente significativas os lexemas e os converte em um fluxo de tokens relacionado ao padrão correspondente como saída representando os lexemas Estes tokens são enviados ao Analisador Sintático para que a análise seja efetuada Tokens são unidades lógicas que representam um ou mais caracteres e podem ser caracterizados como Identificadores palavras reservadas símbolos especiais números Cada palavra chave é um token Ex then begin integer Cada identificador é um token Ex a soma var1 Cada constante é um token Ex 123 123456 12E3 Cada sinal é um token Ex Análise Léxica Conceitos Lexema sequência de caracteres no programa fonte que associa um padrão a um token e é uma instância do token Padrão é uma descrição da forma que os lexemas de um token podem assumir Token É um par constituído um nome e um atributo que representa os lexemas que se encaixam em determinado padrão Análise Léxica Conceitos Exemplo Fonte FREITAS 2016 Fonte AHO 2008 Análise Léxica Atributos são necessários aos tokens quando mais de um lexema casa com um mesmo padrão Números Operadores se agrupados em classes Identificadores entrada para a tabela de símbolos O nome do token é usado na análise sintática e os atributos nas etapas subsequentes Análise Léxica Tokens comuns na maioria das linguagens Um token para cada palavrachave O padrão é a própria palavrachave Tokens para os operadores individuais ou em classes Um token para todos os identificadores Tokens para classes de constantes ex números e literais Um token para cada símbolo de pontuação parênteses vírgula ponto ponto e vírgula etc Análise Léxica A especificação dos padrões dos tokens é feita por meio das expressões regulares O reconhecimento de tokens implica na associação de parte da cadeia de entrada que seja um lexema que casa com um dos padrões da linguagem Para construir um analisador léxico os padrões são convertidos em Diagramas de Transição Análise Léxica Exemplo Fonte AHO 2008 Análise Léxica Exemplo Fonte AHO 2008 Análise Léxica Exemplo Fonte AHO 2008 Análise Léxica O problema das palavras reservadas Criar diagramas para cada palavra reservada Listar as palavras reservadas na tabela de símbolos Fonte AHO 2008 Análise Léxica Exemplo Fonte AHO 2008 Fonte AHO 2008 Análise Léxica Tabela de Símbolos A Tabela de símbolos é uma estrutura de dados que contém todos os símbolos permitidos na linguagem Esses símbolos são agrupados por tokens As informações são inseridas de modo incremental pelas fases de análise e usadas pelas fases de síntese para gerar posteriormente o código objeto Armazenam informações sobre os identificadores Tipo escopo limites no caso de vetores e número de parâmetros no caso de funções e qualquer outra informação relevante Existem vários modos de se organizar e acessar uma Tabela de símbolos Listas Lineares Tabelas Hash Exercício 1 Em grupos de três alunos Elaborar uma tabela de símbolos e a partir disso criar expressões regularesgramáticas regulares e autômatos finitos capazes de ler e reconhecer os seguintes caracteres em nível de projeto seguindo a lista abaixo Orientação Em muitas linguagens de programação as classes a seguir atendem a maioria ou todos os tokens Um Token para cada palavrachave Muitas vezes o padrão para uma palavrachave é o mesmo que a própria palavrachave Tokens para operadores seja individualmente ou em classes Token representando todos os identificadores Um token ou mais representando constantes como números e cadeias literais Tokens para símbolo de pontuação parênteses esquerdo e direito vírgula e pontoevírgula Exercício 2 Em grupos de três alunos Pesquisar e apresentar ferramentas automatizadas para construção de analisadores léxicos Ferramenta Descrição Funcionamento Referências Referências Bibliográficas AHO Alfred V SETHI Ravi ULLMAN Jeffrey D Compiladores princípios técnicas e ferrameferramentas 2 ed São Paulo Pearson AddisonWesley 2008 634 p BRANCO Wilson Castelo Branco Introdução à Compilação 2017 PIRES Matheus Giovanni Compiladores Análise Léxica 2018 RICARTE Ivan Construção de Compiladores Análise Léxica 2008 RIGO Sandro Construção de Compiladores 2018 SANTOS Ricardo Compiladores I 2018 Ciência da Computação Compiladores Unidade 02 Análise Léxica Etapa 1 Manual AL Elaborar a tabela de símbolos contendo minimamente os tokens abaixo e elaborar ER ou AF para os tokens Identificador Letras Dígitos Número Tipos Float int If for Operadores relacionais Operadores aritméticos Operadores lógicos main algum termo para sinalizar o início do programa AS Definir a estrutura da sintaxe da LP que o grupo vai propor Elaborar a gramática Caso necessário eliminar a recursão à esquerda e fator à esquerda Identificar o FirstFollow Construir a tabela sintática contendo tratamento de erros modo pânico Obs Os tokens previstos na estrutura sintática da LP e na GLC LL1 devem manter os mesmos termos dos tokens presentes na tabela de símbolo Etapa 2 código da parte manual a pratica Implementação do MiniComp Implementar o MiniCompilador Analisador Léxico e Analisador Sintático A implementação deve ser o reflexo do projeto do Analisador Léxico e Sintático A implementação deve ser apresentada Descrição Deve ser informado um código e o MiniCompilador deve realizar o processo de verificação de erros léxicos realizado pelo analisador léxico e sintáticos realizado pelo analisador sintático Os erros encontrados devem ser apresentados em um relatório informando se é um erro léxico ou sintático Caso não seja encontrado erro deve ser informado por meio de uma mensagem que a entrada pertence à linguagem MiniComp Trabalho ALAS Etapa 01 AL Elaborar a tabela de símbolos contendo minimamente os tokens abaixo e elaborar ER Expressão regular ou AF Autômato finito para os tokens let identificador 4323 Token Lexema Descrição Informal do padrão char aZ Uma letra Também válido para Chars char Sequência de letras Digits 09 Sequência de números inteiros Whitespace r Símbolos que representam um espaço String CharsWhitespaceDigits Uma cadeia de caracteres que pode ter letras espaços inteiros e caracteres especiais Float 314 168 Uma representação de um número decimal com ponto Id identificador Uma representação de um identificador que pode ter letras e inteiros deve começar com uma letra f if else else nil nil for for fn fn return return let let true true false false Expressões regulares char azAZ Chars azAZ Digits d Whitespace s String Float dd id azAZazAZ09 if if else else nil nil for for fn fn return return let let true true false false AS Definir a estrutura da sintaxe da LP Linguagem de Programação que o grupo vai propor Elaborar a gramática Exemplo da linguagem let five 5 let ten 10 let add fnx y x y let result addfive ten if 5 10 return true else return false 10 10 10 9 let stringsthree one two three for lenstringsthree 0 printlnstringsthreepop return nil Gramática Start Block OpUnary OpBinary Digit 0 1 2 3 4 5 6 7 8 9 Digit Digits ε Digits Digit Digit Float DigitsDigits Char aZ Char Chars ε Chars Char Char Whitespace space r StringChar Char Whitespace StringChar StringChars ε StringChars StringChar StringChar String StringChars Id Chars ExtraId IdList ε IdList Id ExtraId FnDeclare fn IdList Block FnCall Id IdList AssignExp let Id Exp ForExp Exp AssignExp Exp Exp ε For for ForExp Block If if Exp Block Else Else else Else ε Else If Block Stmt For If AssignExp Exp LastStmt return Exp ε Stmt Stmts ε Stmts Stmt Stmt LastStmt Block Stmts TerminalChainedId IdList ChainedId ε ChainedId Id TerminalChainedId IdChain Id ChainedId TerminalIdExp IdList ChainedId ε IdExp Id TerminalIdExp WrappedExp OpUnary OpExp OpExp OpBinary OpExp OpExp Number IdExp WrappedExp Number Digits PossibleFloat PossibleFloat Digits ε Exp nil false true String OpExp FnDeclare First FirstStart FirstOpUnary FirstOpBinary FirstDigit 09 FirstDigit 09 ε FirstDigits 09 FirstFloat 09 FirstChar aZ FirstChar aZ ε FirstChars aZ FirstWhitespace newline tab carriageReturn space FirstStringChar aZ newline tab carriageReturn space FirstStringChar aZ newline tab carriageReturn space ε FirstStringChars aZ newline tab carriageReturn space FirstString FirstId aZ FirstExtraId ε FirstIdList aZ FirstFnDeclare fn FirstFnCall aZ FirstAssignExp let FirstForExp 09 aZ fn let nil false true FirstFor for FirstIf if FirstElse else ε FirstElse if FirstStmt 09 aZ fn let for if nil false true FirstLastStmt return ε FirstStmt 09 aZ fn let for if nil false true ε FirstStmts 09 aZ fn let for if nil false true FirstBlock 09 aZ fn let for if nil false true FirstTerminalChainedId ε FirstChainedId FirstIdChain aZ FirstTerminalIdExp ε FirstIdExp aZ FirstOpExp 09 aZ FirstNumber 09 FirstPossibleFloat ε FirstWrappedExp 09 aZ FirstExp 09 aZ fn nil false true Follow FollowStart FollowOpUnary 09 aZ FollowOpBinary 09 aZ FollowDigit 09 aZ fn let for if return nil false true FollowDigit 09 aZ fn let for if return nil false true FollowDigits 09 aZ fn let for if return nil false true FollowFloat FollowChar 09 aZ newline tab carriageReturn space fn let for if return nil false true FollowChar 09 aZ fn let for if return nil false true FollowChars 09 aZ fn let for if return nil false true FollowWhitespace aZ newline tab carriageReturn space FollowStringChar aZ newline tab carriageReturn space FollowStringChar FollowStringChars FollowString 09 aZ fn let for if return nil false true FollowId 09 aZ fn let for if return nil false true FollowExtraId FollowIdList FollowFnDeclare 09 aZ fn let for if return nil false true FollowFnCall FollowAssignExp 09 aZ fn let for if return nil false true FollowForExp FollowFor 09 aZ fn let for if return nil false true FollowIf 09 aZ fn let for if return nil false true FollowElse 09 aZ fn let for if return nil false true FollowElse 09 aZ fn let for if return nil false true FollowStmt 09 aZ fn let for if return nil false true FollowLastStmt return FollowStmt return FollowStmts return FollowBlock FollowTerminalChainedId 09 aZ fn let for if return nil false true FollowChainedId 09 aZ fn let for if return nil false true FollowIdChain FollowTerminalIdExp 09 aZ fn let for if return nil false true FollowIdExp 09 aZ fn let for if return nil false true FollowOpExp 09 aZ fn let for if return nil false true FollowNumber 09 aZ fn let for if return nil false true FollowPossibleFloat 09 aZ fn let for if return nil false true FollowWrappedExp FollowExp 09 aZ fn let for if return nil false true Tabela Sintática Link de acesso Tabela Sintatica