[SOLVED] CS Group members:

$25

File Name: CS__Group_members:.zip
File Size: 169.56 KB

5/5 - (1 vote)

Group members:
* Name, ID
* Name, ID
* Name, ID

Grading note: 15pts total
* 2pts Expr data type
* 2pts expression examples
* 2pts prettyExpr
* 3pts Cmd data type
* 2pts macro bodies
* 3pts prettyCmd
* 1ptboxes program

module HW3 where

import Data.List (intercalate)

* Part 1: Expressions

** Syntax

| Variable names.
type Var = String

| Expressions.
data Expr
= ExprTODO This is a dummy constructor that should be removed!
deriving (Eq,Show)

** Examples

| 2 + 3 * x
expr1 :: Expr
expr1 = undefined

| 2 + 3 * x + 4
expr2 :: Expr
expr2 = undefined

| (x + 2) * 3 * y
expr3 :: Expr
expr3 = undefined

| (x + 2) * (y + 3)
expr4 :: Expr
expr4 = undefined

** Pretty printer

| Pretty print an expression.

>>> prettyExpr expr1
2 + 3 * x

>>> prettyExpr expr2
2 + 3 * x + 4

>>> prettyExpr expr3
(x + 2) * 3 * y

>>> prettyExpr expr4
(x + 2) * (y + 3)

prettyExpr :: Expr -> String
prettyExpr = undefined

* Part 2: Commands

** Syntax

| Macro names.
type Macro = String

| The arguments to be evaluated and passed to a macro.
type Args = [Expr]

| A sequence of commands.
type Block = [Cmd]

| The mode of the pen.
data Mode = Down | Up
deriving (Eq,Show)

| Commands.
data Cmd
= CmdTODO This is a dummy constructor that should be removed!
deriving (Eq,Show)

** Examples

| The body of the box macro.

>>> putStrLn (prettyBlock boxBody)
{
pen up;
move(x, y);
pen down;
move(x + w, y);
move(x + w, y + h);
move(x, y + h);
move(x, y)
}

boxBody :: Block
boxBody = undefined

| The body of the main macro.

>>> putStrLn (prettyBlock mainBody)
{
for i = 1 to 15 {
box(i, i, i, i)
}
}
mainBody :: Block
mainBody = undefined

** Pretty printer

Some functions that might be useful for you:

concat :: [[a]] -> [a]
Concatenates a list of lists into a single list. Useful for
concatenating a list of strings into a single string.
Imported from the Prelude.

intercalate :: [a] -> [[a]] -> [a]
Insert a list between every list in a list of lists, then concatenate
the results. Useful for insertingseparators between every string in
a list of strings, then concatenating the whole thing into one string.
Imported from Data.List.

| Pretty print the pen mode.

>>> prettyMode Down
down

>>> prettyMode Up
up

prettyMode :: Mode -> String
prettyMode Down = down
prettyMode Up = up

| Pretty print a command.

>>> prettyCmd (Pen Down)
pen down

>>> prettyCmd (Move (Lit 2) (Add (Ref x) (Lit 3)))
move(2, x + 3)

>>> prettyCmd (Call foo [Lit 2, (Mul (Ref x) (Lit 3))])
foo(2, x * 3)

>>> prettyCmd (For i (Lit 1) (Lit 10) [])
for i = 1 to 10 {}

prettyCmd :: Cmd -> String
prettyCmd = undefined

| Pretty print a block of commands.

>>> prettyBlock []
{}

>>> putStrLn (prettyBlock [Pen Up, Move (Lit 2) (Lit 3), Pen Down])
{
pen up;
move(2, 3);
pen down
}

prettyBlock :: Block -> String
prettyBlock [] = {} special case for empty blocks
prettyBlock cs = {
++ indent (prettyCmds cs) ++
}
where
indent = concatMap (c -> if c ==
then
else [c])
prettyCmds = intercalate ;
. map prettyCmd

* Part 3: Programs

| The parameters of a macro are a list of variables that will be bound to
the arguments passed to the macro when it is called.
type Pars = [Var]

| A macro definition.
data Def = Define Macro Pars Block
deriving (Eq,Show)

| A program is a list of macro definitions plus the block of the main macro.
data Prog = Program [Def] Block
deriving (Eq,Show)

| The entire example program.

>>> putStrLn (pretty boxes)
box(x, y, w, h) {
pen up;
move(x, y);
pen down;
move(x + w, y);
move(x + w, y + h);
move(x, y + h);
move(x, y)
}
main() {
for i = 1 to 15 {
box(i, i, i, i)
}
}

boxes :: Prog
boxes = undefined

| Pretty print a macro definition.
prettyDef :: Def -> String
prettyDef (Define m ps b) =
concat [m, (, intercalate , ps, ) , prettyBlock b]

| Pretty print a program.
pretty :: Prog -> String
pretty (Program ds b) =
concat [intercalate
(map prettyDef ds),
main() , prettyBlock b]

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.

Shopping Cart
[SOLVED] CS Group members:
$25