CES-41 COMPILADORES Capítulo II Gramáticas e Linguagens.

Post on 21-Apr-2015

110 views 4 download

Transcript of CES-41 COMPILADORES Capítulo II Gramáticas e Linguagens.

CES-41 CES-41 COMPILADORESCOMPILADORES

Capítulo IICapítulo II

Gramáticas e Gramáticas e LinguagensLinguagens

Capítulo II – Capítulo II – Gramáticas e Gramáticas e LinguagensLinguagens

2.1 – Gramáticas e linguagens de 2.1 – Gramáticas e linguagens de programaçãoprogramação

2.2 – Gramáticas livres de contexto2.2 – Gramáticas livres de contexto

2.3 – GLC’s ambíguas2.3 – GLC’s ambíguas

2.4 – GLC’s recursivas à esquerda2.4 – GLC’s recursivas à esquerda

2.1 – Gramáticas e 2.1 – Gramáticas e Linguagens de Linguagens de ProgramaçãoProgramação

As linguagens de programação conhecidas As linguagens de programação conhecidas não não são livres de contextosão livres de contexto

Exemplo: Exemplo: seja a linguagemseja a linguagem

L = {w c w | w Є (a | b)*}L = {w c w | w Є (a | b)*}

onde ∑ = {a, b, c}onde ∑ = {a, b, c}

Sentença típica: Sentença típica: aababcaababaababcaabab

L = {w c w | w Є (a | b)*}L = {w c w | w Є (a | b)*}

onde ∑ = {a, b, c}onde ∑ = {a, b, c} Sentença típica: Sentença típica: aababcaababaababcaabab

A linguagem é uma A linguagem é uma simplificaçãosimplificação daquelas daquelas que exigem a que exigem a declaraçãodeclaração de todo de todo identificadoridentificador antes de ser antes de ser usadousado

A primeira ocorrência de A primeira ocorrência de aababaabab representa representa sua sua declaraçãodeclaração e a segunda, seu e a segunda, seu usouso

A letra A letra c c representa a separação entre representa a separação entre declaraçõesdeclarações e e comandos executáveiscomandos executáveis

L = {w c w | w Є (a | b)*}L = {w c w | w Є (a | b)*}

onde ∑ = {a, b, c}onde ∑ = {a, b, c} Sentença típica: Sentença típica: aababcaababaababcaabab

A Teoria de Linguagens Formais demonstra A Teoria de Linguagens Formais demonstra que tais linguagens não podem ser geradas por que tais linguagens não podem ser geradas por gramáticas livres de contextogramáticas livres de contexto ( (GLCGLC’s) ’s)

Ou seja, apresentam Ou seja, apresentam sensibilidade ao sensibilidade ao contextocontexto

No entanto não se usam No entanto não se usam gramáticas sensíveis gramáticas sensíveis ao contextoao contexto ( (GSCGSC’s) para analisar programas ’s) para analisar programas escritos em linguagens de programaçãoescritos em linguagens de programação

GramáticasGramáticas regulares regulares são usadas na análise são usadas na análise léxicaléxica

Gramáticas Gramáticas livres de contextolivres de contexto são usadas na são usadas na análise análise sintáticasintática

A A sensibilidade ao contextosensibilidade ao contexto das linguagens é das linguagens é verificada na análise verificada na análise semânticasemântica

Exemplo:Exemplo: declaração de identificadores declaração de identificadores

Um identificador é colocado na Um identificador é colocado na tabela de tabela de símbolossímbolos quando de sua quando de sua declaraçãodeclaração

Sua Sua presençapresença nessa tabela é verificada, nessa tabela é verificada, quando de seu quando de seu uso (teste semântico)uso (teste semântico)

2.2 – Gramáticas Livres de 2.2 – Gramáticas Livres de ContextoContexto

2.2.1 – 2.2.1 – Definição Definição

Tipicamente são usadas Tipicamente são usadas três especificaçõestrês especificações para para se definir uma se definir uma linguagem de programaçãolinguagem de programação::

