tomasfdel

ALP Práctica 1

Aug 30th, 2018
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- EJERCICIO 1
  2. sepBy toma una cadena e intenta aplicar el parser p. En caso de que pueda, aplica el parser sep y repite el proceso mientras pueda. El resultado final es una lista de las partes del string parseables por p que estaban separadas por cadenas parseables por sep entre sí.
  3. symbol toma una cadena como argumento. Elimina todos los espacios del principio de la cadena, revisa que luego la cadena argumento figure y elimina espacios que estén inmediatamente después.
  4.  
  5.  
  6. -- EJERCICIO 2
  7. expr :: Parser Int
  8. expr = do t <- term
  9.           (do char '+'
  10.               e <- expr
  11.               return (t + e)
  12.            <|> (do char '-'
  13.                    e <- expr
  14.                    return (t - e)
  15.                <|> return t))
  16.  
  17. term :: Parser Int
  18. term = do f <- factor
  19.           (do char '*'
  20.               t <- term
  21.               return (f * t)
  22.            <|> (do char '/'
  23.                    t <- term
  24.                    return (div f t)
  25.                 <|> return f))
  26.  
  27.  
  28. factor :: Parser Int
  29. factor = (do d <- digit
  30.              return (digitToInt d))
  31.           <|> do char '('
  32.                  e <- expr
  33.                  char ')'
  34.                  return e
  35.  
  36.  
  37. -- EJERCICIO 3
  38. parentesis :: Parser a -> Parser a
  39. parentesis p = p
  40.                <|> do char '('
  41.                       res <- parentesis p
  42.                       char ')'
  43.                       return res
  44.  
  45.  
  46. -- EJERCICIO 4
  47. data Expr = Num Int | BinOp Op Expr Expr deriving Show
  48. data Op = Add | Mul | Min | Div deriving Show
  49.  
  50. expr :: Parser Expr
  51. expr = do t <- term
  52.           (do char '+'
  53.               e <- expr
  54.               return (BinOp Add t e)
  55.            <|> (do char '-'
  56.                    e <- expr
  57.                    return (BinOp Min t e)
  58.                <|> return t))
  59.  
  60. term :: Parser Expr
  61. term = do f <- factor
  62.           (do char '*'
  63.               t <- term
  64.               return (BinOp Mul f t)
  65.            <|> (do char '/'
  66.                    t <- term
  67.                    return (BinOp Div f t)
  68.                 <|> return f))
  69.  
  70.  
  71. factor :: Parser Expr
  72. factor = (do d <- digit
  73.              return (Num (digitToInt d)))
  74.           <|> do char '('
  75.                  e <- expr
  76.                  char ')'
  77.                  return e
  78.  
  79.  
  80. -- EJERCICIO 5
  81. data IntOrChar = Num Int | Car Char deriving Show
  82.  
  83. pAux :: Parser IntOrChar
  84. pAux = do i <- int
  85.           return (Num i)
  86.        <|> do char '\''
  87.               c <- item
  88.               char '\''
  89.               return (Car c)
  90.  
  91.  
  92. intchar :: Parser [IntOrChar]
  93. intchar = do char '['
  94.              xs <- sepBy pAux (char ',')
  95.              char ']'
  96.              return xs
  97.  
  98.  
  99. -- EJERCICIO 6
  100. pAux :: Parser Basetype
  101. pAux = do i <- string "Int"
  102.           return DInt
  103.           <|> do c <- string "Char"
  104.                  return DChar
  105.           <|> do f <- string "Float"
  106.                  return DFloat
  107.  
  108.  
  109. hasktype :: Parser [Basetype]
  110. hasktype = sepBy pAux (string " -> ")
  111.  
  112.  
  113. -- EJERCICIO 7
  114. data Hasktype = DInt | DChar | Fun Hasktype Hasktype deriving Show
  115.  
  116. pAux :: Parser Hasktype
  117. pAux = do i <- string "Int"
  118.           return DInt
  119.           <|> do c <- string "Char"
  120.                  return DChar
  121.  
  122.  
  123. hasktype :: Parser Hasktype
  124. hasktype = do p <- pAux
  125.               (do string " -> "
  126.                   ps <- hasktype
  127.                   return (Fun p ps))
  128.                <|> return p
  129.  
  130.  
  131. -- EJERCICIO 8
  132. expr -> term exprAux
  133. exprAux -> ε | '+' term exprAux | '-' term exprAux
  134. term -> factor termAux
  135. termAux -> ε | '*' factor termAux | '/' factor termAux
  136. factor -> digit | '(' expr ')'
  137. digit -> '0' | ... | '9'
  138.  
  139. data Expr = Num Int | BinOp Op Expr Expr deriving Show
  140. data Op = Add | Mul | Min | Div deriving Show
  141.  
  142. expr :: Parser Expr
  143. expr = do t <- term
  144.           exprAux t
  145.          
  146. exprAux :: Expr -> Parser Expr
  147. exprAux exp1 = do char '+'
  148.                   t <- term
  149.                   exprAux (BinOp Add exp1 t)
  150.                <|> do char '-'
  151.                       t <- term
  152.                       exprAux (BinOp Min exp1 t)
  153.                <|> return exp1
  154.  
  155. term :: Parser Expr
  156. term = do f <- factor
  157.           termAux f
  158.  
  159. termAux :: Expr -> Parser Expr
  160. termAux exp1 = do char '*'
  161.                   f <- factor
  162.                   termAux (BinOp Mul exp1 f)
  163.                <|> do char '/'
  164.                       f <- factor
  165.                       termAux (BinOp Div exp1 f)
  166.                <|> return exp1
  167.          
  168. factor :: Parser Expr
  169. factor = (do d <- digit
  170.              return (Num (digitToInt d)))
  171.           <|> do char '('
  172.                  e <- expr
  173.                  char ')'
  174.                  return e
  175.  
  176.  
  177.  
  178. -- EJERCICIO 9
  179. data BasicType = BInt | BChar | BFloat deriving Show
  180. data VarType = Variable BasicType DecType deriving Show
  181. data DecType = Pointer DecType | DD DirDecType deriving Show
  182. data DirDecType = Basic String | Array DirDecType Int deriving Show  
  183.  
  184.  
  185. declaration :: Parser VarType
  186. declaration = do t <- type_specifier
  187.                  d <- declarator
  188.                  char ';'
  189.                  return (Variable t d)
  190.  
  191.  
  192. type_specifier :: Parser BasicType
  193. type_specifier = do string "int "
  194.                     return BInt
  195.                     <|> do string "char "
  196.                            return BChar
  197.                     <|> do string "float "
  198.                            return BFloat
  199.  
  200.  
  201. declarator :: Parser DecType
  202. declarator = do char '*'
  203.                 d <- declarator
  204.                 return (Pointer d)
  205.                 <|> do dd <- direct_declarator
  206.                        return (DD dd)
  207.  
  208.  
  209. direct_declarator :: Parser DirDecType
  210. direct_declarator = do s <- (do char '('
  211.                                 s_aux <- direct_declarator
  212.                                 char ')'
  213.                                 return s_aux
  214.                              <|> do s_aux <-ident
  215.                                     return (Basic s_aux))
  216.                        dda <- direct_declarator_aux
  217.                        return (dda s)
  218.                              
  219.                                
  220.  
  221. direct_declarator_aux :: Parser (DirDecType -> DirDecType)
  222. direct_declarator_aux =  do char '['
  223.                             n <- nat
  224.                             char ']'
  225.                             arr <- direct_declarator_aux
  226.                             return (\x -> arr (Array x n))
  227.                          <|> return (\x -> x)
Add Comment
Please, Sign In to add comment