Add text challenges for end of chapter 5
This commit is contained in:
parent
475b155228
commit
c6bde606d6
43
text-challenges
Normal file
43
text-challenges
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
Chapter 5, challenge 1:
|
||||||
|
Earlier, I said that the | , * , and + forms we added to our grammar metasyntax
|
||||||
|
were just syntactic sugar. Take this grammar:
|
||||||
|
|
||||||
|
expr → expr ( "(" ( expr ( "," expr )* )? ")" | "." IDENTIFIER )+
|
||||||
|
| IDENTIFIER
|
||||||
|
| NUMBER
|
||||||
|
|
||||||
|
Produce a grammar that matches the same language but does not use any of the notational sugar.
|
||||||
|
|
||||||
|
solution:
|
||||||
|
expr -> IDENTIFIER
|
||||||
|
expr -> NUMBER
|
||||||
|
expr -> expr callOrIndex
|
||||||
|
|
||||||
|
callOrIndex -> "." IDENTIFIER
|
||||||
|
callOrIndex -> "(" call ")"
|
||||||
|
|
||||||
|
call ->
|
||||||
|
call -> expr
|
||||||
|
call -> expr callListEnd
|
||||||
|
|
||||||
|
callListEnd ->
|
||||||
|
callListEnd -> "," expr precedingCommaCall
|
||||||
|
|
||||||
|
|
||||||
|
The grammar here clearly describes a number, or an identifier to a number, or a
|
||||||
|
function call, or a structure access
|
||||||
|
|
||||||
|
Chapter 5, challenge 2:
|
||||||
|
The Visitor pattern lets you emulate the functional style in an object-oriented
|
||||||
|
language. Devise a complementary pattern for a functional language. It should let
|
||||||
|
you bundle all of the operations on one type together and let you define new types
|
||||||
|
easily.
|
||||||
|
(SML or Haskell would be ideal for this exercise, but Scheme or another Lisp works
|
||||||
|
as well.)
|
||||||
|
|
||||||
|
solution:
|
||||||
|
Here, we're supposed to be able to define a new type that "inherits" an
|
||||||
|
existing one and bundle all the function implementations on that type together.
|
||||||
|
We could simply write the functions by specific type in one place, since Haskell is just that flexible, but that doesn't guarrantee we wrote the needed functions.
|
||||||
|
Another thing we could do is to put all necessary functions in a single structure, and define a type for this structure, for example if our supertype is Expr, with functions like "printInStr", "execute" and "optimize", our function bundle would look like:
|
||||||
|
data ExprFuncs a = ExprFuncs (a -> str) (a -> IO ()) (a -> Expr)
|
Loading…
Reference in a new issue