Gramática Livre de Contexto - SOL -...

Post on 28-Jun-2020

5 views 0 download

Transcript of Gramática Livre de Contexto - SOL -...

Gramática Livre de Contexto

N símbolos não terminais

T símbolos terminais

S símbolo de partida

◦ N T =

◦ V = N T

◦ S N

◦ P = { | V+ e V*}

Gramática Irrestrita ou Enumerável Recursivamente

Gramática Sensível ao Contexto

Gramática Livre de Contexto

Gramática Regular

Autômato Finito

Toda Produção é da forma:

◦ A aB

◦ A a

Ou seja: ◦ P={A aX | A N, a T, X N {} }

Autômato Finito

Toda Produção é da forma:◦ A aB

◦ A a

Ou seja: ◦ P={A aX | A N, a T, X N {} }

Do lado esquerdo da produção deve, sempre ocorrer um e apenas um não terminal e do lado direito podem ocorrer um terminal ou um terminal seguido de um não terminal.

Autômato Finito

Toda Produção é da forma:◦ A aB

◦ A a

Ou seja: ◦ P={A aX | A N, a T, X N {} }

G = ({A,B,C} ,{a,b,c},P,A)

A aB | aC | a

B bC

C cC | c

Autômato de Pilha

Toda Produção é da forma:◦ P = { | N e ≠}

Autômato de Pilha

Toda Produção é da forma:◦ P = { | N e ≠}

Do lado esquerdo da produção deve, sempre ocorrer um e apenas um não terminal e do lado direito pode ocorrer qualquer coisa exceto a sentença vazia.

Autômato de Pilha

Toda Produção é da forma:◦ P = { | N e ≠}

X abcS

S aSb

Do lado esquerdo da produção deve, sempre ocorrer um e apenas um não terminal e do lado direito pode ocorrer qualquer coisa exceto a sentença vazia.

Autômato Limitado Linearmente

Toda Produção é da forma:◦ P = { | || ≤ ||}

Autômato Limitado Linearmente

Toda Produção é da forma:◦ P = { | || ≤ ||}

O comprimento da forma sentencial do lado esquerdo deve ser menor ou igual à do lado direito.

Autômato Limitado Linearmente

Toda Produção é da forma:◦ P = { | || ≤ ||}

Do lado direito não é aceito a sentença vazia.

Autômato Limitado Linearmente

Toda Produção é da forma:◦ P = { | || ≤ ||}

Do lado direito não é aceito a sentença vazia.

X abcS

cS aSb

aSb acb

Ou Enumeráveis Recursivamente

Máquina de Turing

Toda Produção é da forma:◦ P = { | V+ e V*}

Ou Enumeráveis Recursivamente

Máquina de Turing

Toda Produção é da forma:◦ P = { | V+ e V*}

O lado esquerdo da produção pode haver uma sequencia quaisquer de símbolos, desde que entre eles haja um não terminal.

Ou Enumeráveis Recursivamente

Máquina de Turing

Toda Produção é da forma:◦ P = { | V+ e V*}

O lado direito da produção pode haver qualquer sequencia de símbolos, inclusive a sentença vazia.

Gramática Irrestrita ou Enumerável Recursivamente

Gramática Sensível ao Contexto

Gramática Livre de Contexto

Gramática Regular

Vamos estender as definições das gramáticas Tipo 1, 2 e 3 para permitir produções do tipo S , sendo S o símbolo inicial.

G = ({A,B,C} ,{a,b,c},P,A)

A aB | a

B bC

C cC | c

Vamos estender as definições das gramáticas Tipo 1, 2 e 3 para permitir produções do tipo S , sendo S o símbolo inicial.

G = ({A,B,C} ,{a,b,c},P,A)

A aB | a |

B bC

C cC | c

Vamos estender as definições das gramáticas Tipo 1, 2 e 3 para permitir produções do tipo S , sendo S o símbolo inicial.

Entretanto, isto só será possível se S não aparecer do lado direito de qualquer produção.

G = ({A,B,C} ,{a,b,c},P,A)

A aB | a |

B bC

C cC | c

Entretanto, isto só será possível se S não aparecer do lado direito de qualquer produção.

Desde modo, a regra S somente será utilizada para dar origem à sentença vazia.