Especificações Especificações sintáticassintáticas, feitas através de , feitas através de uma uma GLCGLC

Especificações Especificações léxicasléxicas, usando expressões , usando expressões regularesregulares

Especificações Especificações semânticassemânticas, usando , usando restriçõesrestrições às às construções sintáticasconstruções sintáticas

Em Em compilaçãocompilação, para a maioria das , para a maioria das linguagens linguagens de programaçãode programação,, há uma simplificação tal que:há uma simplificação tal que:

GLC’sGLC’s são usadas para guiar toda a fase de são usadas para guiar toda a fase de análiseanálise e a geração do e a geração do código intermediáriocódigo intermediário (todo o (todo o front-endfront-end do compilador) do compilador)

O O analisador sintáticoanalisador sintático é fundamentado numa é fundamentado numa GLC’s GLC’s

Ele tem como escravo o Ele tem como escravo o analisador léxicoanalisador léxico

Ele tem como recheio o Ele tem como recheio o analisador semânticoanalisador semântico e o e o gerador do código intermediáriogerador do código intermediário

GLCGLC é uma entidade é uma entidade GG contendo quatro contendo quatro componentescomponentes::

Um conjunto finito Um conjunto finito N N de símbolos de símbolos não-não-terminaisterminais

Um Um alfabetoalfabeto, ou seja, um conjunto finito , ou seja, um conjunto finito ∑∑ de de símbolos símbolos terminaisterminais, também chamados de , também chamados de átomosátomos

A designação de um dos não-terminais de A designação de um dos não-terminais de NN para ser o para ser o símbolo inicialsímbolo inicial, referenciado muitas , referenciado muitas vezes por vezes por SS

Um conjunto Um conjunto PP de produções de produções

Simbolicamente, Simbolicamente, G = {N, ∑, S, P}G = {N, ∑, S, P}

Forma geral de uma produção: Forma geral de uma produção: A → A → αα

A A é um não-terminal, ou seja, é um não-terminal, ou seja, A Є NA Є N, e é , e é chamado de chamado de lado-esquerdolado-esquerdo

αα é um conjunto de zero ou mais terminais é um conjunto de zero ou mais terminais e/ou não-terminais, ou seja, e/ou não-terminais, ou seja, αα Є (N Є (N ∑)* ∑)*, e , e é chamado de é chamado de lado-direitolado-direito

De passagem, produção com De passagem, produção com sensibilidade ao sensibilidade ao contextocontexto: :

ββ A A γγ → → ββ αα γγ

A A é um não-terminal, ou seja, é um não-terminal, ou seja, A Є NA Є N

αα,, ββ,, γγ são conjuntos de zero ou mais são conjuntos de zero ou mais terminais e/ou não-terminais, ou seja, terminais e/ou não-terminais, ou seja, αα,, ββ,, γγ Є (N Є (N ∑)* ∑)*

Pelo menos um entre Pelo menos um entre ββ e e γ γ não é vazio não é vazio

A A pode ser substituído por pode ser substituído por αα, se estiver entre , se estiver entre ββ e e γ γ

2.2.2 – Construção de um programa ou 2.2.2 – Construção de um programa ou sentençasentença

■ Seja a seguinte gramática Seja a seguinte gramática G = {N, ∑, S, P}G = {N, ∑, S, P}

N = {S, A} N = {S, A} ∑ = {(, )}∑ = {(, )}

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

Símbolo inicial: SSímbolo inicial: S

■ O símbolo inicial O símbolo inicial SS é o embrião é o embrião

■ A construção se inicia substituindo-se o A construção se inicia substituindo-se o símbolo símbolo inicialinicial, pelo , pelo lado direitolado direito de uma de suas de uma de suas produções:produções:

S S S ( A ) S ( A )

■ Tem início a formação do Tem início a formação do fetofeto do programa do programa

