Exercícios de apoio às aulas teóricas de Processamento de Linguagens. ESTiG - IPB. Maria João Tinoco Varanda Pereira

Tamanho: px
Começar a partir da página:

Download "Exercícios de apoio às aulas teóricas de Processamento de Linguagens. ESTiG - IPB. Maria João Tinoco Varanda Pereira"

Transcrição

1 Exercícios de apoio às aulas teóricas de Processamento de Linguagens ESTiG - IPB Maria João Tinoco Varanda Pereira Fevereiro 2006

2 2

3 Conteúdo 1 Exercícios teóricos sobre o Reconhecimento de Linguagens Questões teóricas Reconhecimento de Linguagens Regulares (Gramáticas e Expressões Regulares) Reconhecimento de Linguagens Não-Regulares Parsing Top-Down Parsing Bottom-Up Tradução de Linguagens Tradução Dirigida pela Sintaxe Construção do Tradutor Passo a Passo Gramática Independente de Contexto Gramática Tradutora Geração do Processador Teste ao Processador Gerado Tradução Dirigida pela Semântica

4 CONTEÚDO 4

5 Introdução Este documento pretende servir de apoio às aulas teóricas de Processamento de Linguagens. Esta disciplina é leccionada ao 2 o ano de Engenharia Informática e tem por objectivo introduzir conceitos relacionados com a concepção, especificação e processamento de linguagens assim como mostrar várias abordagens e ferramentas de construção de compiladores. O exercícios apresentados no primeiro capítulo dizem respeito à parte da matéria sobre reconhecimento de linguagens (regulares e não regulares). No segundo capítulo é apresentado um exercício mais prático com o objectivo de explicar a segunda parte da matéria: tradução de linguagens. 5

6 CONTEÚDO 6

7 Capítulo 1 Exercícios teóricos sobre o Reconhecimento de Linguagens A resolução dos exercícios propostos neste capítulo permitirá a consolidação dos conhecimento teóricos de processamento de linguagens. Este capítulo está dividido em três secções que correspondem às diferentes partes da matéria a leccionar: conceitos teóricos; reconhecimento de linguagens regulares; reconhecimento de linguagens não-regulares. 1.1 Questões teóricas 1. Explique a diferença entre linguagens formais e linguagens naturais no contexto do Processamento de Linguagens (P02(1)). 2. Defina Especificação de uma Linguagem (o que é, para que serve, como se faz, que resultados produz) (P99(1)v). 3. Relacione processadores, compiladores e interpretadores de linguagens em termos de objectivos, tarefas e aplicações (S99(1)). 4. Dê exemplos de aplicação de um processador de linguagens e indique quais as suas principais tarefas (fases de processamento) (R99(1)). 5. Explique a diferença entre tradutor e reconhecedor e como pode ser implementado um tradutor com base num reconhecedor (S02(1)). 6. Explique que tipos de reconhecedores podem ser implementados e como varia a sua implementação quando se trata de linguagens regulares ou não regulares (R02(1)). 7. Analise a veracidade das seguintes afirmações e justifique, em cada uma delas, a sua resposta (P03(1)): (a) Uma gramática independente de contexto contem apenas um símbolo não-terminal no lado esquerdo de cada produção. (b) O reconhecimento de linguagens regulares é feito através de autómatos finitos não determinísticos. (c) A tradução dirigida pela sintaxe é implementada à custa de acções semânticas associadas à gramática independente de contexto. 8. Analise a veracidade das seguintes afirmações e justifique, em cada uma delas, a sua resposta (S03(1)): 7

8 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS SOBRE O RECONHECIMENTO DE LINGUAGENS (a) Uma gramática é ambígua quando apresenta mais do que um caminho possível para reconhecimento de uma frase - (b) Os autómatos finitos reactivos são usados para implementar conversores e reconhecedores. (c) Um reconhecedor top-down dirigido por tabela só é aplicado a linguagens regulares. 9. Analise a veracidade das seguintes afirmações e justifique, em cada uma delas, a sua resposta (R03(1)): (a) Uma árvore de derivação representa todas as produções da gramática da linguagem. (b) Um autómato finito determinístico pode ter mais do que um estado final. (c) É possível construir um reconhecedor bottom-up para qualquer gramática independente de contexto. 1.2 Reconhecimento de Linguagens Regulares (Gramáticas e Expressões Regulares) 1. Considere as seguintes expressões regulares (P99(1)): e1 = a + (ab) + b e2= (s+t)(s+t) (a) Escreva uma gramática que represente as frases pertencentes à linguagem subjacente a cada uma destas expressões regulares. (b) Desenhe o autómato finito não determinístico de cada uma das linguagens. (c) Dê exemplos de frases pertencentes a cada uma das linguagens. 2. Considere as seguintes expressões regulares (S99(1)): e1= a + b + e2 = ab?c? (a) Escreva uma gramática que represente as frases pertencentes à linguagem subjacente a cada uma destas expressões regulares. (b) Desenhe o autómato finito não determinístico de cada uma das linguagens. (c) Dê exemplos de frases pertencentes a cada uma das linguagens. 3. Considere as seguintes expressões regulares (R99(1)): e1= (ab cd + )? e2= [1-12][ABC] (a) Escreva uma gramática que represente as frases pertencentes à linguagem subjacente a cada uma destas expressões regulares. (b) Desenhe o autómato finito não determinístico de cada uma das linguagens. (c) Dê exemplos de frases pertencentes a cada uma das linguagens. 4. Considere a seguinte expressão regular (P02(1)): (a b cd) + d + e (a) Escreva uma gramática que represente as frases da linguagem subjacente a esta expressão regular. (b) Dê exemplos de duas frases pertencentes à linguagem e construa as respectivas árvores de derivação. 5. Considere o autómato de estados finitos da figura 1.1 (S02(1)): (a) Escreva uma gramática que represente as frases pertencentes à linguagem reconhecida por este autómato. 8

9 1.2. RECONHECIMENTO DE LINGUAGENS REGULARES (GRAMÁTICAS E EXPRESSÕES REGULARES) a a b A B D E c a C a Figura 1.1: Autómato de estados finitos (b) Escreva uma expressão regular que também represente esta linguagem. (c) Transforme este autómato num autómato finito determinístico. (d) Dê exemplos de frases pertencentes a esta linguagem. 6. Considere uma gramática G=(T,N,S,P), com T=a,b,c, N=S,A,B e com as seguintes produções (R02(1)v): S -> A bb A -> aa ac B -> Bc Ab (a) Escreva um expressão regular equivalente a esta gramática. (b) Transforme-a numa gramática regular à direita. (c) Dê exemplos de frases pertencentes a esta linguagem. (d) Construa um autómato finito não determinístico da gramática construída na alínea b). 7. Considere a seguinte expressão regular (P03(1)v): (a + b)?(b + c)?c (a) Escreva uma gramática regular à direita que represente a mesma linguagem. (b) Dê dois exemplos de duas frases pertencentes à linguagem e construa as respectivas árvores de derivação. (c) A expressão (a+b+c)?c* é equivalente? Justifique dando exemplos de frases. (d) Desenhe um autómato finito determinístico para reconhecimento desta linguagem. 8. Considere a seguinte expressão regular (S03(2)): ( ) (( )( )) (a) Mostre dois exemplos de frases pertencentes a esta linguagem e respectivas árvores de derivação. (b) Transforme-a numa gramática independente de contexto. (c) Construa um autómato finito não determinístico da gramática. (d) Considerando apenas parte da expressão regular ( ) construa o autómato finito determinístico dessa linguagem. 9. Considere o autómato de estados finitos da figura 1.2 (R03(1)v): 9

10 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS SOBRE O RECONHECIMENTO DE LINGUAGENS *, - ( ) S A B C D + in / t Figura 1.2: Autómato de estados finitos (a) Escreva uma gramática regular à direita que represente as frases pertencentes à linguagem reconhecida por este autómato. (b) Escreva uma expressão regular que também represente esta linguagem. (c) Dê dois exemplos de frases pertencentes a esta linguagem e respectivas árvores de derivação. (d) Construa o grafo de sintaxe da linguagem. 10. Considere as seguintes expressões (P04(1)): expr1 = a + b c expr2 = aa?c (a) Escreva uma gramática regular à direita que represente as frases pertencentes à linguagem representada por expr1. (b) Escreva uma gramática regular à esquerda que represente as frases pertencentes à linguagem representada por expr2. (c) Prove que todas as frases formadas pela expr2 pertencem à linguagem representada por expr1. (d) Indique dois exemplos de frases que pertencem a expr1 e não a expr2. (e) Construa o autómato finito determinístico da linguagem representada por expr Considere as seguintes expressões (S04(1)): expr1 = (x + y) + zw expr2 = x + y + zw (a) Indique se expr1 é equivalente a expr2 e justifique a sua resposta com exemplos. (b) Escreva uma gramática simplesmente regular à direita que represente as frases pertencentes à linguagem representada por expr1. (c) Construa o autómato finito determinístico e o grafo de sintaxe da linguagem representada por expr1. (d) Escreva uma gramática regular à esquerda que represente as frases pertencentes à linguagem representada por expr2. (e) A qual das linguagens pertence a frase xxyyz? Justifique. 12. Considere o autómato finito da figura 1.3 (R04(1) e R04(3)): (a) Escreva a expressão regular definida por este autómato finito. (b) Escreva uma gramática independente de contexto que represente as frases pertencentes à linguagem. (c) Dê dois exemplos de frases pertencentes à linguagem e justifique a sua resposta. (d) Transforme o autómato num autómato finito determinístico. (e) Escreva uma gramática regular à direita representativa da linguagem da expressão regular seguinte:(a + b z) + (?+!)(?+! + ǫ) 10

