Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

35
Exerc´ ıcios de apoio ` as aulas te´oricas de Processamento de Linguagens ESTiG - IPB Maria Jo˜ao Tinoco Varanda Pereira Fevereiro 2006

Transcript of Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Page 1: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Exercıcios de apoio as aulas teoricas de

Processamento de Linguagens

ESTiG - IPB

Maria Joao Tinoco Varanda Pereira

Fevereiro 2006

Page 2: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2

Page 3: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Conteudo

1 Exercıcios teoricos sobre o Reconhecimento de Linguagens 7

1.1 Questoes teoricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2 Reconhecimento de Linguagens Regulares (Gramaticas e Expressoes Regulares) . . . . . . 81.3 Reconhecimento de Linguagens Nao-Regulares . . . . . . . . . . . . . . . . . . . . . . . . 13

1.3.1 Parsing Top-Down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.3.2 Parsing Bottom-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2 Traducao de Linguagens 21

2.1 Traducao Dirigida pela Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.1.1 Construcao do Tradutor Passo a Passo . . . . . . . . . . . . . . . . . . . . . . . . . 222.1.2 Gramatica Independente de Contexto . . . . . . . . . . . . . . . . . . . . . . . . . 232.1.3 Gramatica Tradutora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.1.4 Geracao do Processador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.1.5 Teste ao Processador Gerado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.2 Traducao Dirigida pela Semantica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3

Page 4: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CONTEUDO

4

Page 5: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Introducao

Este documento pretende servir de apoio as aulas teoricas de Processamento de Linguagens. Esta disci-plina e leccionada ao 2o ano de Engenharia Informatica e tem por objectivo introduzir conceitos relaciona-dos com a concepcao, especificacao e processamento de linguagens assim como mostrar varias abordagense ferramentas de construcao de compiladores.O exercıcios apresentados no primeiro capıtulo dizem respeito a parte da materia sobre reconhecimentode linguagens (regulares e nao regulares). No segundo capıtulo e apresentado um exercıcio mais praticocom o objectivo de explicar a segunda parte da materia: traducao de linguagens.

5

Page 6: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CONTEUDO

6

Page 7: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Capıtulo 1

Exercıcios teoricos sobre oReconhecimento de Linguagens

A resolucao dos exercıcios propostos neste capıtulo permitira a consolidacao dos conhecimento teoricos deprocessamento de linguagens. Este capıtulo esta dividido em tres seccoes que correspondem as diferentespartes da materia a leccionar: conceitos teoricos; reconhecimento de linguagens regulares; reconhecimentode linguagens nao-regulares.

1.1 Questoes teoricas

1. Explique a diferenca entre linguagens formais e linguagens naturais no contexto do Processamentode Linguagens (P02(1)).

2. Defina Especificacao de uma Linguagem (o que e, para que serve, como se faz, que resultadosproduz) (P99(1)v).

3. Relacione processadores, compiladores e interpretadores de linguagens em termos de objectivos,tarefas e aplicacoes (S99(1)).

4. De exemplos de aplicacao de um processador de linguagens e indique quais as suas principais tarefas(fases de processamento) (R99(1)).

5. Explique a diferenca entre tradutor e reconhecedor e como pode ser implementado um tradutorcom base num reconhecedor (S02(1)).

6. Explique que tipos de reconhecedores podem ser implementados e como varia a sua implementacaoquando se trata de linguagens regulares ou nao regulares (R02(1)).

7. Analise a veracidade das seguintes afirmacoes e justifique, em cada uma delas, a sua resposta(P03(1)):

(a) ”Uma gramatica independente de contexto contem apenas um sımbolo nao-terminal no ladoesquerdo de cada producao”.

(b) ”O reconhecimento de linguagens regulares e feito atraves de automatos finitos nao deter-minısticos”.

(c) ”A traducao dirigida pela sintaxe e implementada a custa de accoes semanticas associadas agramatica independente de contexto”.

8. Analise a veracidade das seguintes afirmacoes e justifique, em cada uma delas, a sua resposta(S03(1)):

7

Page 8: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

(a) ”Uma gramatica e ambıgua quando apresenta mais do que um caminho possıvel para reconhe-cimento de uma frase”-

(b) ”Os automatos finitos reactivos sao usados para implementar conversores e reconhecedores”.

(c) ”Um reconhecedor top-down dirigido por tabela so e aplicado a linguagens regulares”.

9. Analise a veracidade das seguintes afirmacoes e justifique, em cada uma delas, a sua resposta(R03(1)):

(a) ”Uma arvore de derivacao representa todas as producoes da gramatica da linguagem”.

(b) ”Um automato finito determinıstico pode ter mais do que um estado final”.

(c) ”E possıvel construir um reconhecedor bottom-up para qualquer gramatica independente decontexto”.

1.2 Reconhecimento de Linguagens Regulares (Gramaticas eExpressoes Regulares)

1. Considere as seguintes expressoes regulares (P99(1)):

e1 = a + (ab)∗ + b e2= (s+t)(s+t)

(a) Escreva uma gramatica que represente as frases pertencentes a linguagem subjacente a cadauma destas expressoes regulares.

(b) Desenhe o automato finito nao determinıstico de cada uma das linguagens.

(c) De exemplos de frases pertencentes a cada uma das linguagens.

2. Considere as seguintes expressoes regulares (S99(1)):

e1= a+b+ e2 = ab?c?

(a) Escreva uma gramatica que represente as frases pertencentes a linguagem subjacente a cadauma destas expressoes regulares.

(b) Desenhe o automato finito nao determinıstico de cada uma das linguagens.

(c) De exemplos de frases pertencentes a cada uma das linguagens.

3. Considere as seguintes expressoes regulares (R99(1)):

e1= (ab|cd+)? e2= [1-12][ABC]

(a) Escreva uma gramatica que represente as frases pertencentes a linguagem subjacente a cadauma destas expressoes regulares.

(b) Desenhe o automato finito nao determinıstico de cada uma das linguagens.

(c) De exemplos de frases pertencentes a cada uma das linguagens.

4. Considere a seguinte expressao regular (P02(1)):

(a∗b∗cd) + d+e

(a) Escreva uma gramatica que represente as frases da linguagem subjacente a esta expressaoregular.

(b) De exemplos de duas frases pertencentes a linguagem e construa as respectivas arvores dederivacao.

5. Considere o automato de estados finitos da figura 1.1 (S02(1)):

(a) Escreva uma gramatica que represente as frases pertencentes a linguagem reconhecida por esteautomato.

8

Page 9: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

1.2. RECONHECIMENTO DE LINGUAGENS REGULARES (GRAMATICAS E EXPRESSOESREGULARES)

b c a

a

a

a

A B D E

C

Figura 1.1: Automato de estados finitos

(b) Escreva uma expressao regular que tambem represente esta linguagem.

(c) Transforme este automato num automato finito determinıstico.

(d) De exemplos de frases pertencentes a esta linguagem.

6. Considere uma gramatica G=(T,N,S,P), com T={a,b,c}, N={S,A,B} e com as seguintes producoes(R02(1)v):

S -> A | bB

A -> aA | ac

B -> Bc | Ab

(a) Escreva um expressao regular equivalente a esta gramatica.

(b) Transforme-a numa gramatica regular a direita.

(c) De exemplos de frases pertencentes a esta linguagem.

(d) Construa um automato finito nao determinıstico da gramatica construıda na alınea b).

7. Considere a seguinte expressao regular (P03(1)v): (a + b)?(b + c)?c∗

(a) Escreva uma gramatica regular a direita que represente a mesma linguagem.

(b) De dois exemplos de duas frases pertencentes a linguagem e construa as respectivas arvores dederivacao.

(c) A expressao (a+b+c)?c* e equivalente? Justifique dando exemplos de frases.

(d) Desenhe um automato finito determinıstico para reconhecimento desta linguagem.

8. Considere a seguinte expressao regular (S03(2)):

(00 + 01)∗((01 + 10)(00 + 11))∗

(a) Mostre dois exemplos de frases pertencentes a esta linguagem e respectivas arvores de de-rivacao.

(b) Transforme-a numa gramatica independente de contexto.

(c) Construa um automato finito nao determinıstico da gramatica.

(d) Considerando apenas parte da expressao regular (00 + 01)∗ construa o automato finito deter-minıstico dessa linguagem.

9. Considere o automato de estados finitos da figura 1.2 (R03(1)v):

9

Page 10: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

‘ - ‘

‘/’

‘*’

‘ ) ’

‘,’

‘ + ’ in t

‘ ( ‘

S A B C D

Figura 1.2: Automato de estados finitos

(a) Escreva uma gramatica regular a direita que represente as frases pertencentes a linguagemreconhecida por este automato.

(b) Escreva uma expressao regular que tambem represente esta linguagem.

(c) De dois exemplos de frases pertencentes a esta linguagem e respectivas arvores de derivacao.

(d) Construa o grafo de sintaxe da linguagem.

10. Considere as seguintes expressoes (P04(1)):

expr1 = a+b∗c expr2 = aa?c

(a) Escreva uma gramatica regular a direita que represente as frases pertencentes a linguagemrepresentada por expr1.

(b) Escreva uma gramatica regular a esquerda que represente as frases pertencentes a linguagemrepresentada por expr2.

(c) Prove que todas as frases formadas pela expr2 pertencem a linguagem representada por expr1.

(d) Indique dois exemplos de frases que pertencem a expr1 e nao a expr2.

(e) Construa o automato finito determinıstico da linguagem representada por expr1.

11. Considere as seguintes expressoes (S04(1)):

expr1 = (x + y)+zw∗ expr2 = x+y+zw∗

(a) Indique se expr1 e equivalente a expr2 e justifique a sua resposta com exemplos.

(b) Escreva uma gramatica simplesmente regular a direita que represente as frases pertencentes alinguagem representada por expr1.

(c) Construa o automato finito determinıstico e o grafo de sintaxe da linguagem representada porexpr1.

(d) Escreva uma gramatica regular a esquerda que represente as frases pertencentes a linguagemrepresentada por expr2.

(e) A qual das linguagens pertence a frase xxyyz ? Justifique.

12. Considere o automato finito da figura 1.3 (R04(1) e R04(3)):

(a) Escreva a expressao regular definida por este automato finito.

(b) Escreva uma gramatica independente de contexto que represente as frases pertencentes a lin-guagem.

(c) De dois exemplos de frases pertencentes a linguagem e justifique a sua resposta.

(d) Transforme o automato num automato finito determinıstico.

(e) Escreva uma gramatica regular a direita representativa da linguagem da expressao regularseguinte:(a + b + ... + z)+(?+!)(?+! + ǫ)

10

Page 11: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

1.2. RECONHECIMENTO DE LINGUAGENS REGULARES (GRAMATICAS E EXPRESSOESREGULARES)

A

I

D B E

F G H N

J K L M

O

q

u a n d

q u

o

a l !

o

o

P P ? ?

c

m

! e

e

Figura 1.3: Automato de estados finitos

13. Responda as seguintes questoes (P05(1)):

(a) Escreva uma expressao regular de uma linguagem cujas strings comecam e terminam por b.

(b) Considere uma linguagem definida pela seguinte expressao regular ab∗c(a + b)c

(c) Indique tres frases pertencentes a essa linguagem.

(d) Escreva uma gramatica regular a direita para a mesma linguagem.

(e) Construa o automato finito determinıstico desta linguagem.

14. Considere uma gramatica independente de contexto G1=(T1,N1,S1,P1), com T1={a,b,c}, N1={S,B,C}e com as seguintes producoes (P05(1)):

S -> aBCS

S -> abC

B -> bB|b

C -> cC|

(a) Mostre dois exemplos de frases pertencentes a esta linguagem e prove-o com as respectivasarvores de derivacao.

(b) Apresente uma expressao regular equivalente.

(c) Transforme-a numa gramatica regular a direita.

(d) Construa um automato finito nao determinıstico da linguagem.

15. Considere a seguinte expressao regular (S05(1)): (12)∗(5|8)(3)+

(a) Qual o vocabulario desta linguagem?

(b) De quatro exemplos de frases pertencentes a esta linguagem.

(c) Construa uma gramatica regular direita para esta linguagem.

(d) Construa o automato finito nao determinıstico para reconhecimento de frases pertencentes aesta linguagem

16. Considere uma gramatica independente de contexto G1=(T1,N1,S1,P1), com T1={c,d,f}, N1={S,A}e com as seguintes producoes (S05(1)v):

S -> A | dS

A -> cA | f

(a) Escreva uma expressao regular equivalente a gramatica.

(b) Transforme-a numa gramatica regular a esquerda.

(c) Construa um automato finito determinıstico da gramatica.

11

Page 12: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

17. Considere a seguinte expressao regular #(0|1|2|3|4|5|6|7|8|9)+# que representa codigos secretos eresponda as seguintes questoes (R05(1)):

(a) Construa uma gramatica independente de contexto equivalente.

(b) Construa um automato finito determinıstico para esta linguagem.

(c) Modifique a expressao regular de forma a garantir que cada codigo e constituıdo exactamentepor 4 algarismos para alem dos #s.

(d) Modifique a expressao regular de modo a permitir que o codigo possa conter tambem letrasminusculas e maiusculas.

18. Considere uma gramatica independente de contexto G1=(T1,N1,S1,P1), com T1={a,b,d,e,g}, N1={S,B,C}e com as seguintes producoes (R05(1)):

S -> Ba | bC

B -> d | eB

C -> gC | g

(a) Mostre dois exemplos de frases pertencentes a esta linguagem e respectivas arvores de de-rivacao.

(b) Transforme-a numa gramatica regular a direita.

(c) Construa um automato finito determinıstico da gramatica.

19. Considere a seguinte gramatica G=(T,N,S,P) com T={a,b}, N={S,A} e cujas producoes sao asseguintes (P99(1)):

S -> A | aS | bA

A -> ab | abA | baS

(a) Transforme-a numa gramatica simplesmente regular a direita.

(b) Construa o automato finito nao determinıstico

(c) Transforma o automato nao determinıstico em determinıstico.

20. Considere a seguinte gramatica G=(T,N,S,P) com T={a,b}, N={S,A,B} e cujas producoes sao asseguintes (S99(1)):

S -> aaA | abB

A -> | bB

B -> a | aA

(a) Transforme-a numa gramatica simplesmente regular a direita.

(b) Construa o automato finito nao determinıstico

(c) Transforma o automato nao determinıstico em determinıstico.

21. Considere a seguinte gramatica G=(T,N,S,P) com T={a,b}, N={S,A} e cujas producoes sao asseguintes (R99(1)):

S -> abS | aA |

A -> b | aA |

(a) Transforme-a numa gramatica simplesmente regular a direita.

(b) Construa o automato finito nao determinıstico

(c) Transforma o automato nao determinıstico em determinıstico.

12

Page 13: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

1.3. RECONHECIMENTO DE LINGUAGENS NAO-REGULARES

22. Considere uma gramatica G=(T,N,S,P) com T={a,b}, N={S,A,B} e cujas producoes sao as seguin-tes (P02(1)v):

S -> a | bB | bA

A -> b | aS

B -> abaA | A

(a) Transforme-a numa gramatica simplesmente regular a direita.

(b) Construa o automato finito nao determinıstico

(c) Transforme o automato nao determinıstico em determinıstico.

1.3 Reconhecimento de Linguagens Nao-Regulares

1.3.1 Parsing Top-Down

1. Considere uma gramatica G=(T,N,S,P), T={a,b}, N={S,A,B} e com as seguintes producoes (S02(1)v):

S -> aA | bB

A -> a | b

B -> a

Implemente em linguagem algorıtmica um Reconhecedor Top-Down Recursivo Descendente paraesta linguagem.

2. Considere uma gramatica G=(T,N,S,P), com T={a,b}, N={S,A,B} e com as seguintes producoes(R02(2)):

S -> a | bA | bB

A -> aBb | B

B -> b | ab

(a) Transforme-a numa gramatica simplesmente regular a direita.

(b) Construa o grafo de sintaxe desta linguagem

(c) Esta gramatica verifica a condicao LL(1)? Justifique.

3. Considere uma gramatica G=(T,N,S,P) com T={a,b}, N={S,A,B} e cujas producoes sao as seguin-tes (P03(2)):

S -> aBb | bAa

A -> aA |

B -> bB |

(a) Verifique se a gramatica satisfaz a condicao LL(1). Se nao satisfaz, transforme-a de modo apoder ser construıdo um reconhecedor Top-Down para a linguagem.

(b) Preencha a tabela de parsing necessaria para efectuar esse reconhecimento.

(c) Simule o reconhecimento da frase µ=baaa indicando o estado da stack de parsing ao longo doprocesso.

(d) Construa um grafo de sintaxe que represente a gramatica em causa.

4. Considere uma gramatica G=(T,N,S,P), com T={a,b}, N={S,A} e com as seguintes producoes(S03(3)):

13

Page 14: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

S -> AA

A -> aA | b

(a) Escreva uma expressao regular equivalente.

(b) Esta gramatica verifica a condicao LL(1)? Justifique.

(c) Construa a tabela de parsing e verifique se a frase µ=aabb pertence ou nao a linguagemdefinida pela gramatica, mostrando o estado da stack de parsing durante o reconhecimento.

(d) Transforme-a numa gramatica simplesmente regular a direita

5. Considere uma gramatica G1=(T,N,S,P), T1={a,b,c}, N1={S,A,C} e com as seguintes producoes(R03(2)):

S -> aAb | C

A -> aA |

C -> cC | b

(a) Indique uma expressao regular que represente a linguagem desta gramatica.

(b) Verifique se satisfaz a condicao LL(1). Justifique a sua resposta.

(c) Implemente em linguagem algorıtmica um Reconhecedor Top-Down Recursivo Descendentepara esta linguagem.

(d) Transforme a gramatica numa gramatica regular a direita

6. Pretende-se desenvolver um reconhecedor Top-Down para a seguinte gramatica nao regular (P99(1)v):

S -> | aA

A -> bBc | cBd | ac

B -> | a

(a) Verifique se a gramatica satisfaz a condicao LL(1).

(b) Construa um grafo de sintaxe que represente esta gramatica.

(c) Construa uma tabela de parsing e verifique se a frase µ=acad pertence ou nao a linguagemdefinida pela gramatica.

7. Pretende-se desenvolver um reconhecedor Top-Down para a seguinte gramatica (S99(1)v):

S -> aA | baB

A -> bA | C | ac

B -> cC | d

C -> c

(a) Verifique se a gramatica satisfaz a condicao LL(1).

(b) Construa um grafo de sintaxe que represente esta gramatica.

(c) Construa uma tabela de parsing e verifique se a frase µ=abac pertence ou nao a linguagemdefinida pela gramatica.

8. Pretende-se desenvolver um reconhecedor Top-Down para a seguinte gramatica nao regular (R99(1)v):

S -> Aaa | bbB

A -> | bB

B -> a | Aa

(a) Verifique se a gramatica satisfaz a condicao LL(1).

14

Page 15: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

1.3. RECONHECIMENTO DE LINGUAGENS NAO-REGULARES

(b) Construa um grafo de sintaxe que represente esta gramatica ( um grafo para cada nao-terminal).

(c) Construa uma tabela de parsing e verifique se a frase µ=bbba pertence ou nao a linguagemdefinida pela gramatica.

9. Pretende-se desenvolver um reconhecedor Top-Down para uma gramatica nao regular, com as se-guintes producoes (P02(2)):

S -> aAb | bB | cS

A -> aA |

B -> b | cB

(a) Verifique se a gramatica satisfaz a condicao LL(1).

(b) Construa um grafo de sintaxe que represente esta gramatica.

(c) Construa a tabela de parsing e verifique se a frase µ=bccb pertence ou nao a linguagem definidapela gramatica, mostrando o estado da stack de parsing ao longo do reconhecimento.

10. Considere uma gramatica G=(T,N,S,P), com T={1,2,3}, N={S,A,B} e cujas producoes sao asseguintes (S02(2)):

S -> A1 | B

A -> A1 |

B -> 23 | 1

(a) Escreva uma expressao regular equivalente a esta gramatica.

(b) Mostre que a gramatica e ambıgua e que nao satisfaz a condicao LL(1).

(c) Reescreva a gramatica transformando-a numa gramatica regular a direita.

11. Pretende-se desenvolver um reconhecedor Top-Down para uma gramatica nao regular, com as se-guintes producoes (R02(2)v):

S -> aAa | B

A -> cB

B -> cB | d

(a) Verifique se a gramatica satisfaz a condicao LL(1).

(b) Construa a tabela de parsing e verifique se a frase µ=acda pertence ou nao a linguagem definidapela gramatica, mostrando o estado da stack de parsing durante o reconhecimento.

12. Considere as gramaticas G1 e G2, T1={a,b}, N1={S,A,B} e T2={a,b}, N2={S,A,B,C}, com asseguintes producoes (P04(1)v):

G1 G2

S -> aaAb | abB S -> aC

A -> aA | C -> aAb | bbB

B -> bB | b A -> aA |

B -> bB |

(a) Prove que estas gramaticas representam a mesma linguagem, indicando uma expressao regularequivalente as duas que represente essa linguagem.

(b) Qual das gramaticas satisfaz a condicao LL(1)? Justifique a sua resposta.

(c) Construa a tabela de parsing que permite reconhecer frases desta linguagem.

15

Page 16: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

(d) Mostre o estado da stack de parsing ao longo do reconhecimento da frase abbb.

(e) Construa um algoritmo de reconhecimento recursivo descendente para a linguagem represen-tada por G2.

13. Considere as gramaticas G1 e G2, T1={a,b,c}, N1={S,A,B} e T2={a,b,c}, N2={S,A,B,C}, com asseguintes producoes (S04(1)v):

G1 G2

S -> abA | aBc S -> aCB | bAc

A -> aA | A -> aA |

B -> Bb | B -> bB | c

C -> ac |

(a) Efectue as transformacoes necessarias para que a gramatica G1 verifique a condicao LL(1).Justifique.

(b) De dois exemplos de frases pertencentes as duas gramaticas G1 e G2.

(c) Prove que a gramatica G2 satisfaz a condicao LL(1).

(d) Construa a tabela de parsing para reconhecimento Top-Down da linguagem representada porG2.

(e) Mostre o estado da stack de parsing ao longo do reconhecimento da frase baac.

14. Considere as gramaticas G1 e G2, T1={a,b}, N1={S,A} e T2={a,b}, N2={S,A,B}, com as seguintesproducoes (R04(2)):

G1 G2

S -> abA | Sb S -> abAB

A -> aA | A -> aA |

B -> bB |

(a) Prove que as duas gramaticas sao equivalentes calculando a expressao regular que as podesubstituir.

(b) Transform G1 numa gramatica regular a direita

(c) Prove que a gramatica G2 satisfaz a condicao LL(1).

(d) Construa a tabela de parsing para reconhecimento Top-Down da linguagem representada porG2.

(e) Mostre o estado da stack de parsing ao longo do reconhecimento da frase abaa.

15. Considere a gramatica G2=(T2,N2,S2,P2), com T2={c,d,e,f}, N2={A}, S2=A e com as seguintesproducoes (P05(2)):

A -> Ac | Ad | e | f

(a) Escreva uma expressao regular equivalente.

(b) Modifique a gramatica de modo a verificar a condicao LL(1). Prove que a nova gramaticaverifica essa condicao.

(c) Construa a tabela de parsing e verifique se a frase µ=fcdcd pertence ou nao a linguagemdefinida pela gramatica, mostrando o estado da stack de parsing durante o reconhecimento.

16

Page 17: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

1.3. RECONHECIMENTO DE LINGUAGENS NAO-REGULARES

(d) Implemente em linguagem algorıtmica um reconhecedor recursivo descendente para esta lin-guagem

16. Considere uma gramatica G2=(T2,N2,S,P2), com T2={b,c,d,e}, N2={S,A} e com as seguintesproducoes (S05(2)):

S -> ee | bAc | bAe

A -> d | cA

(a) Escreva uma expressao regular equivalente a esta gramatica.

(b) Esta gramatica verifica a condicao LL(1)? Se nao verificar modifique a gramatica de modo asatisfazer essa condicao.

(c) Construa a tabela de parsing e verifique se a frase µ=bdee pertence ou nao a linguagem definidapela gramatica, mostrando o estado da stack de parsing durante o reconhecimento.

(d) Construa o grafo de sintaxe desta linguagem.

17. Considere uma gramatica G2=(T2,N2,S,P2), com T2={b,c,d}, N2={S,A,B} e com as seguintesproducoes (R05(1)v):

S -> bA | c

A -> dBd | c

B -> cB | c

(a) Escreva uma expressao regular equivalente.

(b) Esta gramatica verifica a condicao LL(1)? Se nao verificar modifique a gramatica de modo asatisfazer essa condicao.

(c) Construa a tabela de parsing e verifique se a frase m=bdcd pertence ou nao a linguagemdefinida pela gramatica, mostrando o estado da stack de parsing durante o reconhecimento.

(d) Construa o grafo de sintaxe e implemente um algoritmo recursivo descendente que reconhecaesta linguagem.

1.3.2 Parsing Bottom-Up

1. Considere a seguinte gramatica (P99(2)):

Z -> S$

S -> AaAb | BaBa

A ->

B -> | c

Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para a lin-guagem definida por esta gramatica.

2. Considere a seguinte gramatica (S99(2)):

Z -> S$

S -> a | aSbb

Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para a lin-guagem definida por esta gramatica.

3. Considere a seguinte gramatica (R99(2)):

17

Page 18: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

Z -> S$

S -> L = R | R

L -> * R | id

R -> L

Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para a lin-guagem definida por esta gramatica.

4. Considere uma gramatica G=(T,N,S,P) com T={a,b,c}, N={S,X,Y} e as seguintes producoes(P02(2)v):

S’-> S$

S -> Xa

S -> Y

X -> Xa

X ->

Y -> bc

Y -> a

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Para reconhecer a frase µ=aaa, indique quais os estados do automato pelos quais passa oreconhecedor.

5. Considere uma gramatica G=(T,N,S,P), com T={x,y}, N={S,A,B} e com as seguintes producoes(S02(2)):

S’-> S$

S -> A

A -> AB | x

B -> yB | y

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Indique quais os estados do automato que irao ser percorridos pelo reconhecedor para reco-nhecer a frase µ=xyyy.

6. Considere uma gramatica G=(T,N,S,P), com T={a,b,d,e,f,g}, N={S,A,B} e cujas producoes saoas seguintes (R02(3)):

S’-> S$

S -> Aa | bB

A -> d | eAf

B -> gB | g

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=edfa.

7. Considere uma gramatica G=(T,N,S,P) com T={a,b}, N={S,A,B} e as seguintes producoes (P03(2)v):

S’-> S$

S -> aAB

S -> aB

18

Page 19: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

1.3. RECONHECIMENTO DE LINGUAGENS NAO-REGULARES

A -> aB

A -> b

B -> bB

B ->

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Construa a tabela de parsing para o reconhecimento Bottom-Up.

(c) Para reconhecer a frase µ=aab, indique quais os estados do automato pelos quais passa oreconhecedor.

8. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramatica nao regular, com asseguintes producoes (S03(4)):

S -> aSbS | bSaS |

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Construa a tabela de accoes (pertencente a tabela de transicoes) para efectuar o reconhecimentodesta linguagem.

(c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=abba.

9. Considere uma gramatica G=(T,N,S,P), com T={a,b}, N={S,A} e cujas producoes sao as seguintes(R03(3)):

S -> AS | b

A -> aA | b

(a) Construa o automato LR(0) para reconhecimento bottom-up da linguagem descrita por estagramatica.

(b) Construa a tabela de accoes para esse reconhecedor.

(c) Indique os passos para o reconhecimento da frase aabb.

10. Considere uma gramatica G=(T,N,S,P), com T={a,b}, N={S,A,B} e cujas producoes sao as se-guintes (P04(2)):

S-> S$

S -> aAaB

A -> Ab | b

B -> a | b

(a) Construa o automato LR(0) para reconhecimento bottom-up da linguagem descrita por estagramatica.

(b) Construa a tabela de accoes para esse reconhecedor.

(c) Indique os passos para o reconhecimento da frase abaa.

11. Considere uma gramatica G=(T,N,S,P), com T={0,1}, N={S,A,B} e cujas producoes sao as se-guintes (S04(3)):

S’-> S$

S -> 1A0B

A -> 1A0 |

B -> 0B1 |

19

Page 20: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 1. EXERCICIOS TEORICOS SOBRE O RECONHECIMENTO DE LINGUAGENS

(a) Construa o automato LR(0) para reconhecimento bottom-up da linguagem descrita por estagramatica.

(b) Construa a tabela de accoes para esse reconhecedor.

(c) Indique os passos para o reconhecimento da frase 1100.

12. Considere uma gramatica G=(T,N,S,P), com T={x,y,z}, N={S,Y,Z} e cujas producoes sao asseguintes (R04(2)v e R04(1)v):

S’-> S$

S -> xYZ | xZY

Y -> yY |

Z -> zZ | x

(a) Construa o automato LR(0) para reconhecimento bottom-up da linguagem descrita por estagramatica.

(b) Construa a tabela de accoes para esse reconhecedor e indique os passos para o reconhecimentoda frase xyyyx.

(c) Construa o grafo de sintaxe desta linguagem.

13. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramatica nao regular, com asseguintes producoes (P05(2)v):

S -> aSa | bSb | c

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Construa a tabela de accoes para efectuar o reconhecimento desta linguagem.

(c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=bbcbb

14. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramatica nao regular, com asseguintes producoes (S05(3)):

S -> aSb | b | cS | ae

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Construa a tabela de accoes e a tabela de transicoes para efectuar o reconhecimento destalinguagem.

(c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=accaed

15. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramatica nao regular, com asseguintes producoes (R05(2)):

S -> if E then S

| if E then S else S

| a

| b

E -> x | y

(a) Construa um automato LR(0) que permita implementar um reconhecedor Bottom-Up para alinguagem definida por esta gramatica.

(b) Construa a tabela de accoes para efectuar o reconhecimento desta linguagem.

(c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=if x then a

20

Page 21: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Capıtulo 2

Traducao de Linguagens

No capıtulo anterior foram apresentados exercıcios sobre o reconhecimento sintactico de linguagens. Noentanto, para alem de verificar se o texto submetido a um processador faz parte da linguagem, umdos objectivos dos compiladores e a traducao do texto para outra linguagem. A traducao pode serimplementada usando duas estrategias diferentes: Traducao Dirigida pela Sintaxe e a Traducao Dirigidapela Semantica.

Para ilustrar a diferenca entre as duas vai ser resolvido o mesmo problema usando os dois tipos detraducao.Enunciado

A Orientacao, na sua variante pedestre, e um desporto com grande desenvolvimento em Portugal. Basi-camente, um atleta recebe um mapa que tem um percurso desenhado; nesse percurso, ha uma serie depontos quentes assinalados que o atleta tera que visitar pela ordem em que estao numerados; no fim dopercurso, quando retorna ao ponto de partida, e classificado em funcao do numero de pontos visitados edo tempo gasto.Em cada prova os concorrentes sao agrupados em escaloes etarios, aos quais correspondempercursos diferentes.

Para ajuda a organizacao de provas pretende-se desenvolver um sistema que permita definir uma provaatraves da especificacao da lista de percursos (cada percurso sera, por sua vez, uma lista de pontos quen-tes) que a compoem, de modo a que se possa calcular o comprimento de cada um e visualizar os trajectos.

Para resolver este problema pretende-se que: defina uma linguagem para descrever os percursos de umaprova; e que desenvolva um processador que calcule o comprimento de cada percurso e gere instrucoes emGraphViz para desenhar os percursos. Essas instrucoes serao posteriormente usadas pelo interpretadorde GraphViz para desenhar o grafo que modela os varios percursos da prova.A linguagem pedida deve permitir que se comece por identificar todos os pontos quentes do terreno ondea prova vai decorrer, sendo que cada ponto sera identificado por uma sigla e pelas suas duas coordenadascartesianas. Depois a linguagem servira para definir cada percurso, indicando o seu nome, o escalao etarioa que se destina e a lista de pontos (referidos pelas respectivas siglas) que o compoem. Esta lista e quedetermina a ordem de visita.Na subseccao 2.1.5, onde se testa o programa desenvolvido, esta um exemplo de um texto-fonte (ficheirode entrada), do ficheiro de saıda gerado com os comandos dot e da respectiva visualizacao criada peloGraphViz.

Analise do enunciado e Estrategia de desenvolvimento

Visto que se pretende, como explicitado no enunciado, definir uma linguagem para planeamento de provasde orientacao, e obvio que o programa a desenvolver para resolucao deste problema e um processador delinguagens. O processador em causa pode e deve ter uma dupla tarefa:

• por um lado, efectuar o calculo do comprimento de cada percurso a partir das coordenadas carte-sianas dos pontos quentes. Recorde-se que a distancia entre dois pontos pode ser calculada pela

21

Page 22: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

formula:dist =

|y2 − y1|2 + |x2 − x1|2

• por outro lado, gerar um texto de saıda, numa linguagem especıfica (dot), capaz de ser interpretadopor um gerador automatico de desenhos (GraphViz).

O desenvolvimento do programa consiste na criacao de uma gramatica representativa da linguagem fontepedida e na definicao de accoes que se associarao a gramatica de modo a produzir os dois resultadosenumerados acima.

2.1 Traducao Dirigida pela Sintaxe

A Traducao Dirigida pela Sintaxe baseia-se nas regras sintacticas, ou seja, as frases do texto de saıda saoconstruıdas a medida que sao efectuadas as derivacoes pelas producoes da gramatica durante o reconhe-cimento do texto fonte. E entao implementada uma Gramatica Tradutora cujas sımbolos terminais sedividem agora em sımbolos de entrada e sımbolos de accoes.Esta abordagem pode ser implementada usando ferramentas como o LEX/YACC. Uma gramatica tra-

dutora que e criada em duas fases: escrita da gramatica independente de contexto (seguindo o formatodos dados de entrada)–seccao 2.1.2; e especificacao de um conjunto de accoes que extraem informacao dotexto fonte com o objectivo de produzir os resultados esperados–seccao 2.1.3.

2.1.1 Construcao do Tradutor Passo a Passo

Identificacao da Estrutura dos Dados de Entrada

Analisar um exemplo de texto fonte ajuda a compreender os objectos de processamento envolvidos. Otexto fonte tem que definir pontos e percursos tal como o enunciado indica. Um exemplo podera ser:

A(3,5)

B(4,2)

C(5,5)

D(9,9)

E(5,15)

passeio (>10) (A,B,C)

caminhada (>20) (A,C,B,D)

todoterreno (>20) (A,E,C,D,B)

Existem claramente dois objectos de processamento distintos: pontos e percursos. Cada linha de textodefine um ponto ou um percurso. Para identificar univocamente os pontos e usada uma letra maiuscula,indicando-se para cada um a sua localizacao atraves de um par de coordenadas como localizacao. Adefinicao de cada percurso e constituıda por um nome (uma palavra), a faixa etaria (idade a partir daqual se pode efectuar a prova) e uma lista de pontos (apenas representados pelo respectivo identificador(letra maiuscula)) que define o percurso propriamente dito.

Identificacao dos Resultados a obter com o processamento

O resultado final pretendido e um desenho do grafo representativo de todos os percursos; e, tambem,pedida a distancia total de cada percurso.Para tal, a primeira tarefa e verificar a informacao necessaria para gerar essa saıda. Muitas vezes essainformacao nao e extraıda directamente do texto fonte sendo necessario efectuar calculos preliminares.Neste caso, o grafo devera indicar a distancia entre pontos e essa informacao deve ser calculada combase nos pontos do percurso e antes de ser gerada a saıda. O desenho produzido distingue tambem ospercursos usando etiquetas e mostra informacao relativa a cada troco.Para gerar este tipo de saıda e para efectuar os calculos sera necessario que a informacao sobre ascoordenadas dos pontos seja posta numa estrutura auxiliar em memoria, sobre a qual as accoes iraotrabalhar. A informacao e inserida na estrutura a medida que se processa o ficheiro de entrada. O textode saıda estara escrito na linguagem dot, interpretada pela ferramenta GraphViz.

22

Page 23: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2.1. TRADUCAO DIRIGIDA PELA SINTAXE

2.1.2 Gramatica Independente de Contexto

O texto (Sımbolo Texto - axioma da gramatica) divide-se claramente em duas partes distintas: definicaode pontos e definicao de percursos. Cada uma dessas partes sera representada por um sımbolo nao-terminal da gramatica (nao-terminal porque cada uma destas partes ira ser tambem dividida): o sımboloPontos e o sımbolo Percursos. Assim, podemos ja escrever a primeira regra de derivacao:

Texto: Pontos Percursos

O sımbolo Pontos representa um conjunto de um ou mais pontos. Neste caso e usada a recursividadecomo uma forma finita de especificar um numero indeterminado de pontos. Para tal sao especificadasduas producoes:

Pontos: Ponto Pontos

| Ponto

A recursividade a direita, tal como foi especificado implica que a segunda producao (Pontos: Ponto)represente o ultimo ponto da lista. Cada ponto (Ponto) engloba o conceito de sigla e coordenadas e podeser especificado pela producao:

Ponto: sigla ’(’ num ’,’ num ’)’

O sımbolo sigla e um sımbolo terminal porque nao existira uma producao que tenha esse sımbolo dolado esquerdo, o que significa que nao se divide noutros sımbolos. O mesmo acontece com o sımbolo numque representa um numero inteiro. Esta producao nao tem sımbolos nao-terminais do lado direito o queindica que nao dara origem a novas producoes. Existem, no entanto dois tipos de sımbolos terminais:uns que correspondem a partes fixas do texto (parenteses e vırgula) e outros que correspondem a partesvariaveis (letras e numeros).Voltando a primeira producao da gramatica, o sımbolo Percursos pode derivar pelas producoes:

Percursos: Percursos Percurso

| Percurso

Estas duas producoes indicam que um conjunto de percursos e constituıdo por um ou mais percursos.Usou-se a recursividade a esquerda para explicar que, neste caso, a producao Percursos: Percursorepresenta o primeiro percurso que foi definido no texto de entrada. Cada percurso sera definido por umnome, uma faixa etaria e uma lista de pontos.

Percurso : nome Faixa ’(’ Lista ’)’

O sımbolo nome e um sımbolo terminal e o sımbolo Faixa pode ser definido da seguinte forma:

Faixa : ’(’ ’>’ num ’)’

O sımbolo Lista e um nao-terminal que representa a sequencia de pontos. As duas producoes seguintesescrevem-se com base na recursividade a esquerda de modo a representar essa sequencia.

Lista : Lista ’,’ sigla

| sigla

Cada ponto e definido por uma sigla logo o sımbolo Lista representa um conjunto de siglas. Os sımbolos’(’, ’)’, ’,’ e ’>’ sao terminais literais e devem surgir no texto fonte tal como foram definidos na gramatica.Nao tem valor intrınseco, valem por si proprios. Os terminais nome, num e sigla tem um valor intrınsecocaptado pela analise lexica e usado nos calculos da gramatica tradutora.Esta gramatica, agora completa 1 representa a sintaxe da linguagem fonte. Cada um dos sımbolosterminais deve ser definido na especificacao lexica: uma sigla e uma letra maiuscula, um numero ecomposto por um ou mais (+) algarismos e o nome do percurso e uma sequencia de uma ou mais (+)letras minusculas e/ou maiusculas. No flex sao usadas as seguintes expressoes regulares:

sigla [A-Z]

num [0-9]+

nome [a-zA-Z]+

1visto que ja nao ha sımbolos nao-terminais para definir

23

Page 24: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

2.1.3 Gramatica Tradutora

A gramatica tradutora resulta da associacao de accoes semanticas a gramatica independente de contexto.2

Primeira Tarefa - Calculo do numero de pontos quentes

Em face da gramatica independente de contexto sao escolhidas as producoes as quais se devem associaraccoes para o calculo pretendido. Neste caso, a contagem do numero de pontos deve ser feita na producaop4. Uma variavel auxiliar sera incrementada por cada ponto detectado no texto fonte.

%{

int cont1=0;

%}

%%

p1 Texto: Pontos {printf("No pontos: %d\n",cont1);} Percursos

p2 Pontos: Ponto Pontos

p3 | Ponto

p4 ponto: SIGLA ’(’ NUM ’,’ NUM ’)’ {cont1++;}

A variavel cont1 e inicializada a zero e, no fim da definicao de todos os pontos (depois do sımboloPontos), o seu valor e escrito no texto de saıda. Na gramatica o reconhecimento do sımbolo Pontossignifica que todos os pontos ja foram analisados e que o valor calculado pode ser imprimido.A contagem dos pontos poderia tambem ter sido feitas noutras producoes:

p2 Pontos: Ponto {cont1++;} Pontos

p3 | Ponto {cont1++;}

As producoes p2 e p3 representam o conjunto de pontos do percurso e, por cada sımbolo Ponto reconhecidoo contador seria incrementado. E de notar que, neste caso, nem todas as accoes estao no final da producao.Na producao p2 a accao esta entre os dois sımbolos do lado direito da producao. Isto significa que aaccao ira ser executada logo apos o reconhecimento de cada ponto.

Segunda Tarefa - Calculo do numero de percursos

A contagem do numero de percursos e muito semelhante ao calculo do numero de pontos. Podemosusar uma variavel auxiliar cont2 associada ao sımbolo Percurso. O valor final desta variavel podera serimprimido depois do reconhecimento de todos os percursos (apos o sımbolo Percursos quando este seencontra no lado direito de uma producao).

p1 Texto: Pontos Percursos {printf("‘No de percursos: %d\n",cont2);}

p5 Percursos: Percursos Percurso

p6 | Percurso

p7 Percurso : nome Faixa ’(’ Lista ’)’ {cont2++;}

Terceira Tarefa - Calculo do numero de pontos de um percurso

Embora nao faca parte dos pedidos contidos no enunciado, decidiu-se incluir o calculo do numero de pontosde um percurso por se considerar que e uma informacao extra, facil de obter e util para organizador dasprovas. Os pontos de um percurso estao identificados por um conjunto de siglas. O sımbolo Listarepresenta esse conjunto nas producoes p9 e p10.

p7 Percurso : nome Faixa ’(’ Lista ’)’

{printf("No de pontos:%d\n",cont3); cont3=0;}

p8 Faixa : ’(’’>’ num ’)’

p9 Lista : Lista ’,’ sigla {cont3++;}

p10 | sigla {cont3=1;}

2Para cumprir o objectivo pedagogico deste documento e em particular deste exemplo serao apresentados alguns calculos

adicionais que nao sao precisos para a saıda pretendida mas que ajudam a entender a associacao entre as producoes e as

accoes.

24

Page 25: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2.1. TRADUCAO DIRIGIDA PELA SINTAXE

A variavel cont3 contem o numero de pontos de um percurso e e necessario imprimir e reinicializar oseu valor para que um outro percurso possa ser calculado. Estas accoes devem ser executadas no finalde cada percurso portanto a accao e especificada no fim da producao p7. De notar que, neste caso, aproducao p10 representa o primeiro ponto do percurso. Como o objectivo aqui e contar os pontos eindiferente a ordem pela qual essa contagem e feita, no entanto, para outro tipo de accoes (por exemplo,qual o ultimo ponto do percurso) essa ordem pode ser importante. O facto desta producao representaro primeiro ponto esta relacionado com a producao p9 que implementa uma recursividade a esquerda.Usando uma recursividade a direita a producao p10 representava o ultimo ponto do percurso. 3.

Quarta Tarefa - Calculo da distancia de um percurso

Para calcular a distancia entre quaisquer dois pontos e mais facil se toda a informacao sobre pontosestiver numa estrutura auxiliar. Assim sendo as accoes incluıdas na gramatica tem apenas por objectivofazer a insercao dos pontos numa lista ligada.

typedef char CHAVE;

typedef struct inf{

int x;

int y;

}COORD;

typedef struct lista{

CHAVE sig;

COORD info;

struct lista *next;

}LISTA;

LISTA *pts;

A producao p4 representa um ponto. E nessa producao que deve ser invocada uma funcao de insercaona lista ligada.

p1 Texto: Pontos Percursos

p2 Pontos: Ponto Pontos

p3 | Ponto

p4 Ponto: sigla ’(’ num ’,’ num ’)’

{pts=inserirPontosquentes(pts,$1,$3,$5);}

A funcao inserirPontosquentes tem quatro parametros: a lista de pontos, a sigla e duas coordenadas.$1 e valor intrınseco do primeiro sımbolo da lado direito da producao, da mesma forma que $3 e valordo terceiro sımbolo e $5 do quinto. Esse valor e extraıdo do texto fonte pelo analisador lexico e mesmoacontece em todos os sımbolos terminais nao-literais.E sempre possıvel acrescentar codigo C a especificacao Yacc para definicao de estruturas e funcoes. Paracalcular a distancia entre dois pontos consecutivos de um percurso e sabendo que todos os pontos erespectivas coordenadas estao armazenados na lista ligada, sera possıvel invocar uma funcao em C queuse a formula apresentada no enunciado do problema. Essa funcao e usada na producao p9 onde estaorepresentados dois pontos do percurso, ou seja, nesta producao e calculada a distancia de um troco dopercurso. Se a distancia dos varios trocos for acumulado numa variavel soma no final do percurso, essavariavel representa a distancia total.

p7 Percurso : nome Faixa {soma=0;} ’(’ Lista ’)’

{printf("Distancia total do percurso %s e %f\n",$1,soma);}

p8 Faixa : ’(’ ’>’ num ’)’

p9 Lista : Lista ’,’ sigla {soma += distanciaentre2pontos($1,$3);}

p10 | sigla {$$=$1;}

Na producao p7 representa um percurso de prova e e nesta producao que deve ser inicializada a variavelsoma (antes do sımbolo Lista) e imprimido o seu valor final (depois do sımbolo Lista). Estas novas accoessemanticas permitem que sejam apresentados os nomes de todos os percursos e respectivas distancias.

3Esta e uma das razoes pelas quais se opta sempre pela recursividade a esquerda

25

Page 26: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

Quinta Tarefa - Geracao do codigo GraphViz

Para gerar o codigo de saıda invoca-se funcoes de escrita em varias producoes da gramatica dependendo daformatacao pretendida. Antes de processar a informacao relativa aos percursos e imprimido o cabecalhodo texto de saıda e o fecho e escrito apos o reconhecimento desses mesmos percursos (producao p1).

p1 Texto: Pontos {printf("digraph G{\n\n"); cont=0;} Percursos {printf("}\t\n");}

p2 Pontos: Ponto Pontos

p3 | Ponto

p4 Ponto: sigla ’(’ num ’,’ num ’)’ {pts=inserirPontosquentes(pts,$1,$3,$5);}

p5 Percursos: Percurso

p6 | Percursos Percurso

p7 Percurso : nome Faixa {strcpy(nome,$1);soma=0;cont++;} ’(’ Lista ’)’

{printf("%d[style=bold,color=blue,label=\"O %s, \n para %s anos,

\n tem o comprimento de\n %f\",cont,nome,$2,soma);}

p8 Faixa : ’(’ ’>’ num ’)’ {$$=$3;}

p9 Lista : Lista ’,’ sigla

{printf("%c -> %c [style=bold,color=red, label=\"%s:%fm\"]",$1,$3,nome,

distanciaentre2pontos($1,$3));

soma+=distanciaentre2pontos($1,$3); $$=$3;}

p10 | sigla {$$=$1;}

Relativamente a cada percurso e gerado codigo sobre o nome, faixa etaria e comprimento (producao p7).Cada troco e identificado por duas siglas e e na producao p9 que se calcula a distancia desse troco e segera o codigo respectivo. Assim o texto de saıda e uma especificacao de todos os percursos e respectivostrocos, incluindo distancias parciais e totais (ver 2.1.5).

2.1.4 Geracao do Processador

Para gerar automaticamente o processador de linguagens que resolve o problema proposto e que segue aabordagem traducao dirigida pela sintaxe escolhida inicialmente, e preciso proceder em 2 passos:

1. gerar um analisador lexico (para abrir e ler o ficheiro que contem o texto-fonte e converter todas aspalavras em sımbolos terminais da gramatica) — esta tarefa sera realizada pelo gerador Flex.

2. gerar um tradutor4 (para reconhecer a sequencia de sımbolos terminais do texto-fonte e produzir asaıda pedida) — esta tarefa sera realizada pelo gerador Yacc,

O Flex gera uma funcao de analise lexica, yylex(), que esta contida no ficheiro lex.yy.c, o qual eincluıdo no ficheiro y.tab.c gerado pelo Yacc; este ficheiro, alem de conter a funcao de parsing e traducao,yyparse(), inclui a funcao main() do processador de linguagens pretendido.Geracao do Analisador Lexico com o Flex

Para que a ferramenta Flex possa gerar a funcao em C –yylex()– que ira fazer a analise lexica e necessarioescrever num ficheiro –que designaremos por orient.l– os sımbolos terminais identificados ao longoda seccao 2.1.2. A especificacao desses sımbolos terminais e feita escrevendo as respectivas expressoesregulares na notacao propria do Flex. Neste ficheiro de especificacao define-se entao os tres grupos decaracteres que foram mencionados em 2.1.2. Nessa parte e ainda feita uma quarta definicao para agrupartodos os caracteres reservados da nova linguagem.

%%

[A-Z] {yylval.ch=*yytext;return sigla;}

[0-9]+ {yylval.n=atoi(yytext);return num;}

[A-Za-z0-9]+ {strcpy(yylval.str,yytext);return nome;}

[(),>] return yytext[0];

[ \t\n] ;

4Analisador Sintactico, Analisador Semantico e Transformador.

26

Page 27: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2.1. TRADUCAO DIRIGIDA PELA SINTAXE

. printf("Caracter invalido");

%%

yywrap() {return 1;}

Geracao do Tradutor com o Yacc

Para que a ferramenta Yacc possa gerar a funcao em C –yyparse()– que ira fazer a analise sintactica esemantica e necessario escrever num ficheiro –que designaremos por orient.y– as producoes da gramaticaindependente de contexto identificadas ao longo da seccao 2.1.2, associando-lhes as accoes semanticasdefinidas ao longo da seccao 2.1.3. A especificacao dessa gramatica tradutora e feita escrevendo as regrasde derivacao na notacao propria do Yacc e codificando as accoes em C.A especificacao requer que se declarem na parte inicial do ficheiro (ate a primeira linha comecada por%%) os sımbolos terminais e sımbolos nao-terminais, o axioma e os tipos que se associam aos sımbolospara transportar o seu valor semantico. Ainda nessa primeira parte serao incluıdas todas as declaracoes–tipos, constantes, variaveis e funcoes– em C requeridas pelo codigo das accoes semanticas.Na parte final (apos a segunda linha comecada por %%) inclui-se o ficheiro –lex.yy.c– gerado pelaferramenta Flex e o ficheiro orient.c que contem a definicao das funcoes que implementam as accoessemanticas.

%{

...

LISTA *pts;

int cont;

char nome[20];

char faixa[5];

float soma,b;

%}

%union{

CHAVE ch;

char str[20];

int n;

}

%start Texto

%token <ch> sigla

%token <str> nome

%token <n> num

%token ’(’ ’)’ ’,’ ’>’

%type <n> Faixa

%type <ch> Lista

%%

Texto: Pontos {printf("digraph G{\n\n");cont=0;} Percursos {printf("}\t\n");}

Pontos: Ponto|Pontos Ponto

Ponto: sigla’(’num’,’num’)’ {pts=inserirPontosquentes(pts,$1,$3,$5);}

Percursos: Percurso|Percursos Percurso

Percurso : nome Faixa {strcpy(nome,$1);soma=0;cont++;} ’(’ Lista ’)’

{printf("%d[style=bold,color=blue, label=\"O %s, \n

para maiores de %d anos, \n tem o comprimento de\n %f\",

cont,nome,$2,soma);}

Faixa : ’(’ ’>’ num ’)’ {$$=$3;}

Lista : Lista ’,’ sigla {printf("%c -> %c[style=bold,color=red,label=\"%s:%fm\"]",

$1,$3,nome,b=distanciaentre2pontos($1,$3));soma+=b;$$=$3;}

| sigla {$$=$1;}

%%

#include "lex.yy.c"

#include "orient.c"

main() {yyparse() ;}

yyerror() {printf("Erro Sintactico...\n"); return 0;}

27

Page 28: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

O resultado de executar o Yacc sobre este ficheiro e gravado no ficheiro y.tab.c.

2.1.5 Teste ao Processador Gerado

Uma vez gerado o tradutor com a ajuda das ferramentas Flex e Yacc (seguindo a par e passo o que sedisse na seccao 2.1.4) e necessario compilar os programas contidos nos ficheiros lex.yy.c e y.tab.c paradepois de proceder aos testes.Para isso procede-se conforme esquematizado na seguinte makefile:

orienta: y.tab.c lex.yy.c

cc -o orienta y.tab.c

lex.yy.c: orienta.l

flex orienta.l

y.tab.c: orienta.y

yacc orienta.y

Ao executar o programa make sobre esta makefile obtem-se o processador de linguagens pedido que ficara,em formato executavel gravado no ficheiro orienta.

Para efectuar um teste exaustivo, o tradutor deve ser aplicado a textos que retratem situacoes sem erros,ou seja, textos fonte com definicao correcta de pontos e percursos. Deve tambem ser aplicado a situacoescom erros sintacticos e se possıvel semanticos.Dada a extensao implıcita deste teste exaustivo apenas incluımos aqui um caso de texto correcto e umasituacao com erros sintacticos.

Exemplo1

Neste caso, executa-se o processador gerado com o seguinte texto que contem a definicao de 4 pontos e3 percursos:

Texto-Fonte

A(1,2)

B(5,9)

C(4,5)

D(2,8)

Percurso1(>15)(A,C,D)

Percurso2(>20)(A,B,C,D)

Caminhada(>30)(D,B,C)

Texto Gerado

digraph G{

A->C [style=bold,color=red,label="Percurso1: 4.24m"];

C->D [style=bold,color=red,label="Percurso1: 3.61m"];

1[style=bold,color=blue,label="O Percurso1,\npara maiores de 15 anos,\ntem o comprimento de\n 7.85m"];

A->B [style=bold,color=red,label="Percurso2: 8.06m"];

B->C [style=bold,color=red,label="Percurso2: 4.12m"];

C->D [style=bold,color=red,label="Percurso2: 3.61m"];

2[style=bold,color=blue,label="O Percurso2,\npara maiores de 20 anos,\ntem o comprimento de\n 15.79m"];

D->B [style=bold,color=red,label="Caminhada: 3.16m"];

28

Page 29: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2.2. TRADUCAO DIRIGIDA PELA SEMANTICA

B->C [style=bold,color=red,label="Caminhada: 4.12m"];

3[style=bold,color=blue,label="O Caminhada,\npara maiores de 30 anos,\ntem o comprimento de\n 7.29m"];

}

Sujeitando este texto ao interpretador GraphViz e gerada a imagem 2.1.

A

C

Percurso1: 4.24m

B

Percurso2: 8.06m

D

Percurso1: 3.61m Percurso2: 3.61m

Caminhada: 3.16m

O Percurso1,para maiores de 15 anos,tem o comprimento de

7.85m

Percurso2: 4.12mCaminhada: 4.12m

O Percurso2,para maiores de 20 anos,tem o comprimento de

15.79m

O Caminhada,para maiores de 30 anos,tem o comprimento de

7.29m

Figura 2.1: Desenho das provas de orientacao

Exemplo2

Neste caso, executa-se o processador gerado com um texto que contem erros sintacticos:

Texto-Fonte

A(1,2)

B(5,9)

c(4,5)

D(2,8)

Percurso1(>15)(A,C,D)

Percurso2(A,B,C,D)

Caminhada(>30)(D,B,C)

Contrariando a sintaxe da linguagem, para um dos percurso nao foi indicada a faixa etaria a que sedestina.

Texto Gerado

digraph G{

A->C [style=bold,color=red,label="Percurso1: 4.24m"];

C->D [style=bold,color=red,label="Percurso1: 3.61m"];

1[style=bold,color=blue,label="O Percurso1,\npara maiores de 15 anos,\ntem o comprimento de\n 7.85m"];

Erro Sintatico...

O texto gerado contem erros e, portanto, nao podera ser interpretado pelo GraphViz.

2.2 Traducao Dirigida pela Semantica

A Traducao Dirigida pela Semantica e um mecanismo de traducao mais potente que se baseia nos sımbolosexistentes nas regras sintacticas e no valor dos atributos dos mesmos sımbolos. A definicao de gramaticatradutora mantem-se valida, mas agora as accoes incluem o acesso a valores de atributos.Nesta seccao e mostrado o codigo relativo ao mesmo exemplo usando uma especificacao em LISA. Estaferramenta usa gramaticas de atributos para implementar uma traducao dirigida pela semantica.

29

Page 30: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

Para cada linguagem definida em LISA sao especificados um conjunto de elementos lexicos e um conjuntode regras. Cada regra corresponde a um sımbolo nao-terminal da gramatica que podera derivar em maisdo que uma producao. Em cada producao sao especificados os calculos efectuados com os atributos decada sımbolo da producao. Os tipos destes atributos sao definidos no ınicio do ficheiro de especificacao.Como o sistema LISA se baseia em Java sao usados tipos proprios dessa lingguagem assim como os calculosdos atributos sao instrucoes Java.No caso das gramaticas de atributos, o programa fonte e reconhecido, e criada uma representacao internados sımbolos e dos seus atributos e e sobre esta representacao que o calculo desses atributos e efectuado.Todos os resultados gerados sao atributos de sımbolos, ate mesmo o codigo gerado.

language Orientation

{

lexicon

{

Number [0-9]+

Identifier [A-Z]

Name [a-z]+

separa \( | \) | \, | \>

ignore [\0x09\0x0A\0x0D\ ]+

}

attributes Hashtable *.inEnv, *.outEnv;

int *.val, *.cont;

float *.sum;

String *.name,*.lastpoint,*.code;

rule Start

{

START ::= POINTS ROUTES compute

{

POINTS.inEnv = new Hashtable();

START.outEnv = POINTS.outEnv;

ROUTES.outEnv=START.outEnv;

START.code ="Digraph G{\n"+ROUTES.code+"\n}";

};

}

rule Points

{

POINTS ::= POINTS POINT compute

{

POINT.inEnv =POINTS[0].inEnv;

POINTS[1].inEnv = POINT.outEnv;

POINTS[0].outEnv = POINTS[1].outEnv;

}

| POINT compute

{

POINT.inEnv = POINTS[0].inEnv;

POINTS[0].outEnv = POINT.outEnv;

};

}

rule Point

{

POINT ::= #Identifier \( #Number \, #Number \) compute

{

30

Page 31: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2.2. TRADUCAO DIRIGIDA PELA SEMANTICA

POINT.outEnv = put(POINT.inEnv, #Identifier.value(),

Integer.valueOf(#Number.value()).intValue(),

Integer.valueOf(#Number.value()).intValue());

};

}

rule Routes

{

ROUTES ::= ROUTES ROUTE compute

{

ROUTES[0].code=ROUTES[1].code+ROUTE.code;

ROUTES[0].cont= ROUTES[1].cont +1;

ROUTE.cont=ROUTES[0].cont;

ROUTES[1].outEnv =ROUTES[0].outEnv;

ROUTE.outEnv=ROUTES[0].outEnv;

}

| ROUTE compute

{

ROUTES.code=ROUTE.code;

ROUTES.cont=1;

ROUTE.cont=ROUTES.cont;

ROUTE.outEnv=ROUTES.outEnv;

};

}

rule Route

{

ROUTE ::= #Name AGE \( LIST \) compute

{

LIST.outEnv=ROUTE.outEnv;

LIST.name=#Name.value();

ROUTE.code="\n"+ROUTE.cont+" [style=bold,color=blue,label=The "+

LIST.name+" with the lenght "+LIST.sum+" for people "+

AGE.val+" years old ]\n"+LIST.code;

};

}

rule Age

{

AGE ::= \( \> #Number \) compute

{

AGE.val = Integer.valueOf(#Number.value()).intValue();

};

}

rule List

{

LIST ::= LIST \, #Identifier compute

{

LIST[1].name=LIST[0].name;

LIST[1].outEnv = LIST[0].outEnv;

LIST[0].code= LIST[1].code +"\n"+LIST[1].lastpoint+"->"+

#Identifier.value()+"[style=bold,color=red,

label="+LIST[0].name+":"+

distancebetween2points(LIST[0].outEnv,

LIST[1].lastpoint,#Identifier.value());

31

Page 32: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

LIST[0].sum=LIST[1].sum +distancebetween2points(LIST[0].outEnv,

LIST[1].lastpoint,#Identifier.value());

LIST[0].lastpoint=#Identifier.value();

}

| #Identifier compute

{

LIST.code="";

LIST.sum=0;

LIST.lastpoint=#Identifier.value();

};

}

method A_point{

class Point{

String id;

int x;

int y;

Point(String id, int x, int y){

this.id=id;

this.x=x;

this.y=y;

}

public int getcoordx(){

return this.x;

}

public int getcoordy(){

return this.y;

}

public String getId(){

return this.id;

}

}

}

method Environment

{

import java.util.*;

public Hashtable put(Hashtable env, String ident, int coordx, int coordy)

{

env = (Hashtable)env.clone();

env.put(ident,(Point)new Point(ident,coordx,coordy));

return env;

}

public float distancebetween2points(Hashtable env,String Id1, String Id2){

float dist;

Point p1=(Point)env.get(Id1);

Point p2=(Point)env.get(Id2);

dist=1;

dist=(float)Math.sqrt(Math.pow(p2.getcoordx()-p1.getcoordx(),2)+

Math.pow(p2.getcoordy()-p1.getcoordy(),2));

return dist;

}

}

}

32

Page 33: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

2.2. TRADUCAO DIRIGIDA PELA SEMANTICA

Para resolver o problema em causa foram criados os atributos inEnv e outEnv do tipo tabela de hash paraguardar os pontos e as suas coordenadas. Na segunda parte da gramatica, relativa aos percursos, e criadoo texto de saıda (atributo code) ligando os pontos do percurso dois a dois e calculando a distancia entreeles (consultando a tabela de pontos e coordenadas). A arvore de derivacao construıda no reconhecimentodo programa fonte obriga a que os atributos sejam copiados de sımbolo para sımbolo ate chegar a nodosfolha e assim ir coleccionando a informacao pretendida.

33

Page 34: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

CAPITULO 2. TRADUCAO DE LINGUAGENS

34

Page 35: Exerc´ıcios de apoio `as aulas te´oricas de Processamento ...

Conclusao

Estes apontamentos constituem um documento de apoio a disciplina de Processamento de Linguagens e,como tal, pretendem ajudar a dotar os alunos de:

• capacidade de especificar uma linguagem usando expressoes regulares e/ou gramaticas;

• capacidade de entender o processo de reconhecimento das linguagens regulares e nao-regularesrecorrendo a automatos, grafos de sintaxe, arvores de derivacao, tabelas e stack’s de parsing eusando abordagens top-down e bottom-up.

• capacidade de especificar a semantica e traducao de uma linguagem usando gramaticas traduto-ras (traducao dirigida pela sintaxe) ou usando gramaticas de atributos (traducao dirigida pelasemantica)

• capacidade de construir processadores de linguagens usando formalismos conhecidos dos pontosanteriores e recorrendo a ferramentas especıficas de geracao de processadores.

35