■ A seguir, A seguir, lados esquerdoslados esquerdos de produções que de produções que fazem parte desse feto vão sendo substituídos fazem parte desse feto vão sendo substituídos pelos pelos lados direitoslados direitos

S S S ( A ) S ( A )

( A ) ( A ) ( A ) ( A )

( ) ( A ) ( ) ( A )

( ) ( S )( ) ( S )

( ) ( ( A ) ) ( ) ( ( A ) )

( ) ( ( ) ) ( ) ( ( ) )

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

A construção termina quando todos os não-terminais tiverem sido substituídos

O símbolo inicial e cada estado do feto são formas sentenciais do programa ou da sentença

Sentença é uma forma sentencial sem não-terminais

S S S ( A ) S ( A )

( A ) ( A ) ( A ) ( A )

( ) ( A ) ( ) ( A )

( ) ( S )( ) ( S )

( ) ( ( A ) ) ( ) ( ( A ) )

( ) ( ( ) ) ( ) ( ( ) )

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

A linguagem gerada por G, é o conjunto de todas as sentenças geradas por G

SimbolicamenteL(G) = { w * S * w }

S S S ( A ) S ( A )

( A ) ( A ) ( A ) ( A )

( ) ( A ) ( ) ( A )

( ) ( S )( ) ( S )

( ) ( ( A ) ) ( ) ( ( A ) )

( ) ( ( ) ) ( ) ( ( ) )

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

Definição recursiva de forma sentencial de uma gramática:

1) O símbolo inicial S é uma forma sentencial

2) Seja A um não-terminal e sejam α, β, γ cadeias de símbolos terminais e/ou não terminais

3) Se βAγ for uma forma sentencial e A → α uma produção, então β α γ é também uma forma sentencial

S S S ( A ) S ( A )

( A ) ( A ) ( A ) ( A )

( ) ( A ) ( ) ( A )

( ) ( S )( ) ( S )

( ) ( ( A ) ) ( ) ( ( A ) )

( ) ( ( ) ) ( ) ( ( ) )

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

Derivação direta é a substituição, numa forma sentencial, de um não-terminal pelo lado direito de uma de suas produções

O processo ao lado apresenta 6 derivações diretas

S S S ( A ) S ( A )

( A ) ( A ) ( A ) ( A )

( ) ( A ) ( ) ( A )

( ) ( S )( ) ( S )

( ) ( ( A ) ) ( ) ( ( A ) )

( ) ( ( ) ) ( ) ( ( ) )

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

Derivação de uma forma sentencial é uma sequência de zero ou mais derivações diretas para produzir essa forma, começando do símbolo inicial

Simbolicamente: S * S, S * ( ) ( ( ) ) e S *

( ) ( A )

Outro símbolo: + : sequência de uma ou mais derivações diretas

S S S ( A ) S ( A )

( A ) ( A ) ( A ) ( A )

( ) ( A ) ( ) ( A )

( ) ( S )( ) ( S )

( ) ( ( A ) ) ( ) ( ( A ) )

( ) ( ( ) ) ( ) ( ( ) )

P = {P = {S S ( A ) | S ( A ) ( A ) | S ( A ) , , A A εε | S | S}}

As definições de derivação e derivação direta e os símbolos , * e + podem ser aplicados a

- Não-terminais diferentes do símbolo inicial - Sub-cadeias de sentenças - Sub-cadeias de formas sentenciais

Exemplos:

A S ( A ) ( ) A + ( A )A * ( )

Exemplo:Exemplo: produção de um programa na produção de um programa na linguagem linguagem LAtribLAtrib, com as seguintes , com as seguintes características:características:

■ Programas Programas têm só otêm só o módulo principal módulo principal

■ Esse módulo temEsse módulo tem cabeçalho, declarações e cabeçalho, declarações e comandos de atribuiçãocomandos de atribuição

■ As As variáveisvariáveis podem ser podem ser inteirasinteiras e e reaisreais, , escalaresescalares

■ OperadoresOperadores de expressões: de expressões: somasoma e e subtraçãosubtração

