Sintaxe de uma Linguagem

Slides:



Advertisements
Apresentações semelhantes
Software Básico Silvio Fernandes
Advertisements

Tópicos em Compiladores
5.5 – Análise Bottom-Up Tentativa de construir uma árvore sintática para a sentença analisada, começando das folhas, indo em direção à raiz (pós-ordem.
Compiladores Claudio Benossi
II – Análise léxica DEI Papel do analisador léxico.
III – Análise sintáctica Parsers ascendentes Instruções shift-reduce Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.5 LFA 1999/ Jorge.
III – Análise sintáctica
III – Análise sintáctica
Compiladores I Cristiano Damiani Vasconcellos
Teoria da Computação FIC– Ciência da Computação
Deyvisson, Rafael M.P., Renato, Robson C.F., Rodolfo
Análise Sintática Ascendente ­
Software Básico Silvio Fernandes
Compiladores Prof. Yandre Maldonado Compiladores - Prof. Yandre - 1.
Prof. Heloise Manica Paris Teixeira
Análise Sintática - Continuação
Linguagens Livres de Contexto
Linguagens Livre de Contexto
Curso Sistemas de Informação Disciplina: Arquitetura de Software
YACC.
Análise Sintática Ascendente
Relações em uma Gramática
Linguagem de Prog. e Programas
Construção de Compiladores
Construção de Compiladores
Construção de Compiladores
Prof. Bruno Moreno Aula 4 – 11/03/2011
Análise léxica e sintática
Análise léxica e sintática
Aula prática - análise contextual
Ferramentas para a Construção de Compiladores: Lex & Yacc
Compiladores, Aula Nº 11 João M. P. Cardoso
Compiladores, Aula Nº 9 João M. P. Cardoso
Gramáticas Livres de Contexto
Compiladores, Aula Nº 10 João M. P. Cardoso
Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat
Semântica de Linguagens de Programação
Análises léxica e sintática
Análise Léxica Primeira fase de um compilador
Análise Léxica e Sintática
Expressões Regulares e Gramáticas
Análise Léxica.
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Análises léxica e sintática
Analise Semântica aula-10-analise-semântica.pdf.
Aula 12 1 Análise Sintáctica Compiladores, Aula Nº 12 João M. P. Cardoso.
Compiladores.
Análise Sintática Prof. Alexandre Monteiro
Tradução Dirigida por Sintaxe
Revisão Compiladores – AP2
Análise Sintática de Descida Recursiva
Linguagens Livres de Contexto
Compiladores Análise Sintática
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.
Um Tradutor Dirigido por Sintaxe Simples
Semântica de Linguagens de Programação
JavaCC.
PLP – JavaCC Java Compiler Compiler
Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – Rodrigo Diego Melo Amorim–
Analisador sintático: Tipos de análises sintáticas
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
Reverso de uma Linguagem Regular
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Informática Teórica Engenharia da Computação. Teoria da Computação Contexto do que vamos começar a estudar As linguagens também podem ser definidas formalmente.
COMPILADORES 03 Prof. Marcos.
IF688 – Análise Sintática. Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up.
Transcrição da apresentação:

Sintaxe de uma Linguagem Especificada através de uma gramática livre de contexto, BNF (Backus-Naur Form).

Vantagens de usar uma gramática Uma gramática dá uma especificação precisa e fácil de entender da sintaxe de uma linguagem de programação Para algumas classes de gramáticas, é possível gerar automaticamente um parser eficiente. Além disso as ferramentas usadas indicam ambiguidades e outras construções difíceis de serem reconhecidas e que passaram desapercebidas Tem relação direta com a estrutura da linguagem usada para tradução/compilação. Fácil de ser estendida/atualizada.

Analisador Sintático - Parser Representação intermediária Parse tree token Analisador léxico parser Resto do front-end Programa fonte pede próximo token tabela de símbolos

Tipos de parsers para gramáticas Métodos de parsing universais: funcionam para qualquer gramática, mas são muito ineficientes (inviáveis para uso prático). Top down: constroem as parse trees a partir da raiz em direção às folhas. Bottom-up: constroem as parse trees a partir das folhas.

Parsers top-down ou bottom-up Em parsers top-down ou bottom-up a leitura do arquivo é sempre feita da esquerda para a direita, um símbolo de cada vez. Só funcionam para um subconjunto de gramáticas, que na prática são suficientes para a grande maioria das linguagens de programação.

Tratamento de Erros de Sintaxe Relatar presença de erros claramente e com precisão Recuperar-se do erro rapidamente, para possibilitar a detecção de erros subsequentes Não deve gerar overhead significativo para programas corretos.

Gramáticas Livres de Contexto stmt g if expr then stmt else stmt Um conjunto de símbolos terminais (tokens). Um conjunto de símbolos não-terminais (“variáveis”). Um conjunto de produções, cada produção consiste de um não-terminal. Uma seta, e uma seqüencia de tokens e/ou não terminais Um não terminal designado como símbolo inicial

Exemplo 1 expr g expr op expr expr g ( expr ) expr g - expr expr g id op g + op g - op g * op g / op g ^

Exemplo 1 (notação abreviada) expr g expr op expr | ( expr ) | - expr | id op g + | - | * | / | ^

Exemplo 2 block g begin op_stmts end op_stmts g stmt_list |  stmt_list g stmt_list ; stmt | stmt

Parse Trees Mostra graficamente como o símbolo inicial de uma gramática deriva uma string da linguagem. Para uma produção A g XYZ A X Y Z

Ambiguidade Parse-tree gera uma string, mas uma string pode possuir várias parse-trees, se a gramática for ambígua. Solução: usar sempre gramáticas não-ambíguas, ou gramáticas ambíguas com informações adicionais sobre como resolver ambiguidades.

Ambiguidade - Exemplo E g E + E | E * E | - E | ( E ) | id

Exemplo: Duas parse trees id + id * id E E E * E E + E E + E E * E id id id id id id

Expressões Regulares x Gramáticas Livres de Contexto Tudo que pode ser descrito por uma expressão regular pode ser descrito com gramáticas livres de contexto, mas: As regras léxicas são especificadas mais simplesmente com expressões regulares Expressões Regulares geralmente são mais concisas e simples de entender Podem ser gerados analisadores léxicos mais eficientes a partir de expressões regulares Estrutura/modulariza o front-end do compilador

Exemplo (a | b)*abb A0 g aA0 | bA0 | aA1 A1 g bA2 A2 g bA3 A3 g 

Expressões Regulares x Gramáticas Livres de Contexto Expressões regulares são convenientes para especificar a estrutura de construções léxicas, como identificadores, constantes, palavras chave etc. Em geral usa-se gramáticas para especificar estruturas aninhadas, como parenteses, begin-end, if-then-else etc.

Eliminando Ambiguidades stmt g if expr then stmt | if expr then stmt else stmt | other if E1 then S1 else if E2 then S2 else S3 if E1 then if E2 then S1 else S2 Nas linguagens de programação normalmente a regra é que o else casa com o then mais próximo.

Solução stmt g matched_stmt | unmatched_stmt matched_stmt g if expr then matched_stmt else matched_stmt | other unmatched_stmt g if expr then stmt | if expr then matched_stmt else unmatched_stmt

Recursão à Esquerda Uma gramática é recursiva à esquerda se existe um não terminal A tal que existe uma derivação de A que gera A, para alguma string . Existem técnicas/algorítimos para eliminar a recursão à esquerda.

Recursão à Esquerda - exemplos A g A |  pode ser substituido por A g A’ A’ g A’ |  E g E + T | T pode ser substituido por E g TE’ E’ g +TE’ | 

Fatoração à Esquerda Técnica de transformação de gramática usada para produzir uma gramática adequada para predictive parsing. Combina os casos em que há mais de uma alternativa possível a partir do reconhecimento de um token. Existem técnicas/algorítimos para fazer a fatoração à esquerda.

Fatoração à Esquerda - exemplo stmt g if expr then stmt | if expr then stmt else stmt stmt g if expr then stmt stmt’ stmt’ g else stmt | 

Construções que não podem ser especificadas por gramáticas livres de contexto L = {wcw | w está em (a|b)*} ex: declaração de variáveis antes de seu uso L = {anbmcndm | n >= 1 e m >= 1} ex: contagem do número de argumentos de funções/procedimentos.

Parsers top-down Recursive-descent parsing: técnica de parsing top-down que suporta backtracking predictive parsing: recursive-descent parsing sem backtracking. Relativamente fáceis de escrever à mão Só reconhecem alguns tipos de gramáticas: não suportam recursão à esquerda, precisa fazer fatoração à esquerda (predictive).

Parsers top-down Exemplo: reconhecer stmt g if expr then stmt else stmt | while expr do stmt | begin stmt_list end Pode fazer uso na implementação de diagramas de transição, ou ser implementado recursivamente.

Parsers bottom-up Também chamado de shift-reduce parsing – reduz uma string w ao símbolo inicial da gramática. A redução ocorre através da substituição do lado direito de uma produção pelo não-terminal do seu lado esquerdo. Mais complexo, constrói a árvore a partir das folhas. Gerado por ferramentas automáticas.

Parser bottom-up - exemplo S g aABe A g Abc | b B g d abbcde aAbcde aAde aABe S Cap.4, até seção 4.4.1.