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