■ Expressões podem ter Expressões podem ter parêntesisparêntesis

Gramática Gramática para para LAtrib:LAtrib:

∑ ∑ = {= {programprogram, , varvar, , intint, , realreal, ID, CTINT, , ID, CTINT, CTREAL, CTREAL, ‘{’‘{’, , ‘}’‘}’, , ‘;’‘;’, , ‘,’‘,’ , , ‘=’‘=’ , , ‘+’‘+’ , , ‘-’‘-’ , , ‘(’‘(’, , ‘)’‘)’}}

Os átomos literais em Os átomos literais em negritonegrito são palavras são palavras reservadasreservadas

N = {N = {ProgramaPrograma, , CabeçalhoCabeçalho, , DeclaraçõesDeclarações, , ListDeclListDecl, , DeclaraçãoDeclaração, , TipoTipo, , ListIdListId, , ComandosComandos, , ListCmdListCmd, , CmdAtribCmdAtrib, , ExpressãoExpressão, , TermoTermo}}

O símbolo inicial é O símbolo inicial é ProgramaPrograma

Produções Produções da Gramáticada Gramática para para LAtrib:LAtrib:

ProgramaPrograma → → Cabeçalho Declarações ComandosCabeçalho Declarações Comandos

CabeçalhoCabeçalho → → programprogram ID ID ;;

DeclaraçõesDeclarações → → εε | | varvar ListDeclListDeclListDeclListDecl → → DeclaraçãoDeclaração | | ListDecl DeclaraçãoListDecl DeclaraçãoDeclaraçãoDeclaração → → Tipo ListIdTipo ListId ;;TipoTipo → → intint | | realrealListIdListId → ID | → ID | ListIdListId ,, ID ID

ComandosComandos → → {{ ListCmdListCmd }}ListCmdListCmd → → εε | | ListCmd CmdAtribListCmd CmdAtribCmdAtribCmdAtrib → ID → ID == ExpressãoExpressão ;;ExpressãoExpressão → → TermoTermo | | ExpressãoExpressão ++ TermoTermo | |

ExpressãoExpressão -- TermoTermoTermoTermo → ID | CTINT | CTREAL | → ID | CTINT | CTREAL | (( ExpressãoExpressão ))

Seja o programa Exemplo:

program Exemplo; var int i, j; real x;{

i = 2; j = 3; x = 5.5–(i+j);

}

Seja a construção do programa Exemplo

ProgramaPrograma Cabeçalho Declarações ComandosCabeçalho Declarações Comandos

++ programprogram ID ID(Exemplo)(Exemplo) ; ; varvar ListDeclListDecl {{ ListCmdListCmd }}

++ programprogram ID ID(Exemplo)(Exemplo) ; ; var var ListDecl Declaração ListDecl Declaração {{ ListCmd CmdAtrib ListCmd CmdAtrib }}

++ programprogram ID ID(Exemplo)(Exemplo) ; ; var var Declaração Declaração DeclaraçãoDeclaração

{{ ListCmd CmdAtrib CmdAtribListCmd CmdAtrib CmdAtrib }}

++ programprogram ID ID(Exemplo)(Exemplo) ; ; var var Declaração Declaração DeclaraçãoDeclaração

{{ ListCmd CmdAtrib CmdAtrib CmdAtribListCmd CmdAtrib CmdAtrib CmdAtrib }}

program Exemplo; var int i, j; real x;{i = 2; j = 3; x = 5.5 – (i + j);}

++ programprogram ID ID(Exemplo)(Exemplo) ; ; var var Declaração Declaração DeclaraçãoDeclaração

{{ CmdAtrib CmdAtrib CmdAtribCmdAtrib CmdAtrib CmdAtrib }}

++ programprogram ID ID(Exemplo)(Exemplo) ; ; var var Tipo ListIdTipo ListId ;; Tipo Tipo ListIdListId ;;