G = ({A,B,C} ,{a,b,c},P,A)

A aB | a |

B bC

C cC | c

A gramática que possuir o símbolo inicial aparecendo do lado direito de regras de produção, deverá ser transformada em outra equivalente que obedeça a esta restrição.

G = ({A,B,C} ,{a,b,c},P,A)

A aB | a |

B bA

C cC | c

A aB abA ab

A gramática que possuir o símbolo inicial aparecendo do lado direito de regras de produção, deverá ser transformada em outra equivalente que obedeça a esta restrição.

Observação: gramáticas equivalentes devem gerar a mesma linguagem.

Quando for necessário transformar a gramática, deverá ser incluído um novo símbolo não-terminal (S’) que passará a ser o novo símbolo inicial, mais a regra S’.

G = ({A,B,C} ,{a,b,c},P,A)

A’ A |

A aB | a

B bA

C cC | c

Exemplo: Modificar a gramática abaixo de modo a incluir a sentença vazia.

G = { { S, A }, {a}, P, S }

P: S aA

A aS | a

Exemplo: Modificar a gramática abaixo de modo a incluir a sentença vazia.

G = { { S, A }, {a}, P, S }

P: S aA

A aS | a

G = { { S’, S, A }, {a}, P’, S’ }

P’: S’ S |

S aA

A aS | a

Aborda um conjunto mais amplo de linguagens.

Aborda um conjunto mais amplo de linguagens.

Com ela podemos tratar questões como as dos parênteses balanceados construções de blocos e estruturas, entre outras formalidades de linguagens de computação conhecidas.

Aborda um conjunto mais amplo de linguagens.

Com ela podemos tratar questões como as dos parênteses balanceados construções de blocos e estruturas, entre outras formalidades de linguagens de computação conhecidas.

É fundamental para o desenvolvimento de compiladores, pois a partir destas são desenvolvidos os analisadores sintáticos, parte de um compilador.

Podem ser estudadas abordando os seguintes formalismos:

◦ Gramática Livre de Contexto. Trata se de um gerador da linguagem. É uma gramática mais flexível em suas produções do que a gramática regular, porém ainda com certas restrições.

Podem ser estudadas abordando os seguintes formalismos.

◦ Gramática Livre de Contexto. Trata se de um gerador da linguagem.

◦ Autômato de Pilha. Trata se de um reconhecedor da linguagem, que consiste basicamente em um autômato finito não determinístico que utiliza uma pilha, que serve como memória adicional.

Classificamos uma gramática como sendo livre de contexto quando as regras de produção são todas na seguinte forma: P = { | N e }.

Classificamos uma gramática como sendo livre de contexto quando as regras de produção são todas na seguinte forma: P = { | N e }.

