Processamento de Linguagens e Compiladores

Transcrição

Processamento de Linguagens e Compiladores
Processamento de Linguagens e Compiladores
LMCC, Universidade do Minho
Ano lectivo 2006/2007
João Saraiva
Ficha Teórico-Prática No 10
Este texto está escrito em literate Haskell. Isto é, pode ser interpretado como um documento LATEX ou como um puro programa na linguagem Haskell. Responda às perguntas
sobre Haskell neste próprio ficheiro para assim produzir o programa e a sua documentação.
1
Pretty Printing
2
Combinadores de Pretty Printing em Haskell
Solução
---- Processamento de Linguagens e Compilaç~
ao
-- 2006/2007
-module PP_MPII where
import LRC_Pretty
-- Biblioteca de Combiandores
-- de pretty printing
Combinador besides (ao lado de): O combinador ao lado de >|< permite mostrar
dois documentos um ao lado do outro. Por exemplo, se pretendermos mostrar a palavra
ola ao lado de mundo fazemos:
Solução
1
ola_besides_mundo
= "ola" >|< "mundo!"
De modo a mostrar o resultado de pretty printing, a biblioteca contém a função render
que dado o documento e a tamanho da página (número de colunas) mostrar a sua representação alindada.
2.1 Utilizando a função render. responda às seguinte perguntas:
1. Mostre o resultado de pretty printing numa página com tamanho 30.
2. Considere agora que a página tem tamanho 5, qual o resultado de pretty printing?
Solução
-- show_ola_mundo_30
=
-- show_ola_mundo_5
=
2.2 O combinador ao lado de com espaço >#< incluı́ um espaço entre os dois documentos.
Utilize este combinador de modo a mostrar as palavras ola e mundo separadas por uma
espaço.
Solução
-- ola_besides_mundo’
=
-- show_ola_mundo’’
=
Combinador above (por cima de): O combinador por cima de >-< permite mostrar
dois documentos um por cima do outro.
2.3 Utilize o combinador por cima de de modo a mostrar a palavra ola por cima da
palavra mundo.
Solução
-- ola_above_mundo
=
-- show_ola_mundo’’’
=
2
Os combinadores ao lado de e por cima de pode sem generalizado de modo a trabalharem sobre listas de documentos. Isto é, listas de documentos em que os seus elememtos
são mostrados na horizontal e vertical, respectivamente.
Solução
hlist, vlist :: PP a => [a] -> PP_Doc
hlist = foldr (>|<) (text "")
vlist = foldr (>-<) (text "")
2.4 Defina uma lista com quatro elementos que são as palavras ola e mundo combinadas
verticalmente. Qual o efeito de utilizar o combinador hlist para combinar essa lista
horizontalmente?
Solução
-- quatro_ola_above_mundo = [
]
Combinador Indentação: O combinador indent permite mostrar um documento indentado n caracteres.
Solução
ola_above_mundo’
= "ola" >-< (indent 4 "mundo!")
show_ola_mundo’’’’
= render ola_above_mundo’ 30
Solução
quatro_ola_besides_mundo = [ ola_besides_mundo , ola_besides_mundo
, ola_besides_mundo , ola_besides_mundo ]
show_ola_mundo’’’’’
= render (fill quatro_ola_besides_mundo) 30
show_ola_mundo’’’’’’ = render (fill quatro_ola_besides_mundo) 60
3
2.5 Considere o tipo de dados abstracto Tabela que define tabelas abstractas apresentado
na Ficha Teórico-Prática no 10. Defina a função de pretty printing ppTabela que apresenta
uma tabela na sua representação HTML.
Solução
-- ppTabela =
2.6 Considere o seguinte tipo de dados algébrico que define a sintaxe abstracta de um
sub-conjunto da linguagem C. Mais concertamente, uma linguagem que é um subconjunto
da lingaugem Bc.
Solução
type Bc = [Stat]
data Stat = Assign String Exp
| If_t_e Exp [Stat] [Stat]
| While
Exp [Stat]
data Exp = AddExp Exp Exp
| AndExp Exp Exp
| DivExp Exp Exp
| EqExp Exp Exp
| Factor Fac
| GTExp Exp Exp
| LTExp Exp Exp
| MinExp Exp
| MulExp Exp Exp
| OrExp Exp Exp
| SubExp Exp Exp
data Fac = BoolConst Bool
| IntConst Int
| RealConst Float
| Ident String
Responda às seguintes perguntas:
1. Construa uma frase em sintaxe abstracta que pertence a esta linguagem.
2. Utilizando os combinadores apesentados, definaa função de pretty printing ppBC.
4
Solução
-- frase_bc =
-- ppBC
3
Combinadores com Layout Multiplo
Solução
hv_helloworld = join ("ola" >#< "mundo" >//< "ola" >-< "mundo")
hor_hw
= render hv_helloworld 20
hor_hw’
= render hv_helloworld 6
Solução
(>^<)
:: (PP a, PP b) => a -> b -> PP_Doc
a >^< b = join (a >//< b)
3.1 Considere de novo o seguinte tipo de dados algébrico que define a sintaxe abstracta
da linguagem Bc. Apresente uma nova versão da função de pretty printing ppBC’ que usa
agora esta possibilidade de layout multiplos.
Solução
5

Documentos relacionados