Análise Sintática - Final

Documentos relacionados
Compiladores - JACC. Fabio Mascarenhas

Análise Sintática Bottom-up

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente

Compiladores - Análise SLR

Compilação: Erros. Detecção de Erros: * Analisadores Top-Down - Preditivo Tabular (LL) - Feito a mão. * Analisadores Botton-Up: - Shift-Reduce (SLR)

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Compiladores - Análise Preditiva

Analisadores Sintáticos LR

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Reduce: reduz o que está imediatamente à esquerda do foco usando uma produção

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

BNF (Backus-Naur Form) Gramática Livres de Contexto / Estruturas Recursivas

Análise Sintática. Fabiano Baldo

Compiladores - Gramáticas

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Conceitos de Linguagens de Programação

Análise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR

Compiladores - Análise LL(1)

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 31. Instituto de C

Introdução à Programação

INE5318 Construção de Compiladores. AULA 4: Análise Sintática

Compiladores - Gramáticas

Familiarização com a ferramenta JavaCC

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 12. Instituto de C

Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC

Análise sintática. Prof. Thiago A. S. Pardo. Análise sintática ascendente

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Vantagens de uma Gramática. Sintaxe de uma Linguagem. Analisador Sintático - Parser. Papel do Analisador Sintático. Tiposde Parsers para Gramáticas

Compiladores Análise Semântica

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

Compiladores Análise Semântica

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Construção de Compiladores Aula 18 - Análise Sintática Ascendente

Conceitos de Linguagens de Programação

Como construir um compilador utilizando ferramentas Java

Análise Sintática Introdução

Compiladores - JFlex. Fabio Mascarenhas

Análise Sintática (Cap. 04) Análise Sintática Ascendente Analisador Sintático LR

Compiladores I. Caracterizar um método de análise bottom-up. Compreender os mecanismos básicos envolvidos no processo de análise LR.

Análise Sintática. Análise Sintática. Tipos de Analisadores Gramáticais: PARSERS

Análise Sintática Descendente

Compiladores. Top-Down x Bottom Up. Plano da aula. Redução exemplo 1. Redução exemplo 1. Lembrando: construir a tabela de análise LL(1) A Abc b B d

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto

Construção de Compiladores Aula 16 - Análise Sintática

Analisadores Ascendentes ou Empilha-Reduz. Mais um exemplo... Mais um exemplo... Top-Down x Bottom Up. Conteúdo da aula. Analisadores Ascendentes

Como construir um compilador utilizando ferramentas Java

Concurso Público para provimento de cargo efetivo de Docentes. Edital 20/2015 CIÊNCIA DA COMPUTAÇÃO II Campus Rio Pomba

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013

Compiladores I Prof. Ricardo Santos (cap 1)

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Notação EBNF BNF estendida Notação usada com o YACC (gerador de parsers Bottom-up)

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Compiladores / YACC Professor Ariel da Silva Dias YACC. Adaptação da obra original de Tom Niemann

Análise Sintática (Cap. 04) Análise Sintática Descendente

Análise Sintática LL(1)

Notação EBNF BNF estendida Notação usada com o YACC (gerador de parsers Bottom-up)

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

Transcrição:

MAB 471 2011.2 Análise Sintática - Final http://www.dcc.ufrj.br/~fabiom/comp

LR(k ) vs LL(k ) Encontrando o próximo passo em uma derivação LR(k) Cada redução na análise detectável com o contexto esquerdo completo, a frase a reduzir e os k símbolos terminais à sua direita generalizações de LR(1) e LL(1) para lookaheads maiores LL(k) Parser deve escolher a expansão com o contexto esquerdo completo (pilha LL(k)) os próximos k terminais Logo, LR(k) examina mais contexto A questão é, existem linguagens que são LR(k) mas não LL(k)? 2

LR(1) vs LL(1) A gramática LR(1) a seguir não tem correspondente LL(1) Precisa de lookahead arbitrário para escolher entre A e B Um parser LR(1) pode carregar o contexto (os ( s) até encontrar um a ou b e saber como reduzir Um parser LL(1) não pode decidir se deve expandir Goal por A ou por B, e não adianta fatorar a gramática Na verdade, essa gramática não é LL(k) para nenhum k Precisa de um analisador LL(*) 3

LR(k ) vs LL(k ) Outra gramática não-ll(k) Essa gramática é LR(0)! 4

Recursão à Esquerda vs Recursão à Direita Recursão à direita Necessária para terminação em parsers top-down Usa mais espaço na pilha em parsers bottom-up Associatividade à direita Recursão à esquerda Funciona em parsers bottom-up Limita espaço necessário na pilha Associatividade à esquerda Regra geral Recursão à esquerda para parsers bottom-up * * w * x z y w * ( x * ( y * z ) ) * * * z y Recursão à direita para parsers top-down, convertendo em laço onde possível w x ( (w * x ) * y ) * z 5

Associatividade Que diferença faz em operações associativas? Pode mudar respostas em ponto flutuante Oportunidades diferentes de otimização Considere x+y+z + x y z x + + y z x + y + z Operador ideal Associatividade esquerda Associatividade direita E se y+z aperece em outro lugar? Ou x+y? Ou x+z? O compilador pode querer mudar a forma das expressões E se x = 2 & z = 17? Nem à esquerda nem à direita expõe 19. Melhor forma é função do contexto. 6

Detecção e Recuperação de Erros Detecção de Erros Parser recursivo Parser cai na última cláusula else ou default do switch Projetista pode programar praticamente qualquer ação LL(1) de tabela No estado s i com token x, entrada é um erro Reporta o erro, entradas na linha de s i têm os possíveis tokens LR(1) de tabela No estado s i com token x, entrada é um erro Reporta o erro, shifts na linha do estado têm possíveis tokens Mensagens de erro podem ser pré-computadas para itens LR(1), aí é só consultar uma tabela 7

Detecção e Recuperação de Erros Recuperação de Erros LL(1) de tabela Trata como token faltante, p. ex. ), expande pelo símbolo desejado Trata como token extra, p. ex., x - + y, desempilha e segue adiante LR(1) de tabela Trata como token faltante, p. ex. ), shift do token Trata como token extra, p. ex., x - + y, não faz shift 8

