[SOLVED] CS代考计算机代写 Haskell module SyntaxPractice where

30 $

File Name: CS代考计算机代写_Haskell_module_SyntaxPractice_where.zip
File Size: 555.78 KB

SKU: 2634732443 Category: Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Or Upload Your Assignment Here:


module SyntaxPractice where


— * Practice Set 1

— 1. Determine whether each string can be generated by the grammar. If the
—string can be generated, determine which syntactic category it belongs
—to. For each problem, write either Expr, Stmt, or Prog to indicate its
—syntactic category, or write “syntax error” if the string cannot be
—generated.

—a. Expr
—b. syntax error
—c. Stmt
—d. Stmt
—e. syntax error
—f. Prog
—g. syntax error
—h. Prog
—i. Stmt

— 2. Implement the grammar as a set of Haskell data types.

type Var = String

data Expr
= Lit Int
| Ref Var
| Add Expr Expr
deriving (Eq,Show)

data Stmt
= Set Var Expr
| Print Expr
deriving (Eq,Show)

type Prog = [Stmt]

— 3. For each string that can be produced by the grammar, write the
—corresponding Haskell value using your data types.

ex1a :: Expr
ex1a = Add (Lit 2) (Ref “x”)

— ex1b is a syntax error

ex1c :: Stmt
ex1c = Set “x” (Add (Lit 3) (Ref “y”))

ex1d :: Stmt
ex1d = Print (Add (Ref “x”) (Ref “y”))

— ex1e is a syntax error

ex1f :: Prog
ex1f = [Print (Lit 2), Print (Lit 3)]

— ex1g is a syntax error

ex1h :: Prog
ex1h = [Set “x” (Lit 2), Print (Lit 4)]

ex1i :: Stmt
ex1i = Set “z” (Add (Add (Lit 2) (Ref “x”)) (Ref “y”))
— OR:
— ex1i = Set “z” (Add (Lit 2) (Add (Ref “x”) (Ref “y”)))


— * Practice Set 2

— 4. Determine whether each string can be generated by the grammar. If the
—string can be generated, determine which non-terminal you must start
—with in order to generate it. In each blank, write either A, B, or C
—if the string can be generated, or write “syntax error” if it cannot
—be generated.

—a. A
—b. B
—c. syntax error
—d. A
—e. C
—f. syntax error
—g. B
—h. syntax error
—i. B
—j. B

— 5. Implement the grammar as a set of Haskell data types.

data A = OAO A
| IBI B

data B = BBC B B C
| O

data C = CCC C C C
| I

— Note that you can choose whatever names you like for the data constructors.
— I chose them to look like the original rules, using O and I for 0 and 1.
— To help see the relationship to the original grammar, it helps to see what
— the corresponding pretty printers looks like. Recall that pretty printers
— translate from abstract syntax to concrete syntax.

— | Pretty printer for A.
prettyA :: A -> String
prettyA (OAO a) = “0” ++ prettyA a ++ “0”
prettyA (IBI b) = “1” ++ prettyB b ++ “1”

— | Pretty printer for B.
prettyB :: B -> String
prettyB (BBC b1 b2 c) = prettyB b1 ++ prettyB b2 ++ prettyC c
prettyB O = “0”

— | Pretty printer for C.
prettyC :: C -> String
prettyC (CCC c1 c2 c3) = prettyC c1 ++ prettyC c2 ++ prettyC c3
prettyC I= “1”

— 6. For each string that can be produced by the grammar:
— (a) write the corresponding Haskell value
— (b) draw the corresponding abstract syntax tree
— (using the Haskell data constructors as nodes).

— Note that these solutions are not necessarily unique!

— |
— >>> prettyA ex2a
— “101”
ex2a :: A
ex2a = IBI O

— |
— >>> prettyB ex2b
— “00111”
ex2b :: B
ex2b = BBC O O (CCC I I I)

— ex2c is a syntax error

— |
— >>> prettyA ex2d
— “0100110”
ex2d :: A
ex2d = OAO (IBI (BBC O O I))

— |
— >>> prettyC ex2e
— “11111”
ex2e :: C
ex2e = CCC (CCC I I I) I I

— ex2f is a syntax error

— |
— >>> prettyB ex2g
— “0010111”
ex2g :: B
ex2g = BBC (BBC O O I) O (CCC I I I)

— ex2h is a syntax error

— |
— >>> prettyB ex2i
— “0000111”
ex2i :: B
ex2i = BBC O (BBC O (BBC O O I) I) I

— |
— >>> prettyB ex2j
— “0011101”
ex2j :: B
ex2j = BBC (BBC O O (CCC I I I)) O I

Reviews

There are no reviews yet.

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

Shopping Cart
[SOLVED] CS代考计算机代写 Haskell module SyntaxPractice where
30 $