G1 = ({A,B}, {0,1,#}, {A 0A1 | B, B #} , A)

Classificamos uma gramática como sendo livre de contexto quando as regras de produção são todas na seguinte forma: P = { | N e }.

G1 = ({A,B}, {0,1,#}, {A 0A1 | B, B #} , A)

G2 = ({ S, A, B }, {a, b}, P, S )

Onde P é:

S aB | bA

A bAA | a | aS

B b | bS | aBB

Classificamos uma gramática como sendo livre de contexto quando as regras de produção são todas na seguinte forma: P = { | N e }.

G1 = ({A,B}, {0,1,#}, {A 0A1 | B, B #} , A)

G2 = ({ S, A, B }, {a, b}, P, S )

Onde P é:

S aB | bA

A bAA | a | aS

B b | bS | aBB

L(G2) é o conjunto de todas as palavras que tem o mesmo número de a’s e b’s.

As árvores de derivação são representações gráficas para as derivações nas GLC.

Através destas, temos representado explicitamente a estrutura hierárquica que está implícita na linguagem.

Formalmente, consideremos que G = (N, T, P, S) seja uma GLC.

Uma árvore é uma árvore de derivação para G se:

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

Uma árvore é uma árvore de derivação para G se:◦ O rótulo da raiz é S.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

Uma árvore é uma árvore de derivação para G se:◦ Se A1, A2, ..., An são descendentes diretos de A, da

esquerda para a direita, então A A1A2 ... An é uma produção de P.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

Uma árvore é uma árvore de derivação para G se:◦ Se um nó A tem um ou mais descendentes, então A

é um não terminal.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

S b A

Uma árvore é uma árvore de derivação para G se:◦ Todo nó tem um rótulo que é um símbolo de N T {}.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

S b Aa

Uma árvore é uma árvore de derivação para G se:◦ Se D é a única subárvore da raiz e tem rótulo ,

então a regra S P.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

S b Aa

b aa

S aAS aSbAS aabAS aabAa aabbaa

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

S b Aa

b aa

Definimos como profundidade da árvore de derivação o comprimento do maior caminho entre a raiz e um nó terminal. No exemplo, a árvore de derivação da sentença tem profundidade 3.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

S b Aa

b aa

Definimos como limite de uma árvore de derivação a seqüência formada pela concatenação, da esquerda para a direita, das folhas da árvore de derivação.

G = ( {S, A}, {a, b}, P, S )Onde P é:

S aAS | a

A SbA | SS | ba

S

a A S

S b Aa

b aa

Uma árvore de derivação ignora variações na ordem em que os símbolos foram substituídos na derivação.

G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

A sentença - (id * id) pode ser derivada de dois modos diferentes:

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

Derivação mais a esquerda

Derivação mais a direita

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

idid

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id id

E

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id id

E

- E

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id id

E

- E

( E )

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id id

E

- E

( E )

E + E

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id id

E

- E

( E )

E + E

id

E - E - ( E ) - ( E + E ) - ( id + E ) - ( id + id )

E - E - ( E ) - ( E + E ) - ( E + id ) - ( id + id )

E

- E

( E )

E + E

id id

E

- E

( E )

E + E

idid

Uma GLC é ambígua quando, para alguma sentença da linguagem gerada, existe mais de uma árvore de derivação.

Uma GLC é ambígua quando, para alguma sentença da linguagem gerada, existe mais de uma árvore de derivação.

G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id E * E

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id E * E

id id

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id E * E

id id

E

E * E

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id E * E

id id

E

E * E

E + E

id + id * id G = ({E}, {+, *, (, ), -, id}, P, E )

Onde P é:

E E + E | E * E | ( E ) | - E | id

E

E + E

id E * E

id id

E

E * E

E + E id

id id

A ambigüidade é muitas vezes não desejada em certas aplicações, por exemplo, em linguagens de programação.

Às vezes quando se tem uma gramática ambígua pode-se encontrar uma gramática equivalente não ambígua.

Porém algumas linguagens livres de contexto só podem gerar gramáticas ambíguas, essas linguagens são ditas linguagem inerentemente ambígua, por exemplo a linguagem L = { ai bj ck | i = j ou j = k}.

Muitas GLCs são a união de GLC mais simplificadas.

Muitas GLCs são a união de GLC mais simplificadas.

Se for possível dividir a LLC em pedaços mais fáceis de serem construídos, então construa a gramática de cada pedaço individualmente e depois faça a união destes.

Muitas GLCs são a união de GLC mais simplificadas.

Se for possível dividir a LLC em pedaços mais fáceis de serem construídos, então construa a gramática de cada pedaço individualmente e depois faça a união destes.

Para isto basta colocar todas as regras juntas e inserir uma nova produção que passará a conter o símbolo de partida derivando todos os símbolos de partida das gramáticas individuais.

Exemplo: L(M) = {0n1n n 0} {1n0n n 0}

G1 = ({S1}, {0,1}, { S1 0S11}, S1)

G2 = ({S2}, {0,1}, { S2 1S20}, S2)

Juntando as duas temos:

G = ({S, S1, S2}, {0,1}, P, S)

Onde P é:

S S1 S2

S1 0S11

S2 1S10

Se a linguagem é regular, construa primeiro o AF e o converta em uma gramática.

Algumas LLC contêm duas subpalavras que são “ligadas”, no sentido que a máquina precisa lembrar de determinada informação a respeito da primeira subpalavra para poder verificar a escrita da segunda subpalavra.

Por exemplo, a linguagem {0n1n n 0}

G1 = ({S1}, {0,1}, { S1 0S11}, S1)

Algumas LLC podem conter estruturas que aparecem recursivamente como parte de outras estruturas.

Um exemplo são as gramáticas que geram expressões aritméticas.