{{ ID ID(i)(i) == ExpressãoExpressão ;; ID ID(j)(j) == ExpressãoExpressão ;;

IDID(x)(x) == ExpressãoExpressão ;; }}

++ programprogram ID ID(Exemplo)(Exemplo) ; ;

var intvar int ListIdListId ,, ID ID(j)(j) ;; realreal ID ID(x)(x) ;;

{{ ID ID(i)(i) == TermoTermo ;; ID ID(j)(j) == TermoTermo ;;

IDID(x)(x) == ExpressãoExpressão -- TermoTermo ;; }}

program Exemplo; var int i, j; real x;{i = 2; j = 3; x = 5.5 – (i + j);}

++ programprogram ID ID(Exemplo)(Exemplo) ; ;

var int var int IDID(i)(i) , , IDID(j)(j) ; real ; real IDID(x)(x) ; ;

{ { IDID(i)(i) = = TermoTermo ; ; IDID(j)(j) = = TermoTermo ; ;

IDID(x)(x) = = TermoTermo - ( - ( ExpressãoExpressão ) ; } ) ; }

++ programprogram ID ID(Exemplo)(Exemplo) ; ;

var int var int IDID(i)(i) , , IDID(j)(j) ; real ; real IDID(x)(x) ; ;

{ { IDID(i)(i) = = TermoTermo ; ; IDID(j)(j) = = TermoTermo ; ;

IDID(x)(x) = = TermoTermo - ( - ( ExpressãoExpressão + + TermoTermo ) ; } ) ; }

program Exemplo; var int i, j; real x;{i = 2; j = 3; x = 5.5 – (i + j);}

++ programprogram ID ID(Exemplo)(Exemplo) ; ;

var var

int int IDID(i)(i) , , IDID(j)(j) ; real ; real IDID(x)(x) ; ;

{ {

IDID(i)(i) = = TermoTermo ; ; IDID(j)(j) = = TermoTermo ; ;

IDID(x)(x) = = TermoTermo - ( - ( TermoTermo + + TermoTermo ) ; ) ;

}}

program Exemplo; var int i, j; real x;{i = 2; j = 3; x = 5.5 – (i + j);}

++ programprogram ID ID(Exemplo)(Exemplo) ; ;

var var

int int IDID(i)(i) , , IDID(j)(j) ; real ; real IDID(x)(x) ; ;

{ {

IDID(i)(i) = = CTINTCTINT(2)(2) ; ; IDID(j)(j) = = CTINTCTINT(3)(3) ; ;

IDID(x)(x) = = CTREALCTREAL(5.5)(5.5) - ( - (IDID(i)(i) + + IDID(j)(j) ) ) ; ;

}}

program Exemplo; var int i, j; real x;{i = 2; j = 3; x = 5.5 – (i + j);}

2.2.3 – Árvores sintáticas2.2.3 – Árvores sintáticas

■ Árvore sintática Árvore sintática é uma representação gráfica é uma representação gráfica de uma de uma derivaçãoderivação

■ Exemplo:Exemplo: árvore sintática de árvore sintática de S S ** ( ) ( ( ) ) ( ) ( ( ) )

Árvore sintática do programa

Exemplo

program Exemplo; var int i, j; real x;{

i = 2; j = 3; x = 5.5–(i+j);

}

2.3 – GLC’s Ambíguas2.3 – GLC’s Ambíguas Uma GLC é Uma GLC é ambíguaambígua, se uma de suas , se uma de suas

sentenças possuir sentenças possuir 2 ou mais árvores 2 ou mais árvores sintáticas distintassintáticas distintas

Exemplo: Exemplo: Seja a gramáticaSeja a gramática G = { G = {, N, P, S} , N, P, S} tal que:tal que:

= {a, b}; N = {S}; P = {S = {a, b}; N = {S}; P = {S S b S S b S a} a}

GG é ambígua pois a sentença é ambígua pois a sentença ababaababa tem duas tem duas árvores sintáticas:árvores sintáticas:

