A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Sintaxe de uma Linguagem

Apresentações semelhantes


Apresentação em tema: "Sintaxe de uma Linguagem"— Transcrição da apresentação:

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

2 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.

3 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

4 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.

5 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.

6 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.

7 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

8 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 ^

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

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

11 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

12 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.

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

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

15 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

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

17 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.

18 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.

19 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

20 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.

21 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’ | 

22 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.

23 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 | 

24 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.

25 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).

26 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.

27 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.

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


Carregar ppt "Sintaxe de uma Linguagem"

Apresentações semelhantes


Anúncios Google