Escolar Documentos
Profissional Documentos
Cultura Documentos
Sandro Rigo
sandro@ic.unicamp.br
• Análise Léxica:
– Quebra a entrada em palavras conhecidas como tokens
• Análise Sintática:
– Analisa a estrutura de frases do programa
• Análise Semântica:
– Calcula o “significado” do programa
a : = 7; b : = c + (d : = 5 + 6, d)
Ambígua!
(1-2)-3 = -4 e 1-(2-3) = 2
Ambígua!
(1+2)*3 = 9 e 1+(2*3) = 7
E→E+T T→T*F F → id
E→E−T T→T/F F → num
E→T T→F F → (E)
E→E+T T→T*F F → id
E→E−T T→T/F F → num
E→T T→F F → (E)
S→E$
E→E+T
E→E−T Criar um novo não terminal como
E→T símbolo inicial
T→T*F
T→T/F
T→F
F → id
F → num
F → (E)
S → if E then S else S
S → begin S L
S → print E
Como seria um parser
L → end para essa gramática?
L→;SL
E → num = num
S→E$
E→E+T
E→E−T
E→T Vamos aplicar a mesma
T→T*F técnica para essa outra
T→T/F gramática ...
T→F
F → id
F → num
F → (E)
• Y→c
• X→Y
• X→a
• Z→d
• Z→XYZ
• Y→
• Y→c
• X→Y
• X→a
• Z→d
• Z→XYZ
• Y→
• Y→c
• X→Y
• X→a
• Se γ é nullable:
– Coloque a produção na linha X, coluna T para cada T Є
FOLLOW[X].
Funciona ???
• Não!!
– A gramática é ambígua
– Note que algumas células da tabela do predictive parser têm mais
de uma entrada!
– Isso sempre acontece com gramáticas ambíguas!
Generalizando:
• Tendo X → Xγ e X → α, onde α não
começa com X
• Derivamos strings da forma αγ*
– α seguido de zero ou mais γ.
• Podemos reescrever:
• S→E$ • T → F T′ • F → id
• E → T E′ • T′ →* F T′ • F → num
• E′ → + T E′ • T′ → / F T′ • F → (E)
• E′ →− T E′ • T′ →
• E′ →
• S→E$ • T → F T′ • F → id
• E → T E′ • T′ →* F T′ • F → num
• E′ → + T E′ • T′ → / F T′ • F → (E)
• E′ →− T E′ • T′ →
• E′ →
void T() {
switch (tok) {
case ID:
case NUM:
case LPAREN: F(); Tprime(); break;
default: print("expected id, num, or
left-paren");
}}