Análise Sintática Compiladores Cristina C. Vieira 1
Á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) 2
Gramática Start EN CLOSE = + - * / = [0-9] [0-9]* EN = ( CLOSE = ) 3
Árvore Sintática para (2-1)+1 Start EN ( 2 4 - CLOSE ) 1 + 1
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) 5
Exemplo de ambiguidade Duas árvores sintáticas para 2-1+1 Start Start 2 6 - + 1 1 2-1 + 1
Eliminação de ambiguidade Solução: modificar gramática fazer todos os operadores com associação à esquerda Gramática Original Start EN CLOSE Gramática Modificada Start EN CLOSE 7
Árvore sintática para a gramática Apenas uma árvore sintáctica para: 2-1+1 Árvore sintática válida Start Árvore sintática inválida Start - 2 8 + 1 1 2-1 + 1
Violação de prioridade Todos os operadores associam à esquerda Viola prioridade de * sobre + 2-3*4 associa como (2-3)*4 Árvore sintática para 2-3*4 Start * 4 9-2 3
Resolver prioridade Gramática Original = + - * / = [0-9] [0-9]* EN = ( CLOSE = ) Start EN CLOSE 10 Gramática Modificada 1 = + - 2 = * / = [0-9] [0-9]* EN = ( CLOSE = ) Start 1 Term Term EN CLOSE Term Term 2 Term
Modificação nas Árvores Sintáticas Velha Árvore sintática para 2-3*4 Start Nova Árvore sintática para 2-3*4 Start - 2 11 * 3 4 Term 2 1 - Term 3 Term 2 * 4
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 / é 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 12
TPC Dada a gramática: NUM = [0-9]+ ID = [A-Za-Z][0-9A-Za-z]* + Term Term Term Term Term * Factor Term / Factor Factor Factor Primary ^ Factor Primary Primary -Primary Element Element ( ) NUM ID 13 Quais as árvores sintáticas para: 5-2*3 y^3
Estruturas if-then-else Start Stat Stat IF THEN Stat ELSE Stat Stat IF THEN Stat Stat... 14
Árvore Sintática Considere o enunciado: if e 1 then if e 2 then s 1 else s 2 15
Árvore Sintática IF Stat Stat Duas Árvores Sintáticas e1 IF THEN Stat ELSE Stat Stat e2 s1 s2 IF THEN Stat ELSE e1 IF THEN s1 Stat s2 Qual é a correcta? 16 e2
Leituras alternativas Gramática ambígua Árvore sintática 1 if e 1 if e 2 s 1 else s 2 Árvore sintática 2 if e 1 if e 2 s 1 else s 2 17
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... 18
Gramática modificada Goal Stat Stat WithElse Stat LastElse WithElse IF THEN WithElse ELSE WithElse WithElse LastElse IF THEN Stat LastElse IF THEN WithElse ELSE LastElse 19
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 20
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) 21
ASTs (Árvores Sintáticas Abstractas) Começar com uma gramática intuitiva mas ambígua Modificar a gramática para a tornar nãoambí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 22
Exemplo Gramática não-ambígua 1 = + - 2 = * / = [0-9] [0-9]* EN = ( CLOSE = ) Start 1 Term Term Term EN CLOSE Term Term 2 Term 23 Gramática intuitiva mas ambígua = * / + - = [0-9] [0-9]* Start
Exemplo 24 1 - Start Árvore sintática concreta para (2-3)*4 Term EN Term 2 Term 2 * CLOSE Term 3 4 Árvore sintática abstracta para (2-3)*4-2 Start * 3 Utiliza gramática intuitiva 4 Elimina terminais supérfluos EN, CLOSE, etc.
Exemplo Árvore sintática abstracta para (2-3)*4 Start AST para (2-3)*4 ainda mais simplificada Start - 2 * 3 4 2 - * 3 4 25
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 26