Post on 07-Nov-2018
Compiladores 2012/2013 2
Árvore Sintática
Nós internos: símbolos não-terminais
Folhas: símbolos terminais
Arcos:
de símbolos não-terminais do LHS da
produção
para nós do RHS da produção
Captura a derivação da frase (String)
Compiladores 2012/2013 3
Gramática
Start Expr
Expr Expr OP Expr
Expr INT
Expr OPEN Expr CLOSE
OP = + | - | * | /
INT = [0-9] [0-9]*
OPEN = (
CLOSE = )
Compiladores 2012/2013 4
Árvore Sintática para (2-1)+1
Start
Expr
Expr Expr OP
+ OPEN
( CLOSE
) Expr
INT
1
OP
-
Expr
INT
2
Expr
INT
1
Compiladores 2012/2013 5
Ambiguidade numa Gramática
Múltiplas derivações (como consequência: múltiplas árvores sintáticas) para a mesma String
Derivação e árvore sintática reflecte usualmente a semântica do programa
Ambiguidade na gramática reflecte muitas das vezes ambiguidades na semântica da linguagem (considerada indesejável)
Compiladores 2012/2013
6
Exemplo de ambiguidade
Duas árvores sintáticas para 2-1+1
Start
Expr
Expr Expr OP
+
Expr Expr OP
-
INT
2
INT
1
INT
1
Start
Expr
Expr Expr OP
-
Expr Expr OP
+
INT
1
INT
1
INT
2
Compiladores 2012/2013 7
Eliminação de ambiguidade
Solução: modificar gramática
fazer todos os operadores com
associação à esquerda
Gramática Original
Start Expr
Expr Expr OP Expr
Expr INT
Expr OPEN Expr CLOSE
Gramática Modificada
Start Expr
Expr Expr OP INT
Expr INT
Expr OPEN Expr CLOSE
Compiladores 2012/2013 8
Árvore sintática para a
gramática
Apenas uma árvore sintáctica para: 2-1+1
Start
Expr
Expr OP
+
Expr OP
-
INT
2
INT
1
INT
1
Start
Expr
Expr Expr OP
-
Expr Expr OP
+
INT
1
INT
1
INT
2
Árvore sintática válida Árvore sintática inválida
Compiladores 2012/2013 9
Violação de prioridade
Todos os operadores
associam à esquerda
Viola prioridade de * sobre
+
2-3*4 associa como (2-
3)*4
Start
Expr
Expr OP
*
Expr OP
-
INT
2
INT
3
INT
4
Árvore sintática para
2-3*4
Compiladores 2012/2013 10
Resolver prioridade
Gramática Original
OP = + | - | * | /
INT = [0-9] [0-9]*
OPEN = (
CLOSE = )
Start Expr
Expr Expr OP INT
Expr INT
Expr OPEN Expr CLOSE
Gramática Modificada
OP1 = + | -
OP2 = * | /
INT = [0-9] [0-9]*
OPEN = (
CLOSE = )
Start Expr
Expr Expr OP1 Term
Expr Term
Expr OPEN Expr CLOSE
Term Term OP2 INT
Term INT
Compiladores 2012/2013 11
Modificação nas Árvores
Sintáticas
Start
Expr
Expr OP
*
Expr OP
-
INT
2
INT
3
INT
4
Velha Árvore sintática para
2-3*4
Start
Expr
Expr OP1
-
Term
INT
2
Nova Árvore sintática para
2-3*4
Term
Term OP2
*
INT
3
INT
4
Compiladores 2012/2013 12
Ideia Geral
Agrupar operadores por níveis de prioridade * e / estão no nível de topo
+ e – estão no nível a seguir
Símbolo não-terminal para cada nível de prioridade Term é não-terminal para * e /
Expr é não-terminal para + e -
Pode-se fazer associatividade dos operadores à esquerda ou à direita em cada nível
Generalizar para níveis arbitrários de prioridades
Compiladores 2012/2013 13
TPC
Dada a gramática:
NUM = [0-9]+
ID = [A-Za-Z][0-9A-Za-z]*
Expr Expr + Term | Expr – Term | Term
Term Term * Factor | Term / Factor | Factor
Factor Primary ^ Factor | Primary
Primary -Primary | Element
Element ( Expr ) | NUM | ID
Quais as árvores sintáticas para:
• 5-2*3
• y^3
Compiladores 2012/2013 14
Estruturas if-then-else
Start Stat
Stat IF Expr THEN Stat ELSE Stat
Stat IF Expr THEN Stat
Stat ...
Compiladores 2012/2013 16
Árvore Sintática
Duas Árvores
Sintáticas
Stat
IF Expr Stat
IF Expr Stat ELSE e1
e2
Stat
s1 s2
IF Expr
Stat
IF Expr Stat ELSE
e2
e1
Stat
s1
s2
Qual é a
correcta?
THEN
THEN
THEN
Compiladores 2012/2013 17
Leituras alternativas
Gramática ambígua
Árvore sintática 1
if e1
if e2 s1
else s2
Árvore sintática 2
if e1
if e2 s1
else s2
Compiladores 2012/2013 18
Gramática modificada
Ideia básica: controlar quando um IF
sem ELSE pode ocorrer
No nível de topo do enunciado
Ou como último numa sequência de
enunciados if then else if then ...
Compiladores 2012/2013 19
Gramática modificada
Goal Stat
Stat WithElse
Stat LastElse
WithElse IF Expr THEN WithElse ELSE WithElse
WithElse …
LastElse IF Expr THEN Stat
LastElse IF Expr THEN WithElse ELSE LastElse
Compiladores 2012/2013 20
Analisador Sintático
Converte programas numa árvore sintática
Pode ser programado do zero!
Ou construído automaticamente por um gerador de “parsers”
Aceitam uma gramática como entrada
Produzem um analisador sintático como resultado
Problema prático
A Árvore Sintática para a gramática modificada é complicada
Gostaríamos de começar com uma árvore sintática mais intuitiva
Compiladores 2012/2013 21
Solução
Sintaxe Abstracta versus Concreta Sintaxe abstracta corresponde ao meio
intuitivo de pensar a estrutura do programa • Omite detalhes como palavras-chave supérfluas
que estão lá para tornar a linguagem não ambígua
• Sintaxe abstracta pode ser ambígua
Sintaxe Concreta corresponde à gramática completa utilizada para analisar sintacticamente a linguagem
Os analisadores sintáticos são muitas das vezes escritos para produzirem Árvores Sintáticas Abstractas (ASTs)
Compiladores 2012/2013 22
ASTs (Árvores Sintáticas
Abstractas)
Começar com uma gramática intuitiva mas
ambígua
Modificar a gramática para a tornar não- ambígua Árvores sintáticas concretas
Menos intuitivas
Converter as árvores sintáticas concretas em ASTs Correspondem à gramática intuitiva para a
linguagem
Mais simples de manipular pelo programa
Compiladores 2012/2013 23
Exemplo
Gramática intuitiva mas
ambígua
OP = * | / | + | -
INT = [0-9] [0-9]*
Start Expr
Expr Expr OP Expr
Expr INT
Gramática não-ambígua
OP1 = + | -
OP2 = * | /
INT = [0-9] [0-9]*
OPEN = (
CLOSE = )
Start Expr
Expr Expr OP1 Term
Expr Term
Term OPEN Expr CLOSE
Term Term OP2 INT
Term INT
Compiladores 2012/2013 24
Exemplo Start
Expr
Expr
Expr OP1
-
INT
3
Árvore sintática
concreta para
(2-3)*4 Term
OP2
* INT
4 Term
OPEN CLOSE
Term
INT
2
Term
Start
Expr
Expr OP
*
Expr OP
- INT
2
Expr
INT
4
Expr
INT
3
Árvore sintática
abstracta para
(2-3)*4
• Utiliza gramática intuitiva
• Elimina terminais supérfluos
• OPEN, CLOSE, etc.
Compiladores 2012/2013 25
Exemplo
Start
Expr
Expr OP
*
OP
-
INT
2
INT
4
INT
3
AST para (2-3)*4
ainda mais
simplificada
Árvore sintática
abstracta para
(2-3)*4 Start
Expr
Expr OP
*
Expr OP
- INT
2
Expr
INT
4
Expr
INT
3
Compiladores 2012/2013 26
Sumário
Níveis da estrutura lexicais e sintáticos Lexicais – expressões regulares e
autómatos
Sintáticos – gramáticas
Ambiguidades na gramática Gramáticas modificadas
Árvores Sintáticas Abstractas (ASTs)
Papel generativo versus papel reconhecedor Generativo mais conveniente para
especificação
Reconhecedor requerido na implementação