11 1.2. RECONHECIMENTO DE LINGUAGENS REGULARES (GRAMÁTICAS E EXPRESSÕES REGULARES) e B o D m E A q c q?? F u G a H l N! O! e o o P I u J a K n L d M Figura 1.3: Autómato de estados finitos 13. Responda às seguintes questões (P05(1)): (a) Escreva uma expressão regular de uma linguagem cujas strings começam e terminam por b. (b) Considere uma linguagem definida pela seguinte expressão regular ab c(a + b)c (c) Indique três frases pertencentes a essa linguagem. (d) Escreva uma gramática regular à direita para a mesma linguagem. (e) Construa o autómato finito determinístico desta linguagem. 14. Considere uma gramática independente de contexto G1=(T1,N1,S1,P1), com T1=a,b,c, N1=S,B,C e com as seguintes produções (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 respectivas árvores de derivação. (b) Apresente uma expressão regular equivalente. (c) Transforme-a numa gramática regular à direita. (d) Construa um autómato finito não determinístico da linguagem. 15. Considere a seguinte expressão regular (S05(1)): (12) (5 8)(3) + (a) Qual o vocabulário desta linguagem? (b) Dê quatro exemplos de frases pertencentes a esta linguagem. (c) Construa uma gramática regular direita para esta linguagem. (d) Construa o autómato finito não determinístico para reconhecimento de frases pertencentes a esta linguagem 16. Considere uma gramática independente de contexto G1=(T1,N1,S1,P1), com T1=c,d,f, N1=S,A e com as seguintes produções (S05(1)v): S -> A ds A -> ca f (a) Escreva uma expressão regular equivalente à gramática. (b) Transforme-a numa gramática regular à esquerda. (c) Construa um autómato finito determinístico da gramática. 11

12 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS SOBRE O RECONHECIMENTO DE LINGUAGENS 17. Considere a seguinte expressão regular #( ) + # que representa códigos secretos e responda às seguintes questões (R05(1)): (a) Construa uma gramática independente de contexto equivalente. (b) Construa um autómato finito determinístico para esta linguagem. (c) Modifique a expressão regular de forma a garantir que cada código é constituído exactamente por 4 algarismos para além dos #s. (d) Modifique a expressão regular de modo a permitir que o código possa conter também letras minúsculas e maiúsculas. 18. Considere uma gramática independente de contexto G1=(T1,N1,S1,P1), com T1=a,b,d,e,g, N1=S,B,C e com as seguintes produções (R05(1)): S -> Ba bc B -> d eb C -> gc g (a) Mostre dois exemplos de frases pertencentes a esta linguagem e respectivas árvores de derivação. (b) Transforme-a numa gramática regular à direita. (c) Construa um autómato finito determinístico da gramática. 19. Considere a seguinte gramática G=(T,N,S,P) com T=a,b, N=S,A e cujas produções são as seguintes (P99(1)): S -> A as ba A -> ab aba bas (a) Transforme-a numa gramática simplesmente regular à direita. (b) Construa o autómato finito não determinístico (c) Transforma o autómato não determinístico em determinístico. 20. Considere a seguinte gramática G=(T,N,S,P) com T=a,b, N=S,A,B e cujas produções são as seguintes (S99(1)): S -> aaa abb A -> bb B -> a aa (a) Transforme-a numa gramática simplesmente regular à direita. (b) Construa o autómato finito não determinístico (c) Transforma o autómato não determinístico em determinístico. 21. Considere a seguinte gramática G=(T,N,S,P) com T=a,b, N=S,A e cujas produções são as seguintes (R99(1)): S -> abs aa A -> b aa (a) Transforme-a numa gramática simplesmente regular à direita. (b) Construa o autómato finito não determinístico (c) Transforma o autómato não determinístico em determinístico. 12

13 1.3. RECONHECIMENTO DE LINGUAGENS NÃO-REGULARES 22. Considere uma gramática G=(T,N,S,P) com T=a,b, N=S,A,B e cujas produções são as seguintes (P02(1)v): S -> a bb ba A -> b as B -> abaa A (a) Transforme-a numa gramática simplesmente regular à direita. (b) Construa o autómato finito não determinístico (c) Transforme o autómato não determinístico em determinístico. 1.3 Reconhecimento de Linguagens Não-Regulares Parsing Top-Down 1. Considere uma gramática G=(T,N,S,P), T=a,b, N=S,A,B e com as seguintes produções (S02(1)v): S -> aa bb A -> a b B -> a Implemente em linguagem algorítmica um Reconhecedor Top-Down Recursivo Descendente para esta linguagem. 2. Considere uma gramática G=(T,N,S,P), com T=a,b, N=S,A,B e com as seguintes produções (R02(2)): S -> a ba bb A -> abb B B -> b ab (a) Transforme-a numa gramática simplesmente regular à direita. (b) Construa o grafo de sintaxe desta linguagem (c) Esta gramática verifica a condição LL(1)? Justifique. 3. Considere uma gramática G=(T,N,S,P) com T=a,b, N=S,A,B e cujas produções são as seguintes (P03(2)): S -> abb baa A -> aa B -> bb (a) Verifique se a gramática satisfaz a condição LL(1). Se não satisfaz, transforme-a de modo a poder ser construído um reconhecedor Top-Down para a linguagem. (b) Preencha a tabela de parsing necessária para efectuar esse reconhecimento. (c) Simule o reconhecimento da frase µ=baaa indicando o estado da stack de parsing ao longo do processo. (d) Construa um grafo de sintaxe que represente a gramática em causa. 4. Considere uma gramática G=(T,N,S,P), com T=a,b, N=S,A e com as seguintes produções (S03(3)): 13

14 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS SOBRE O RECONHECIMENTO DE LINGUAGENS S -> AA A -> aa b (a) Escreva uma expressão regular equivalente. (b) Esta gramática verifica a condição LL(1)? Justifique. (c) Construa a tabela de parsing e verifique se a frase µ=aabb pertence ou não à linguagem definida pela gramática, mostrando o estado da stack de parsing durante o reconhecimento. (d) Transforme-a numa gramática simplesmente regular à direita 5. Considere uma gramática G1=(T,N,S,P), T1=a,b,c, N1=S,A,C e com as seguintes produções (R03(2)): S -> aab C A -> aa C -> cc b (a) Indique uma expressão regular que represente a linguagem desta gramática. (b) Verifique se satisfaz a condição LL(1). Justifique a sua resposta. (c) Implemente em linguagem algorítmica um Reconhecedor Top-Down Recursivo Descendente para esta linguagem. (d) Transforme a gramática numa gramática regular à direita 6. Pretende-se desenvolver um reconhecedor Top-Down para a seguinte gramática não regular (P99(1)v): S -> aa A -> bbc cbd ac B -> a (a) Verifique se a gramática satisfaz a condição LL(1). (b) Construa um grafo de sintaxe que represente esta gramática. (c) Construa uma tabela de parsing e verifique se a frase µ=acad pertence ou não à linguagem definida pela gramática. 7. Pretende-se desenvolver um reconhecedor Top-Down para a seguinte gramática (S99(1)v): S -> aa bab A -> ba C ac B -> cc d C -> c (a) Verifique se a gramática satisfaz a condição LL(1). (b) Construa um grafo de sintaxe que represente esta gramática. (c) Construa uma tabela de parsing e verifique se a frase µ=abac pertence ou não à linguagem definida pela gramática. 8. Pretende-se desenvolver um reconhecedor Top-Down para a seguinte gramática não regular (R99(1)v): S -> Aaa bbb A -> bb B -> a Aa (a) Verifique se a gramática satisfaz a condição LL(1). 14

15 1.3. RECONHECIMENTO DE LINGUAGENS NÃO-REGULARES (b) Construa um grafo de sintaxe que represente esta gramática ( um grafo para cada nãoterminal). (c) Construa uma tabela de parsing e verifique se a frase µ=bbba pertence ou não à linguagem definida pela gramática. 9. Pretende-se desenvolver um reconhecedor Top-Down para uma gramática não regular, com as seguintes produções (P02(2)): S -> aab bb cs A -> aa B -> b cb (a) Verifique se a gramática satisfaz a condição LL(1). (b) Construa um grafo de sintaxe que represente esta gramática. (c) Construa a tabela de parsing e verifique se a frase µ=bccb pertence ou não à linguagem definida pela gramática, mostrando o estado da stack de parsing ao longo do reconhecimento. 10. Considere uma gramática G=(T,N,S,P), com T=1,2,3, N=S,A,B e cujas produções são as seguintes (S02(2)): S -> A1 B A -> A1 B -> 23 1 (a) Escreva uma expressão regular equivalente a esta gramática. (b) Mostre que a gramática é ambígua e que não satisfaz a condição LL(1). (c) Reescreva a gramática transformando-a numa gramática regular à direita. 11. Pretende-se desenvolver um reconhecedor Top-Down para uma gramática não regular, com as seguintes produções (R02(2)v): S -> aaa B A -> cb B -> cb d (a) Verifique se a gramática satisfaz a condição LL(1). (b) Construa a tabela de parsing e verifique se a frase µ=acda pertence ou não à linguagem definida pela gramática, mostrando o estado da stack de parsing durante o reconhecimento. 12. Considere as gramáticas G1 e G2, T1=a,b, N1=S,A,B e T2=a,b, N2=S,A,B,C, com as seguintes produções (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 gramáticas representam a mesma linguagem, indicando uma expressão regular equivalente às duas que represente essa linguagem. (b) Qual das gramáticas satisfaz a condição LL(1)? Justifique a sua resposta. (c) Construa a tabela de parsing que permite reconhecer frases desta linguagem. 15

16 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS 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 representada por G Considere as gramáticas G1 e G2, T1=a,b,c, N1=S,A,B e T2=a,b,c, N2=S,A,B,C, com as seguintes produções (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 transformações necessárias para que a gramática G1 verifique a condição LL(1). Justifique. (b) Dê dois exemplos de frases pertencentes às duas gramáticas G1 e G2. (c) Prove que a gramática G2 satisfaz a condição LL(1). (d) Construa a tabela de parsing para reconhecimento Top-Down da linguagem representada por G2. (e) Mostre o estado da stack de parsing ao longo do reconhecimento da frase baac. 14. Considere as gramáticas G1 e G2, T1=a,b, N1=S,A e T2=a,b, N2=S,A,B, com as seguintes produções (R04(2)): G1 G2 S -> aba Sb S -> abab A -> aa A -> aa B -> bb (a) Prove que as duas gramáticas são equivalentes calculando a expressão regular que as pode substituir. (b) Transform G1 numa gramática regular à direita (c) Prove que a gramática G2 satisfaz a condição LL(1). (d) Construa a tabela de parsing para reconhecimento Top-Down da linguagem representada por G2. (e) Mostre o estado da stack de parsing ao longo do reconhecimento da frase abaa. 15. Considere a gramática G2=(T2,N2,S2,P2), com T2=c,d,e,f, N2=A, S2=A e com as seguintes produções (P05(2)): A -> Ac Ad e f (a) Escreva uma expressão regular equivalente. (b) Modifique a gramática de modo a verificar a condição LL(1). Prove que a nova gramática verifica essa condição. (c) Construa a tabela de parsing e verifique se a frase µ=fcdcd pertence ou não à linguagem definida pela gramática, mostrando o estado da stack de parsing durante o reconhecimento. 16

17 1.3. RECONHECIMENTO DE LINGUAGENS NÃO-REGULARES (d) Implemente em linguagem algorítmica um reconhecedor recursivo descendente para esta linguagem 16. Considere uma gramática G2=(T2,N2,S,P2), com T2=b,c,d,e, N2=S,A e com as seguintes produções (S05(2)): S -> ee bac bae A -> d ca (a) Escreva uma expressão regular equivalente a esta gramática. (b) Esta gramática verifica a condição LL(1)? Se não verificar modifique a gramática de modo a satisfazer essa condição. (c) Construa a tabela de parsing e verifique se a frase µ=bdee pertence ou não à linguagem definida pela gramática, mostrando o estado da stack de parsing durante o reconhecimento. (d) Construa o grafo de sintaxe desta linguagem. 17. Considere uma gramática G2=(T2,N2,S,P2), com T2=b,c,d, N2=S,A,B e com as seguintes produções (R05(1)v): S -> ba c A -> dbd c B -> cb c (a) Escreva uma expressão regular equivalente. (b) Esta gramática verifica a condição LL(1)? Se não verificar modifique a gramática de modo a satisfazer essa condição. (c) Construa a tabela de parsing e verifique se a frase m=bdcd pertence ou não à linguagem definida pela gramática, mostrando o estado da stack de parsing durante o reconhecimento. (d) Construa o grafo de sintaxe e implemente um algoritmo recursivo descendente que reconheça esta linguagem Parsing Bottom-Up 1. Considere a seguinte gramática (P99(2)): Z -> S$ S -> AaAb BaBa A -> B -> c Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. 2. Considere a seguinte gramática (S99(2)): Z -> S$ S -> a asbb Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. 3. Considere a seguinte gramática (R99(2)): 17

18 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS SOBRE O RECONHECIMENTO DE LINGUAGENS Z -> S$ S -> L = R R L -> * R id R -> L Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. 4. Considere uma gramática G=(T,N,S,P) com T=a,b,c, N=S,X,Y e as seguintes produções (P02(2)v): S -> S$ S -> Xa S -> Y X -> Xa X -> Y -> bc Y -> a (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Para reconhecer a frase µ=aaa, indique quais os estados do autómato pelos quais passa o reconhecedor. 5. Considere uma gramática G=(T,N,S,P), com T=x,y, N=S,A,B e com as seguintes produções (S02(2)): S -> S$ S -> A A -> AB x B -> yb y (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Indique quais os estados do autómato que irão ser percorridos pelo reconhecedor para reconhecer a frase µ=xyyy. 6. Considere uma gramática G=(T,N,S,P), com T=a,b,d,e,f,g, N=S,A,B e cujas produções são as seguintes (R02(3)): S -> S$ S -> Aa bb A -> d eaf B -> gb g (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=edfa. 7. Considere uma gramática G=(T,N,S,P) com T=a,b, N=S,A,B e as seguintes produções (P03(2)v): S -> S$ S -> aab S -> ab 18

19 1.3. RECONHECIMENTO DE LINGUAGENS NÃO-REGULARES A -> ab A -> b B -> bb B -> (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Construa a tabela de parsing para o reconhecimento Bottom-Up. (c) Para reconhecer a frase µ=aab, indique quais os estados do autómato pelos quais passa o reconhecedor. 8. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramática não regular, com as seguintes produções (S03(4)): S -> asbs bsas (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Construa a tabela de acções (pertencente à tabela de transições) para efectuar o reconhecimento desta linguagem. (c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=abba. 9. Considere uma gramática G=(T,N,S,P), com T=a,b, N=S,A e cujas produções são as seguintes (R03(3)): S -> AS b A -> aa b (a) Construa o autómato LR(0) para reconhecimento bottom-up da linguagem descrita por esta gramática. (b) Construa a tabela de acções para esse reconhecedor. (c) Indique os passos para o reconhecimento da frase aabb. 10. Considere uma gramática G=(T,N,S,P), com T=a,b, N=S,A,B e cujas produções são as seguintes (P04(2)): S-> S$ S -> aaab A -> Ab b B -> a b (a) Construa o autómato LR(0) para reconhecimento bottom-up da linguagem descrita por esta gramática. (b) Construa a tabela de acções para esse reconhecedor. (c) Indique os passos para o reconhecimento da frase abaa. 11. Considere uma gramática G=(T,N,S,P), com T=0,1, N=S,A,B e cujas produções são as seguintes (S04(3)): S -> S$ S -> 1A0B A -> 1A0 B -> 0B1 19

20 CAPÍTULO 1. EXERCÍCIOS TEÓRICOS SOBRE O RECONHECIMENTO DE LINGUAGENS (a) Construa o autómato LR(0) para reconhecimento bottom-up da linguagem descrita por esta gramática. (b) Construa a tabela de acções para esse reconhecedor. (c) Indique os passos para o reconhecimento da frase Considere uma gramática G=(T,N,S,P), com T=x,y,z, N=S,Y,Z e cujas produções são as seguintes (R04(2)v e R04(1)v): S -> S$ S -> xyz xzy Y -> yy Z -> zz x (a) Construa o autómato LR(0) para reconhecimento bottom-up da linguagem descrita por esta gramática. (b) Construa a tabela de acções para esse reconhecedor e indique os passos para o reconhecimento da frase xyyyx. (c) Construa o grafo de sintaxe desta linguagem. 13. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramática não regular, com as seguintes produções (P05(2)v): S -> asa bsb c (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Construa a tabela de acções 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 gramática não regular, com as seguintes produções (S05(3)): S -> asb b cs ae (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Construa a tabela de acções e a tabela de transições para efectuar o reconhecimento desta linguagem. (c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=accaed 15. Pretende-se desenvolver um reconhecedor Bottom-Up para uma gramática não regular, com as seguintes produções (R05(2)): S -> if E then S if E then S else S a b E -> x y (a) Construa um autómato LR(0) que permita implementar um reconhecedor Bottom-Up para a linguagem definida por esta gramática. (b) Construa a tabela de acções para efectuar o reconhecimento desta linguagem. (c) Indique os estados pelos quais passa o reconhecedor para reconhecer a frase µ=if x then a 20

21 Capítulo 2 Tradução de Linguagens No capítulo anterior foram apresentados exercícios sobre o reconhecimento sintáctico de linguagens. No entanto, para além de verificar se o texto submetido a um processador faz parte da linguagem, um dos objectivos dos compiladores é a tradução do texto para outra linguagem. A tradução pode ser implementada usando duas estratégias diferentes: Tradução Dirigida pela Sintaxe e a Tradução Dirigida pela Semântica. Para ilustrar a diferença entre as duas vai ser resolvido o mesmo problema usando os dois tipos de tradução. Enunciado A Orientação, na sua variante pedestre, é um desporto com grande desenvolvimento em Portugal. Basicamente, um atleta recebe um mapa que tem um percurso desenhado; nesse percurso, há uma série de pontos quentes assinalados que o atleta terá que visitar pela ordem em que estão numerados; no fim do percurso, quando retorna ao ponto de partida, é classificado em função do número de pontos visitados e do tempo gasto.em cada prova os concorrentes são agrupados em escalões etários, aos quais correspondem percursos diferentes. Para ajuda à organização de provas pretende-se desenvolver um sistema que permita definir uma prova através da especificação da lista de percursos (cada percurso será, por sua vez, uma lista de pontos quentes) que a compõem, 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 uma prova; e que desenvolva um processador que calcule o comprimento de cada percurso e gere instruções em GraphViz para desenhar os percursos. Essas instruções serão posteriormente usadas pelo interpretador de GraphViz para desenhar o grafo que modela os vários percursos da prova. A linguagem pedida deve permitir que se comece por identificar todos os pontos quentes do terreno onde a prova vai decorrer, sendo que cada ponto será identificado por uma sigla e pelas suas duas coordenadas cartesianas. Depois a linguagem servirá para definir cada percurso, indicando o seu nome, o escalão etário a que se destina e a lista de pontos (referidos pelas respectivas siglas) que o compõem. Esta lista é que determina a ordem de visita. Na subsecção 2.1.5, onde se testa o programa desenvolvido, está um exemplo de um texto-fonte (ficheiro de entrada), do ficheiro de saída gerado com os comandos dot e da respectiva visualização criada pelo GraphViz. Análise do enunciado e Estratégia de desenvolvimento Visto que se pretende, como explicitado no enunciado, definir uma linguagem para planeamento de provas de orientação, é óbvio que o programa a desenvolver para resolução deste problema é um processador de linguagens. O processador em causa pode e deve ter uma dupla tarefa: por um lado, efectuar o cálculo do comprimento de cada percurso a partir das coordenadas cartesianas dos pontos quentes. Recorde-se que a distância entre dois pontos pode ser calculada pela 21

22 CAPÍTULO 2. TRADUÇÃO DE LINGUAGENS fórmula: dist = y2 y1 2 + x2 x1 2 por outro lado, gerar um texto de saída, numa linguagem específica (dot), capaz de ser interpretado por um gerador automático de desenhos (GraphViz). O desenvolvimento do programa consiste na criação de uma gramática representativa da linguagem fonte pedida e na definição de acções que se associarão à gramática de modo a produzir os dois resultados enumerados acima. 2.1 Tradução Dirigida pela Sintaxe A Tradução Dirigida pela Sintaxe baseia-se nas regras sintácticas, ou seja, as frases do texto de saída são construídas à medida que são efectuadas as derivações pelas produções da gramática durante o reconhecimento do texto fonte. É então implementada uma Gramática Tradutora cujas símbolos terminais se dividem agora em símbolos de entrada e símbolos de acções. Esta abordagem pode ser implementada usando ferramentas como o LEX/YACC. Uma gramática tradutora que é criada em duas fases: escrita da gramática independente de contexto (seguindo o formato dos dados de entrada) secção 2.1.2; e especificação de um conjunto de acções que extraem informação do texto fonte com o objectivo de produzir os resultados esperados secção Construção do Tradutor Passo a Passo Identificação da Estrutura dos Dados de Entrada Analisar um exemplo de texto fonte ajuda a compreender os objectos de processamento envolvidos. O texto fonte tem que definir pontos e percursos tal como o enunciado indica. Um exemplo poderá 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 texto define um ponto ou um percurso. Para identificar univocamente os pontos é usada uma letra maiúscula, indicando-se para cada um a sua localização através de um par de coordenadas como localização. A definição de cada percurso é constituída por um nome (uma palavra), a faixa etária (idade a partir da qual se pode efectuar a prova) e uma lista de pontos (apenas representados pelo respectivo identificador (letra maiúscula)) que define o percurso propriamente dito. Identificação dos Resultados a obter com o processamento O resultado final pretendido é um desenho do grafo representativo de todos os percursos; é, também, pedida a distância total de cada percurso. Para tal, a primeira tarefa é verificar a informação necessária para gerar essa saída. Muitas vezes essa informação não é extraída directamente do texto fonte sendo necessário efectuar cálculos preliminares. Neste caso, o grafo deverá indicar a distância entre pontos e essa informação deve ser calculada com base nos pontos do percurso e antes de ser gerada a saída. O desenho produzido distingue também os percursos usando etiquetas e mostra informação relativa a cada troço. Para gerar este tipo de saída e para efectuar os cálculos será necessário que a informação sobre as coordenadas dos pontos seja posta numa estrutura auxiliar em memória, sobre a qual as acções irão trabalhar. A informação é inserida na estrutura à medida que se processa o ficheiro de entrada. O texto de saída estará escrito na linguagem dot, interpretada pela ferramenta GraphViz. 22

23 2.1. TRADUÇÃO DIRIGIDA PELA SINTAXE Gramática Independente de Contexto O texto (Símbolo Texto - axioma da gramática) divide-se claramente em duas partes distintas: definição de pontos e definição de percursos. Cada uma dessas partes será representada por um símbolo nãoterminal da gramática (não-terminal porque cada uma destas partes irá ser também dividida): o símbolo Pontos e o símbolo Percursos. Assim, podemos já escrever a primeira regra de derivação: Texto: Pontos Percursos O símbolo Pontos representa um conjunto de um ou mais pontos. Neste caso é usada a recursividade como uma forma finita de especificar um número indeterminado de pontos. Para tal são especificadas duas produções: Pontos: Ponto Pontos Ponto A recursividade à direita, tal como foi especificado implica que a segunda produção (Pontos: Ponto) represente o último ponto da lista. Cada ponto (Ponto) engloba o conceito de sigla e coordenadas e pode ser especificado pela produção: Ponto: sigla ( num, num ) O símbolo sigla é um símbolo terminal porque não existirá uma produção que tenha esse símbolo do lado esquerdo, o que significa que não se divide noutros símbolos. O mesmo acontece com o símbolo num que representa um número inteiro. Esta produção não tem símbolos não-terminais do lado direito o que indica que não dará origem a novas produções. Existem, no entanto dois tipos de símbolos terminais: uns que correspondem a partes fixas do texto (parênteses e vírgula) e outros que correspondem a partes variáveis (letras e números). Voltando à primeira produção da gramática, o símbolo Percursos pode derivar pelas produções: Percursos: Percursos Percurso Percurso Estas duas produções indicam que um conjunto de percursos é constituído por um ou mais percursos. Usou-se a recursividade à esquerda para explicar que, neste caso, a produção Percursos: Percurso representa o primeiro percurso que foi definido no texto de entrada. Cada percurso será definido por um nome, uma faixa etária e uma lista de pontos. Percurso : nome Faixa ( Lista ) O símbolo nome é um símbolo terminal e o símbolo Faixa pode ser definido da seguinte forma: Faixa : ( > num ) O símbolo Lista é um não-terminal que representa a sequência de pontos. As duas produções seguintes escrevem-se com base na recursividade à esquerda de modo a representar essa sequência. Lista : Lista, sigla sigla Cada ponto é definido por uma sigla logo o símbolo Lista representa um conjunto de siglas. Os símbolos (, ),, e > são terminais literais e devem surgir no texto fonte tal como foram definidos na gramática. Não têm valor intrínseco, valem por si próprios. Os terminais nome, num e sigla têm um valor intrínseco captado pela análise léxica e usado nos cálculos da gramática tradutora. Esta gramática, agora completa 1 representa a sintaxe da linguagem fonte. Cada um dos símbolos terminais deve ser definido na especificação léxica: uma sigla é uma letra maiúscula, um número é composto por um ou mais (+) algarismos e o nome do percurso é uma sequência de uma ou mais (+) letras minúsculas e/ou maiúsculas. No flex são usadas as seguintes expressões regulares: sigla [A-Z] num [0-9]+ nome [a-za-z]+ 1 visto que já não há símbolos não-terminais para definir 23

24 CAPÍTULO 2. TRADUÇÃO DE LINGUAGENS Gramática Tradutora A gramática tradutora resulta da associação de acções semânticas à gramática independente de contexto. 2 Primeira Tarefa - Cálculo do número de pontos quentes Em face da gramática independente de contexto são escolhidas as produções às quais se devem associar acções para o cálculo pretendido. Neste caso, a contagem do número de pontos deve ser feita na produção p4. Uma variável auxiliar será incrementada por cada ponto detectado no texto fonte. % int cont1=0; % %% p1 Texto: Pontos printf("n o pontos: %d\n",cont1); Percursos p2 Pontos: Ponto Pontos p3 Ponto p4 ponto: SIGLA ( NUM, NUM ) cont1++; A variável cont1 é inicializada a zero e, no fim da definição de todos os pontos (depois do símbolo Pontos), o seu valor é escrito no texto de saída. Na gramática o reconhecimento do símbolo Pontos significa que todos os pontos já foram analisados e que o valor calculado pode ser imprimido. A contagem dos pontos poderia também ter sido feitas noutras produções: p2 p3 Pontos: Ponto cont1++; Pontos Ponto cont1++; As produções p2 e p3 representam o conjunto de pontos do percurso e, por cada símbolo Ponto reconhecido o contador seria incrementado. É de notar que, neste caso, nem todas as acções estão no final da produção. Na produção p2 a acção está entre os dois símbolos do lado direito da produção. Isto significa que a acção irá ser executada logo após o reconhecimento de cada ponto. Segunda Tarefa - Cálculo do número de percursos A contagem do número de percursos é muito semelhante ao cálculo do número de pontos. Podemos usar uma variável auxiliar cont2 associada ao símbolo Percurso. O valor final desta variável poderá ser imprimido depois do reconhecimento de todos os percursos (após o símbolo Percursos quando este se encontra no lado direito de uma produção). p1 Texto: Pontos Percursos printf(" N o de percursos: %d\n",cont2); p5 Percursos: Percursos Percurso p6 Percurso p7 Percurso : nome Faixa ( Lista ) cont2++; Terceira Tarefa - Cálculo do número de pontos de um percurso Embora não faça parte dos pedidos contidos no enunciado, decidiu-se incluir o cálculo do número de pontos de um percurso por se considerar que é uma informação extra, fácil de obter e útil para organizador das provas. Os pontos de um percurso estão identificados por um conjunto de siglas. O símbolo Lista representa esse conjunto nas produções p9 e p10. p7 Percurso : nome Faixa ( Lista ) printf("n o de pontos:%d\n",cont3); cont3=0; p8 Faixa : ( > num ) p9 Lista : Lista, sigla cont3++; p10 sigla cont3=1; 2 Para cumprir o objectivo pedagógico deste documento e em particular deste exemplo serão apresentados alguns cálculos adicionais que não são precisos para a saída pretendida mas que ajudam a entender a associação entre as produções e as acções. 24

25 2.1. TRADUÇÃO DIRIGIDA PELA SINTAXE A variável cont3 contem o número de pontos de um percurso e é necessário imprimir e reinicializar o seu valor para que um outro percurso possa ser calculado. Estas acções devem ser executadas no final de cada percurso portanto a acção é especificada no fim da produção p7. De notar que, neste caso, a produção p10 representa o primeiro ponto do percurso. Como o objectivo aqui é contar os pontos é indiferente a ordem pela qual essa contagem é feita, no entanto, para outro tipo de acções (por exemplo, qual o último ponto do percurso) essa ordem pode ser importante. O facto desta produção representar o primeiro ponto está relacionado com a produção p9 que implementa uma recursividade à esquerda. Usando uma recursividade à direita a produção p10 representava o último ponto do percurso. 3. Quarta Tarefa - Cálculo da distância de um percurso Para calcular a distância entre quaisquer dois pontos é mais fácil se toda a informação sobre pontos estiver numa estrutura auxiliar. Assim sendo as acções incluídas na gramática tem apenas por objectivo fazer a inserção 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 produção p4 representa um ponto. É nessa produção que deve ser invocada uma função de inserção na lista ligada. p1 Texto: Pontos Percursos p2 Pontos: Ponto Pontos p3 Ponto p4 Ponto: sigla ( num, num ) pts=inserirpontosquentes(pts,$1,$3,$5); A função inserirpontosquentes tem quatro parâmetros: a lista de pontos, a sigla e duas coordenadas. $1 é valor intrínseco do primeiro símbolo da lado direito da produção, da mesma forma que $3 é valor do terceiro símbolo e $5 do quinto. Esse valor é extraído do texto fonte pelo analisador léxico e mesmo acontece em todos os símbolos terminais não-literais. É sempre possível acrescentar código C à especificação Yacc para definição de estruturas e funções. Para calcular a distância entre dois pontos consecutivos de um percurso e sabendo que todos os pontos e respectivas coordenadas estão armazenados na lista ligada, será possível invocar uma função em C que use a fórmula apresentada no enunciado do problema. Essa função é usada na produção p9 onde estão representados dois pontos do percurso, ou seja, nesta produção é calculada a distância de um troço do percurso. Se a distância dos vários troços for acumulado numa variável soma no final do percurso, essa variável representa a distância total. p7 Percurso : nome Faixa soma=0; ( Lista ) printf("dist^ancia total do percurso %s é %f\n",$1,soma); p8 Faixa : ( > num ) p9 Lista : Lista, sigla soma += distanciaentre2pontos($1,$3); p10 sigla $$=$1; Na produção p7 representa um percurso de prova e é nesta produção que deve ser inicializada a variável soma (antes do símbolo Lista) e imprimido o seu valor final (depois do símbolo Lista). Estas novas acções semânticas permitem que sejam apresentados os nomes de todos os percursos e respectivas distâncias. 3 Esta é uma das razões pelas quais se opta sempre pela recursividade à esquerda 25

26 CAPÍTULO 2. TRADUÇÃO DE LINGUAGENS Quinta Tarefa - Geração do código GraphViz Para gerar o código de saída invoca-se funções de escrita em várias produções da gramática dependendo da formatação pretendida. Antes de processar a informação relativa aos percursos é imprimido o cabeçalho do texto de saída e o fecho é escrito após o reconhecimento desses mesmos percursos (produção 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 é gerado código sobre o nome, faixa etária e comprimento (produção p7). Cada troço é identificado por duas siglas e é na produção p9 que se calcula a distância desse troço e se gera o código respectivo. Assim o texto de saída é uma especificação de todos os percursos e respectivos troços, incluindo distâncias parciais e totais (ver 2.1.5) Geração do Processador Para gerar automaticamente o processador de linguagens que resolve o problema proposto e que segue a abordagem tradução dirigida pela sintaxe escolhida inicialmente, é preciso proceder em 2 passos: 1. gerar um analisador léxico (para abrir e ler o ficheiro que contém o texto-fonte e converter todas as palavras em símbolos terminais da gramática) esta tarefa será realizada pelo gerador Flex. 2. gerar um tradutor 4 (para reconhecer a sequência de símbolos terminais do texto-fonte e produzir a saída pedida) esta tarefa será realizada pelo gerador Yacc, O Flex gera uma função de análise léxica, yylex(), que está contida no ficheiro lex.yy.c, o qual é incluído no ficheiro y.tab.c gerado pelo Yacc; este ficheiro, além de conter a função de parsing e tradução, yyparse(), inclui a função main() do processador de linguagens pretendido. Geração do Analisador Léxico com o Flex Para que a ferramenta Flex possa gerar a função em C yylex() que irá fazer a análise léxica é necessário escrever num ficheiro que designaremos por orient.l os símbolos terminais identificados ao longo da secção A especificação desses símbolos terminais é feita escrevendo as respectivas expressões regulares na notação própria do Flex. Neste ficheiro de especificação define-se então os três grupos de caracteres que foram mencionados em Nessa parte é ainda feita uma quarta definição para agrupar todos 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] ; 4 Analisador Sintáctico, Analisador Semântico e Transformador. 26

27 2.1. TRADUÇÃO DIRIGIDA PELA SINTAXE. printf("caracter invalido"); %% yywrap() return 1; Geração do Tradutor com o Yacc Para que a ferramenta Yacc possa gerar a função em C yyparse() que irá fazer a análise sintáctica e semântica é necessário escrever num ficheiro que designaremos por orient.y as produções da gramática independente de contexto identificadas ao longo da secção 2.1.2, associando-lhes as acções semânticas definidas ao longo da secção A especificação dessa gramática tradutora é feita escrevendo as regras de derivação na notação própria do Yacc e codificando as acções em C. A especificação requer que se declarem na parte inicial do ficheiro (até à primeira linha começada por %%) os símbolos terminais e símbolos não-terminais, o axioma e os tipos que se associam aos símbolos para transportar o seu valor semântico. Ainda nessa primeira parte serão incluídas todas as declarações tipos, constantes, variáveis e funções em C requeridas pelo código das acções semânticas. Na parte final (após a segunda linha começada por %%) inclui-se o ficheiro lex.yy.c gerado pela ferramenta Flex e o ficheiro orient.c que contem a definição das funções que implementam as acções semânticas. %... 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 Sintáctico...\n"); return 0; 27

28 CAPÍTULO 2. TRADUÇÃO DE LINGUAGENS O resultado de executar o Yacc sobre este ficheiro é gravado no ficheiro y.tab.c Teste ao Processador Gerado Uma vez gerado o tradutor com a ajuda das ferramentas Flex e Yacc (seguindo a par e passo o que se disse na secção 2.1.4) é necessário compilar os programas contidos nos ficheiros lex.yy.c e y.tab.c para depois 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 obtêm-se o processador de linguagens pedido que ficará, em formato executável gravado no ficheiro orienta. Para efectuar um teste exaustivo, o tradutor deve ser aplicado a textos que retratem situações sem erros, ou seja, textos fonte com definição correcta de pontos e percursos. Deve também ser aplicado a situações com erros sintácticos e se possível semânticos. Dada a extensão implícita deste teste exaustivo apenas incluímos aqui um caso de texto correcto e uma situação com erros sintácticos. Exemplo1 Neste caso, executa-se o processador gerado com o seguinte texto que contem a definição de 4 pontos e 3 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

Processamento de Linguagens I LESI + LMCC (3 o ano)

Processamento de Linguagens I LESI + LMCC (3 o ano) Processamento de Linguagens I LESI + LMCC (3 o ano) Trabalho Prático n o 1 (Lex e Yacc) Ano lectivo 2003/2004 1 Objectivos e Organização Este trabalho prático tem como principais objectivos: aumentar a

Leia mais

Processamento de Linguagens I LESI + LMCC (3 o ano)

Processamento de Linguagens I LESI + LMCC (3 o ano) Processamento de Linguagens I LESI + LMCC (3 o ano) 3 o Ficha Prática Ano Lectivo de 05/06 1 Objectivos Este ficha prática contém 1 exercício para ser resolvido nas aulas teórico-práticas com vista a consolidar

Leia mais

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison Ferramentas Flex/Bison Prof. Sergio F. Ribeiro Lex e Yacc / Flex e Bison São ferramentas de auxílio na escrita de programas que promovem transformações sobre entradas estruturadas. São ferramentas desenvolvidas

Leia mais

Construção de Compiladores Aula 3 - Analisador Sintático

Construção de Compiladores Aula 3 - Analisador Sintático Construção de Compiladores Aula 3 - Analisador Sintático Bruno Müller Junior Departamento de Informática UFPR 20 de Agosto de 2014 Definição A análise sintática (parsing) é um processo que verifica se

Leia mais

Linguagens e Programação Gramáticas. Paulo Proença

Linguagens e Programação Gramáticas. Paulo Proença Linguagens e Programação Gramáticas Gramáticas Ferramenta para a descrição e análise de linguagens; Baseada num conjunto de regras que especificam o modo de construção das frases válidas na linguagem;

Leia mais

Curso de Engenharia de Computação - UTFPR Teoria da Computação - Prof. Celso Kaestner Lista de exercícios

Curso de Engenharia de Computação - UTFPR Teoria da Computação - Prof. Celso Kaestner Lista de exercícios Curso de Engenharia de Computação - UTFPR Teoria da Computação - Prof. Celso Kaestner Lista de exercícios 1. Escreva a expressão regular para as seguintes linguagens sobre o alfabeto {0, 1}: strings começando

Leia mais

Folha 3 - Análise léxica

Folha 3 - Análise léxica Folha 3 Análise léxica 1. Escrever um programa em FLEX que permite contar o número de ocorrências de uma cadeia de caracteres contida num ficheiro de texto. 2. Escrever um programa em FLEX que permite

Leia mais

Linguagens Formais e Autómatos

Linguagens Formais e Autómatos Parte teórica - Duração: 5 min Nome Número Atenção: Responda às perguntas na folha do enunciado ndique o seu número e nome A prova é sem consulta Cada resposta errada terá uma cotação negativa de 2/3 do

Leia mais

Apostila 03 - Linguagens Livres de Contexto Exercícios

Apostila 03 - Linguagens Livres de Contexto Exercícios Cursos: Bacharelado em Ciência da Computação e Bacharelado em Sistemas de Informação Disciplinas: (1493A) Teoria da Computação e Linguagens Formais, (4623A) Teoria da Computação e Linguagens Formais e

Leia mais

Marcos Castilho. DInf/UFPR. 21 de março de 2019

Marcos Castilho. DInf/UFPR. 21 de março de 2019 21 de março de 2019 Análise sintática: introdução Dada uma gramática G e uma palavra w Σ, como saber se w L(G)? Isto é, como saber se S = G w? Derivações à esquerda e ambiguidade w L(G) se S = G w; Sabemos

Leia mais

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA) Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA) Análise Léxica A primeira fase da compilação Recebe os caracteres de entrada do programa e os converte em um fluxo de

Leia mais

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem Conceitos Básicos Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem Alfabeto ou Vocabulário: Conjunto finito não vazio de símbolos. Símbolo é um elemento qualquer de um alfabeto.

Leia mais

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO LINGUAGEM LIVRE DE CONTEXTO As Linguagens Livres de Contexto é um reconhecedor de linguagens, capaz de aceitar palavras corretas (cadeia, sentenças) da linguagem. Por exemplo, os autômatos. Um gerador

Leia mais

Conceitos básicos de Teoria da Computação

Conceitos básicos de Teoria da Computação Folha Prática Conceitos básicos de 1 Conceitos básicos de Métodos de Prova 1. Provar por indução matemática que para todo o número natural n: a) 1 + 2 + 2 2 + + 2 n = 2 n+1 1, para n 0 b) 1 2 + 2 2 + 3

Leia mais

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação Compiladores Analisador Sintático Prof. Antonio Felicio Netto antonio.felicio@anhanguera.com Ciência da Computação 1 Análise Sintática - A Análise Sintática constitui a segunda fase de um tradutor de uma

Leia mais

Linguagem C Princípios Básicos (parte 1)

Linguagem C Princípios Básicos (parte 1) Linguagem C Princípios Básicos (parte 1) Objetivos O principal objetivo deste artigo é explicar alguns conceitos fundamentais de programação em C. No final será implementado um programa envolvendo todos

Leia mais

Compiladores Aula 4. Celso Olivete Júnior.

Compiladores Aula 4. Celso Olivete Júnior. Aula 4 Celso Olivete Júnior olivete@fct.unesp.br Na aula de hoje... Revisão: gramáticas Relações em uma gramática: Cabeça, Último, Primeiro (First) e Seguinte (Follow) Capítulo 4 (seção 4.4.2) do livro

Leia mais

Trabalho de Linguagens Formais e Compilação

Trabalho de Linguagens Formais e Compilação Trabalho de Linguagens Formais e Compilação Desenho de uma linguagem simples e do seu compilador para MIPS. (cod. 5387) Departamento de Informática Universidade da Beira Interior Ano lectivo 2012/2013

Leia mais

Linguagens Livres do Contexto. Adaptado de H. Brandão

Linguagens Livres do Contexto. Adaptado de H. Brandão Linguagens Livres do Contexto Adaptado de H. Brandão Linguagens Livres do Contexto Para as LLC, temos as Gramáticas Livres do Contexto; Linguagens Livres do Contexto Para as LLC, temos as Gramáticas Livres

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Programação Linguagens de Programação: sintaxe e semântica de linguagens de programação e conceitos de linguagens interpretadas e compiladas Engenharia da Computação Professor: Críston Pereira

Leia mais

Linguagens de Programação

Linguagens de Programação Linguagens de Programação 128 13 129 Linguagens de Programação Uma linguagem de programação é um vocabulário e um conjunto de regras gramaticais usadas para escrever programas de computador. Esses programas

Leia mais

Construção de Compiladores Aula 16 - Análise Sintática

Construção de Compiladores Aula 16 - Análise Sintática Construção de Compiladores Aula 16 - Análise Sintática Bruno Müller Junior Departamento de Informática UFPR 25 de Setembro de 2014 1 Introdução Hierarquia de Chomsky Reconhecedores Linguagens Livres de

Leia mais

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013 Análise Sintática Compiladores Cristina C. Vieira 1 Árvore Sintática Nós internos: símbolos não-terminais Folhas: símbolos terminais Arcos: de símbolos não-terminais do LHS da produção para nós do RHS

Leia mais

COMPILADORES. Revisão Linguagens formais Parte 01. Geovane Griesang

COMPILADORES. Revisão Linguagens formais Parte 01. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Revisão Linguagens formais Parte 01 geovanegriesang@unisc.br Legenda: = sigma (somatório) = delta ε = épsilon λ = lambda

Leia mais

Compiladores. Prof. Bruno Moreno Aula 8 02/05/2011

Compiladores. Prof. Bruno Moreno Aula 8 02/05/2011 Compiladores Prof. Bruno Moreno Aula 8 02/05/2011 RECONHECIMENTO DE TOKENS Reconhecimento de Tokens Até aqui aprendemos a identificar tokens Para reconhecimento, a única abordagem utilizada foi árvores

Leia mais

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1 Definição de uma Linguagem Linguagem= sintaxe + semântica Especificação da sintaxe: gramática livre de contexto, BNF (Backus-Naur Form) Especificação Semântica: informal (textual), operacional, denotacional,

Leia mais

Expressões e Gramáticas Regulares e Autómatos Finitos

Expressões e Gramáticas Regulares e Autómatos Finitos Folha Prática Expressões e Gramáticas Regulares e Autómatos Finitos 1 Expressões e Gramáticas Regulares e Autómatos Finitos Expressões Regulares e Autómatos Finitos 1. Determine e implemente computacionalmente

Leia mais

COMPILADORES. Revisão Linguagens formais Parte 02. Prof. Geovane Griesang

COMPILADORES. Revisão Linguagens formais Parte 02. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Revisão Linguagens formais Parte 02 Prof. geovanegriesang@unisc.br Legenda: = sigma (somatório) = delta ε = epsilon λ =

Leia mais

Análise Sintática. Fabiano Baldo

Análise Sintática. Fabiano Baldo Compiladores Análise Sintática Fabiano Baldo Gramáticas Livre de Contexto (GLC) É utilizada na especificação formal lda sintaxe de uma linguagem de programação. É um conjunto de produções ou regras gramaticais

Leia mais

Construção de Compiladores

Construção de Compiladores Construção de Compiladores Parte 1 Introdução Linguagens e Gramáticas F.A. Vanini IC Unicamp Klais Soluções Motivação Porque compiladores? São ferramentas fundamentais no processo de desenvolvimento de

Leia mais

Analisadores Descendentes Tabulares; Cjs First Follow

Analisadores Descendentes Tabulares; Cjs First Follow Conteúdo da aula nalisadores Descendentes Tabulares; Cjs First Follow Marcelo Johann nalisadores Descendentes Recursivos com Retrocesso Recursivos Preditivos Conjunto FIRT e Implementação nalisador Preditivo

Leia mais

TÉCNICO DE INFORMÁTICA - SISTEMAS

TÉCNICO DE INFORMÁTICA - SISTEMAS 782 - Programação em C/C++ - estrutura básica e conceitos fundamentais Linguagens de programação Linguagem de programação são conjuntos de palavras formais, utilizadas na escrita de programas, para enunciar

Leia mais

Introdução à Programação. João Manuel R. S. Tavares

Introdução à Programação. João Manuel R. S. Tavares Introdução à Programação João Manuel R. S. Tavares Sumário 1. Ciclo de desenvolvimento de um programa; 2. Descrição de algoritmos; 3. Desenvolvimento modular de programas; 4. Estruturas de controlo de

Leia mais

CP Compiladores I Prof. Msc.. Carlos de Salles

CP Compiladores I Prof. Msc.. Carlos de Salles CP 5017.9 Prof. Msc.. Carlos de Salles 1 - EMENTA O Processo de Compilação. Deteção e Recuperação de Erros. Introdução à geração de Código Intermediário. Geração de Código de Máquina. Otimização. Uma visão

Leia mais

Programação: Vetores

Programação: Vetores Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Program João Manuel R. S. Tavares Sumário 1. Ciclo de desenvolvimento de um programa; 2. Descrição de algoritmos; 3. Desenvolvimento modular de programas; 4. Estruturas de controlo de um programa.

Leia mais

Lex Adaptação da obra original de Tom Niemann

Lex Adaptação da obra original de Tom Niemann LEX Lex Adaptação da obra original de Tom Niemann Durante a primeira fase, o compilador lê a entrada e converte as strings na origem para os tokens. Com expressões regulares, podemos especificar padrões

Leia mais

1 d=

1 d= O que faz/o que é Como usar / Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas / Exemplos The Lex & YACC page: http://dinosaur.compilertools.net/ Flex: versão livre http://simplesamples.info/c++/flex.php

Leia mais

Alfabeto, Cadeias, Operações e Linguagens

Alfabeto, Cadeias, Operações e Linguagens Linguagens de Programação e Compiladores - Aula 3 1 Alfabeto, Cadeias, Operações e Linguagens 1.Conjuntos Para representar um determinado conjunto é necessário buscar uma notação para representá-lo e ter

Leia mais

Algoritmos e Programação

Algoritmos e Programação Algoritmos e Programação Aula 3 Introdução a Linguagem C Profa. Marina Gomes marinagomes@unipampa.edu.br 1 Aula de Hoje - Criar programas simples em C utilizando a estrutura básica; - Declarar variáveis;

Leia mais

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto Compiladores Análise sintática (2) Análise Top-Down Lembrando... Gramáticas Livres de Contexto Análise sintática = parsing. Baseada em GLCs Gramática: S A B Top-Down Bottom-Up S AB cb ccbb ccbca S AB A

Leia mais

Linguagens Livres de Contexto

Linguagens Livres de Contexto Linguagens Livres de Contexto 1 Roteiro Gramáticas livres de contexto Representação de linguagens livres de contexto Formas normais para gramáticas livres de contexto Gramáticas ambíguas Autômatos de Pilha

Leia mais

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais UNIVERSIDADE FEDERAL DO PARÁ INSTITUTO DE CIÊNCIAS EXATAS E NATURAIS FACULDADE DE COMPUTAÇÃO CURSO DE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof.

Leia mais

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador Estrutura de um compilador programa fonte Compiladores Análise lexical () Expressões Regulares analisador léxico analisador sintático analisador semântico análise gerador de código intermediário otimizador

Leia mais

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS Acadêmico: Roger Anderson Schmidt Orientador : Marcel Hugo Supervisor : Ricardo de Freitas Becker Empresa

Leia mais

V.2 Especificação Sintática de Linguagens de Programação

V.2 Especificação Sintática de Linguagens de Programação V.2 Especificação Sintática de Linguagens de Programação Deve ser baseada: No planejamento da Linguagem / Compilador Objetivos, Filosofia, Potencialidades,... Nos critérios de projeto/avaliação Legibilidade,

Leia mais

Gramática. Prof. Yandre Maldonado e Gomes da Costa. Prof. Yandre Maldonado - 1

Gramática. Prof. Yandre Maldonado e Gomes da Costa. Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Prof. Yandre Maldonado - 2 Mecanismo gerador que permite definir formalmente uma linguagem; Através de uma gramática

Leia mais

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior. LFA Aula 09 Gramáticas e Linguagens Livres de Contexto (Hopcroft, 2002) 18/01/2016 Celso Olivete Júnior olivete@fct.unesp.br www.fct.unesp.br/docentes/dmec/olivete/lfa 1 Classes Gramaticais Linguagens

Leia mais

Gramática. Gramática. Gramática

Gramática. Gramática. Gramática Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Prof. Yandre Maldonado - 2 Mecanismo gerador que permite definir formalmente uma linguagem; Através de uma gramática

Leia mais

Ficha da Unidade Curricular

Ficha da Unidade Curricular Ficha da Unidade Curricular Curso: Engenharia Informática Ano Lectivo: 2008/09 Unidade Curr.: Processamento de Linguagens Ano Curricular: 3º Créditos: 6 Responsável: Maria João Varanda Regime: Anual X

Leia mais

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S. Análise léxica Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros Prof. Thiago A. S. Pardo 1 Estrutura geral de um compilador programa-fonte analisador

Leia mais

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07 Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07 Ficha 3 Autómatos Finitos Objectivos: Introdução ao conceito de Autómato Finito e notações utilizadas na sua representação;

Leia mais

Compiladores - JACC. Fabio Mascarenhas

Compiladores - JACC. Fabio Mascarenhas Compiladores - JACC Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp JACC Gerador de analisadores sintáticos LALR que gera código Java Sintaxe baseada na sintaxe do YACC (e de muitos outros

Leia mais

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Análise sintática Parte 02 Prof. geovanegriesang@unisc.br Data Conteúdo 23/09/2013 3. Análise Sintática: 3.1 analisadores

Leia mais

Hierarquia de Chomsky Exemplos de gramáticas

Hierarquia de Chomsky Exemplos de gramáticas Hierarquia de Chomsky Exemplos de gramáticas 1 Formalmente, as gramáticas são caracterizadas como quádruplas ordenadas G = ( Vn, Vt, P, S) onde: Vn representa o vocabulário não terminal da gramática. Este

Leia mais

Gramáticas e Linguagens Independentes de Contexto

Gramáticas e Linguagens Independentes de Contexto Gramáticas e Linguagens Independentes de Contexto 6.1 Responde às uestões seguintes considerando a gramática independente de contexto G = (V, {a, b}, P, R), onde o conjunto de regras P é: R XRX S S at

Leia mais

Estrutura geral de um compilador programa-fonte

Estrutura geral de um compilador programa-fonte Análise léxica Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros Prof. Thiago A. S. Pardo 1 Estrutura geral de um compilador programa-fonte analisador

Leia mais

Conceitos Básicos de Programação

Conceitos Básicos de Programação BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de

Leia mais

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores 2013-2 Compilador para a Linguagem Cafezinho Especificação dos trabalhos: T2 (Geração da Representação Intermediária e Análise

Leia mais

Linguagens Regulares. Prof. Daniel Oliveira

Linguagens Regulares. Prof. Daniel Oliveira Linguagens Regulares Prof. Daniel Oliveira Linguagens Regulares Linguagens Regulares ou Tipo 3 Hierarquia de Chomsky Linguagens Regulares Aborda-se os seguintes formalismos: Autômatos Finitos Expressões

Leia mais

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95 PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95 Exercícios de revisão Lista 01: a) Monte um mapa conceitual indicando as relações entre os seguintes conceitos, no contexto do assunto visto em aula:

Leia mais

Linguagens Formais - Preliminares

Linguagens Formais - Preliminares Linguagens Formais - Preliminares Regivan H. N. Santiago DIMAp-UFRN 25 de fevereiro de 2007 Regivan H. N. Santiago (DIMAp-UFRN) Linguagens Formais - Preliminares 25 de fevereiro de 2007 1 / 26 Algumas

Leia mais

aceita, l L R L (l) = erro, l L

aceita, l L R L (l) = erro, l L 26 Capítulo 3 Análise Lexical A análise lexical é a primeira fase de um compilador A sua tarefa é a de ler a sequência de caracteres do canal de entrada e produzir uma sequência de palavras (lexemas) As

Leia mais

Análise Sintática Introdução

Análise Sintática Introdução Análise Sintática Introdução Renato Ferreira Linguagens e Automatas Linguagens formais são importantes em Computação Especialmente em linguagens de programação Linguagens regulares A linguagem formal mais

Leia mais

Análise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR

Análise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR Análise Bottom-Up Compiladores Análise sintática 5) Gramáticas SLR), LR) e LALR String Entrada -> Símbolo Inicial Regras aplicadas em reverso adiar decisões mais poderoso Noção de handle, redução, uso

Leia mais

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente Compiladores - Análise Ascendente Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp Análise Descendente vs. Ascendente As técnicas de análise que vimos até agora (recursiva com retrocesso,

Leia mais

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42 Análise Sintática I Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Abril, 2017 1 / 42 Sumário 1 Introdução 2 Derivações 3 Ambiguidade 4 Análise sintática descendente

Leia mais

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior. LFA Aula 02 Linguagens regulares - introdução 28/09/2015 Celso Olivete Júnior olivete@fct.unesp.br 1 Na aula passada... Visão geral Linguagens regulares expressões regulares autômatos finitos gramáticas

Leia mais

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente Compiladores - Análise Ascendente Fabio Mascarenhas - 2013.2 http://www.dcc.ufrj.br/~fabiom/comp Análise Descendente vs. Ascendente As técnicas de análise que vimos até agora (recursiva com retrocesso,

Leia mais

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1 PREÂMBULO PREFÂCIO xiii xv I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1 1 1.1 1.1.1 1.1.2 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 2 2.1 2.2 2.2.1 2.2.2 2.3 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.4 2.4.1 2.4.2

Leia mais

Teoria da Computação Gramáticas, Linguagens Algébricas e Autómatos de Pilha

Teoria da Computação Gramáticas, Linguagens Algébricas e Autómatos de Pilha Teoria da Computação Gramáticas, Linguagens Algébricas e Autómatos de Pilha Simão Melo de Sousa 12 de Outubro de 2011 Conteúdo 1 Gramáticas e Definições básicas 1 2 Gramáticas e Linguagens 4 2.1 Gramáticas

Leia mais

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC V Análise Sintática V.1 Fundamentos Teóricos V.1.1 G.L.C V.1.2 Teoria de Parsing V.2 Especificação Sintática de Ling. de Prog. V.3 - Implementação de PARSER s V.4 - Especificação Sintática da Linguagem

Leia mais

Modelos de Computação Folha de trabalho n. 8

Modelos de Computação Folha de trabalho n. 8 Modelos de Computação Folha de trabalho n. 8 Nota: Os exercícios obrigatórios marcados de A a D constituem os problemas que devem ser resolvidos individualmente. A resolução em papel deverá ser depositada

Leia mais

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07. Tópicos avançados

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07. Tópicos avançados Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07 Tópicos avançados Este documento apresenta alguns métodos para a resolução de problemas, susceptíveis de ocorrer na resolução

Leia mais

Universidade Federal de Alfenas

Universidade Federal de Alfenas Universidade Federal de Alfenas Linguagens Formais e Autômatos Aula 12 Linguagens Livres do Contexto humberto@bcc.unifal-mg.edu.br Linguagens Livres do Contexto Para as LLC, temos as Gramáticas Livres

Leia mais

Construção de Compiladores Aula 17 - Análise Sintática Descendente

Construção de Compiladores Aula 17 - Análise Sintática Descendente Construção de Compiladores Aula 17 - Análise Sintática Descendente Bruno Müller Junior Departamento de Informática UFPR 3 de Novembro de 2014 1 Análise Sintática Descendente Eliminação de retrocessos Converter

Leia mais

Compiladores - Análise Léxica

Compiladores - Análise Léxica Compiladores - Análise Léxica Fabio Mascarenhas 2017.2 http://www.dcc.ufrj.br/~fabiom/comp Introdução Primeiro passo do front-end: reconhecer tokens Tokens são as palavras do programa O analisador léxico

Leia mais

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34 Análise Sintática II Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Outubro, 2016 1 / 34 Sumário 1 Introdução 2 Ambiguidade 3 Análise sintática descendente 4

Leia mais

Histórico e motivação

Histórico e motivação Expressões regulares 1. Histórico e motivação 2. Definição a) Sintaxe b) Semântica c) Precedência dos operadores 3. Exemplos 4. Leis algébricas 5. Dialetos 6. Aplicações 7. Exercícios Pré-requisito: básico

Leia mais

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores Motivação Prof. Sérgio Faustino Compiladores Conhecimento das estruturas e algoritmos usados na implementação de linguagens: noções importantes sobre uso de memória, eficiência, etc. Aplicabilidade freqüente

Leia mais

Estruturas de Repetição

Estruturas de Repetição Algoritmos e Estruturas de Dados I (DCC/003) Estruturas de Repetição Aula Tópico 4 (while, for) 1 Problema 10 Suponha que soma (+) e subtração (-) são as únicas operações disponíveis em C. Dados dois números

Leia mais

Legibilidade do código fonte

Legibilidade do código fonte Sumário Legibilidade do código fonte Exemplos Normas Instrução switch Sintaxe e Semântica Exemplo Tipos enumerados Exemplo Programação 2007/2008 DEEC-IST 1 Legibilidade do código fonte Exemplo: Considere

Leia mais

3. Linguagem de Programação C

3. Linguagem de Programação C Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3.2. Estrutura de Programas e Representação

Leia mais

Analisador Léxico parte II

Analisador Léxico parte II Analisador Léxico parte II Compiladores Mariella Berger Sumário Definições Regulares Gerador de Analisador Léxico Flex Exemplos As fases de um Compilador Análise Léxica Análise Sintática ANÁLISE Análise

Leia mais

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Análise Semântica Disciplina: Compiladores Equipe: Luiz Carlos dos Anjos Filho José Ferreira Júnior Compiladores Um compilador

Leia mais

Familiarização com a ferramenta JavaCC

Familiarização com a ferramenta JavaCC Ficha nº 2 Familiarização com a ferramenta JavaCC Estrutura do ficheiro JavaCC O JavaCC utiliza um ficheiro com a extensão.jj, onde são descritos, pelo utilizador, o léxico e a sintaxe da linguagem e gera

Leia mais

V Teoria de Parsing. Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada

V Teoria de Parsing. Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada V Teoria de Parsing Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada Ascendentes: S + x (* Seq. Invertida Reducao *) dir Exemplo: Descendentes:

Leia mais

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU Aula 5 Oficina de Programação Introdução ao C Profa. Elaine Faria UFU - 2017 Linguagem de Programação Para que o computador consiga ler um programa e entender o que fazer, este programa deve ser escrito

Leia mais

Os movimentos do reconhecedor correspondem ao uso de derivações mais à esquerda; A árvore de sintaxe é montada de cima para baixo (da raiz em direção

Os movimentos do reconhecedor correspondem ao uso de derivações mais à esquerda; A árvore de sintaxe é montada de cima para baixo (da raiz em direção Os movimentos do reconhecedor correspondem ao uso de derivações mais à esquerda; A árvore de sintaxe é montada de cima para baixo (da raiz em direção às folhas); Caracteriza a classe das gramáticas (e

Leia mais

Aula teórica 7. Preparado por eng.tatiana Kovalenko

Aula teórica 7. Preparado por eng.tatiana Kovalenko Aula teórica 7 Tema 7. Introdução a Programação Ø Linguagens de Programação Ø LP Java ØEstrutura de um programa em Java ØIdentificadores, variáveis e constantes. ØTipos de dados básicos Preparado por eng.tatiana

Leia mais

CAP. VI ANÁLISE SEMÂNTICA

CAP. VI ANÁLISE SEMÂNTICA CAP. VI ANÁLISE SEMÂNTICA VI.1 Introdução Semântica SIGNIFICADO, SENTIDO LÓGICO, COERÊNCIA,... Diferença entre SINTAXE e SEMÂNTICA Sintaxe : descreve as estruturas de uma linguagem; Semântica : descreve

Leia mais

Linguagem C: Introdução

Linguagem C: Introdução Linguagem C: Introdução Linguagem C É uma Linguagem de programação genérica que é utilizada para a criação de programas diversos como: Processadores de texto Planilhas eletrônicas Sistemas operacionais

Leia mais

Linguagem C. André Tavares da Silva.

Linguagem C. André Tavares da Silva. Linguagem C André Tavares da Silva dcc2ats@joinville.udesc.br Variáveis Posição nomeada de memória que é usada para guardar um valor que pode ser modificado pelo programa. Todas as variáveis devem ser

Leia mais

Linguagens Livres de Contexto

Linguagens Livres de Contexto Universidade Católica de Pelotas Centro Politécnico Bacharelado em Ciência da Computação 364018 Linguagens Formais e Autômatos TEXTO 4 Linguagens Livres de Contexto Prof. Luiz A M Palazzo Maio de 2011

Leia mais

TRABALHO Nº 4: Desenvolvimento de um Interpretador ou de um Compilador

TRABALHO Nº 4: Desenvolvimento de um Interpretador ou de um Compilador TRABALHO Nº 4: Desenvolvimento de um Interpretador ou de um Compilador A. Interpretador da Linguagem UAlg+ Pretende-se implementar um interpretador para uma linguagem de programação muito simples, designada

Leia mais

Compiladores 02 Analise léxica

Compiladores 02 Analise léxica Compiladores 02 Analise léxica Sumário Análise Léxica Definição: Lexema, tokens Tabela símbolos Expressões regulares, automatos Relembrando O compilador é dividido em duas etapas Análise Síntese Análise

Leia mais

Trabalho Linguagem e Programação de Compiladores

Trabalho Linguagem e Programação de Compiladores Trabalho Linguagem e Programação de Compiladores Responda as questões. Os exercícios deverão ser desenvolvidos utilizando as estruturas apresentadas em aula e adequadas para cada problema. Forma de entrega:

Leia mais

Introdução à Programação

Introdução à Programação Programação de Computadores Introdução à Programação Prof. Helton Fábio de Matos hfmatos@dcc.ufmg.br Agenda Algoritmo & Programa Variáveis Declaração de tipos Comando de entrada ou de leitura Comando de

Leia mais