Detecção e Recuperação de Erros Recuperação por token de sincronização Avança na entrada até achar alguma âncora, p. ex., ; Resincroniza estado, pilha e entrada para ponto depois do token LL(1): desempilha até achar linha com entrada para ; LR(1): desempilha até achar estado com redução em ; Não corrige a entrada, mas deixa análise prosseguir NT pop() repeat until Tab[NT, ; ] error NT pop() token NextToken() repeat until token = ; token NextToken() Resincronizando parser LL(1) repeat until token = ; shift token shift s e token NextToken() reduce por produção de erro // desempilha todo esse estado Resincronizando parser LR(1) 9

Hierarquia das Linguagens Livres de Contexto Linguagens Livres de Contexto Linguagens determinísticas (LR(k)) LR(k) LR(1) linguagens LL(k) Linguagens de precedência simples linguagens LL(1) Linguagens de precedência de operadores A hierarquia de inclusão para linguagens livres de contexto 10

Hierarquia das Gramáticas Livres de Contexto Gramáticas Livres de Contexto Analisável Floyd-Evans CFGs não-ambíguas Precedência de Operadores LR(k) LR(1) LALR(1) SLR(1) LR(0) LL(k) LL(1) Existem gramáticas que não são ambíguas mas não são LR(k), mas toda linguagem para a qual existe uma gramática não ambígua tem uma gramática LR(1) A hierarquia de inclusão para gramáticas livres de contexto 11

Resumo Vantagens Desvantagens Top-down Recursivo, LL(1) Bottom-up LR(1) Rápido Boa localidade Simples Bom trat. de erros Rápido Linguagens determinísticas Automatizável Assoc. esquerda Escrito à mão Alta manutenção Assoc. direita Má localidade Trat. de erros difícil 12

Gerador de Parsers JACC Gerador de parsers LALR(1) para Java Sintaxe baseada na do YACC Tratamento de erros diferente do YACC, usa exemplos de erro ao invés de produções error e resincronização Pode gerar analisadores com mensagens de erro muito boas, mas é bem mais trabalhoso Rápido, codifica a máquina de estado LALR(1) em código ao invés de usar uma tabela 13

Usando JACC Linha de comando jacc X.jacc Gera arquivos Java pro parser e pra interface de tokens Opções -v: escreve saída da máquina de estados em arquivo X.output -h: escreve máquina em formato HTML no arquivo XMachine.html -fv, -fh: mostra conjuntos FIRST e FOLLOW para cada nãoterminal em conjunto com as opções anteriores -a, -s, -0: usa estratégia de parsing LALR(1), SLR(1), ou LR(0) -e X.errs: lê exemplos de erros no arquivo X.errs 14

Usando JACC Arquivo de entrada diretivas %% regras %% código extra Diretivas controlam a geração do parser Regras especificam a gramática e as ações durante a análise Código extra é inserido dentro da classe do parser 15

Diretivas JACC %class FooParser Nome da classe (e nome do arquivo java gerado) %interface FooTokens Nome da interface com códigos dos tokens (e do arquivo gerado) %next nexttoken() Código que carrega próximo token e retorna o tipo numérico dele %get tokentype Código que pega tipo numérico do token corrente %semantic Node: tokenval Tipo do valor semântico dos símbolos da gramática, e código (depois do :) para pegar o valor semântico do token corrente %token FOO BAR BAZ Tokens da linguagem 16

Regras JACC As regras JACC começam com o nome do não-terminal, seguido de : e das produções dele, separadas por, e terminam com ; expr : expr + term expr - term term ; term : term * fact term / fact fact ; fact : ( expr ) NUM ; 17

Ações de Redução As ações que o parser deve executar quando reduzir uma produção vêm entre {} depois da produção O valor de cada elemento fica em pseudo-variáveis $1, $2,... O valor da produção deve ser atribuído a $$ expr : expr + term { $$ = $1 + $3; } expr - term { $$ = $1 - $3; } term // default { $$ = $1; } ; term : term * fact { $$ = $1 * $3; } term / fact { $$ = $1 / $3; } fact ; fact : ( expr ) NUM ; 18

Operadores e Precedência As gramáticas JACC podem ser ambíguas na parte de expressões, usando diretivas de precedência/associatividade %left, %right Ordem em que aperecem no arquivo dão precedência (menor para maior) %left + - %left * / %right ^ %% expr : expr + expr { $$ = $1 + $3; } expr - expr { $$ = $1 - $3; } expr * expr { $$ = $1 * $3; } expr / expr { $$ = $1 / $3; } expr ^ expr { $$ = Math.pow($1,$3); } NUM ; 19

EBNF para JACC Repetição {... } em JACC: {... } => a : a... ; <1> { <2> } => a : a <2> <1> ; Opcional [... ] em JACC: [... ] => a :... ; <1> [ <2> ] <3> => <1> <3> <1> <2> <3> 20

Código Extra Tratamento de erros void yyerror(string msg) {... } Dispare uma exceção para interromper a análise Outras coisas para incluir nessa seção: construtores, campos para guardar instância do analisador léxico e o token corrente 21