Exemplo: Exemplo: a a Língua Portuguesa sem Língua Portuguesa sem pontuaçãopontuação teria sérias ambiguidades teria sérias ambiguidades

A fraseA frase

matar o rei não é pecadomatar o rei não é pecado

teria dois sentidos: teria dois sentidos:

1) matar o rei não é pecado1) matar o rei não é pecado

2) matar o rei não é pecado2) matar o rei não é pecado

Em Em compilaçãocompilação, as gramáticas devem ser , as gramáticas devem ser não-ambíguasnão-ambíguas, ou então, deve-se acrescentar , ou então, deve-se acrescentar regrasregras para resolver ambiguidades para resolver ambiguidades

Exemplo: Exemplo: comando comando if-elseif-else da Linguagem C da Linguagem C

Produções:Produções:

S S if B S else S if B S else S if B S if B S a1 a1 a2 a2

B B b1 b1 b2 b2

A sentençaA sentença

if b1 if b2 a1 else a2if b1 if b2 a1 else a2

tem duas árvores sintáticas, a saber:tem duas árvores sintáticas, a saber:

S S if B S else S if B S else S if B S if B S a1 a1 a2 a2B B b1 b1 b2 b2

Regra de solução: fazer o else corresponder ao último if

2.4 – GLC’s Recursivas à 2.4 – GLC’s Recursivas à EsquerdaEsquerda

Uma GLC é Uma GLC é recursiva à esquerdarecursiva à esquerda, se tiver um , se tiver um não-terminal não-terminal AA tal que haja uma derivação tal que haja uma derivação A A ++ A A, onde , onde (N (N ))**

Exemplo: Exemplo: Na gramáticaNa gramática G = { G = {, N, P, S} , N, P, S} tal tal que:que:

= {a, b}; N = {S}; P = {S = {a, b}; N = {S}; P = {S S b S S b S a} a}

tem-se tem-se S S S b S S b S (recursividade (recursividade imediata à esquerda)imediata à esquerda)

Exemplo: Exemplo: Na gramáticaNa gramática da linguagem da linguagem LAtribLAtrib, , as seguintes produções são as seguintes produções são recursivas à recursivas à esquerdaesquerda: :

ListDeclListDecl → → ListDecl DeclaraçãoListDecl Declaração

ListIdListId → → ListIdListId ,, ID ID

ListCmdListCmd → → ListCmd CmdAtribListCmd CmdAtrib

ExpressãoExpressão → → ExpressãoExpressão ++ TermoTermo | | ExpressãoExpressão -- TermoTermo

Existe Existe recursividade não-imediatarecursividade não-imediata à à esquerda esquerda

Exemplo:Exemplo: Seja a gramática Seja a gramática G = {G = {, N, P, S} , N, P, S} na qual:na qual:

= {a, b, c, d}; N = {S, A}; = {a, b, c, d}; N = {S, A};

P = {S P = {S Aa Aa b b ,, A A Sc Sc d } d }

Essa gramática é Essa gramática é não-imediatamente não-imediatamente recursivarecursiva à esquerda pois: à esquerda pois:

S S A a A a S c a S c a

Análise sintática top-downAnálise sintática top-down - - grande grupo de grande grupo de métodos muito populares de análise sintática:métodos muito populares de análise sintática:

Não consegue tratar gramáticas Não consegue tratar gramáticas recursivas à recursivas à esquerdaesquerda

Tais gramáticas devem então ser Tais gramáticas devem então ser transformadastransformadas em outras equivalentes em outras equivalentes não-não-recursivas à esquerdarecursivas à esquerda

Essa transformação será vista no Essa transformação será vista no Capítulo VCapítulo V

Análise sintática bottom-upAnálise sintática bottom-up - - outro grande outro grande grupo de métodos muito populares de análise grupo de métodos muito populares de análise sintática:sintática:

Trabalha mais eficientemente com gramáticas Trabalha mais eficientemente com gramáticas recursivas à esquerdarecursivas à esquerda

YaccYacc usa análise usa análise bottom-upbottom-up