1 {
2 -- only list imports here
3 import Data.Char
4 }
5 
6 %tokentype { Token }
7 
8 %lexer { lexer } { TokenEOF }
9 
10 %token
11 	det 		{ Det $$ }
12 	prep 		{ Prep $$ }
13 	noun 		{ Noun $$ }
14 	transvb 	{ Verb Trans $$ }
15 	intransvb 	{ Verb Intrans $$ }
16 
17 %%
18 
19 S
20  : NP VP {}
21 
22 NP
23  : det noun {}
24  | NP PP {}
25 
26 PP
27  : prep NP {}
28 
29 VP
30  : transvb NP {}
31  | intransvb  {}
32  | VP PP      {}
33 
34 {
35 
36 data Token
37 	= TokenEOF
38 	| Noun String
39 	| Verb Arity String
40         | Prep String
41         | Det String
42   deriving (Show,Eq,Ord)
43 
44 data Arity = Trans | Intrans deriving (Show,Eq,Ord)
45 
46 lexer :: String -> [[Token]]
47 lexer = map lex_word . words
48 
49 -- simple lexicon
50 -- (no claims to accuracy)
51 
52 lex_word w@"the"       = [Det w]
53 lex_word w@"a"         = [Det w]
54 lex_word w@"some"      = [Det w]
55 lex_word w@"in"        = [Prep w]
56 lex_word w@"with"      = [Prep w]
57 lex_word w@"park"      = [Verb Trans w, Noun w]
58 lex_word w@"man"       = [Verb Trans w, Noun w]
59 lex_word w@"saw"       = [Verb Trans w, Verb Intrans w, Noun w]
60 lex_word w@"run"       = [Verb Trans w, Verb Intrans w, Noun w]
61 lex_word w@"race"      = [Verb Trans w, Verb Intrans w, Noun w]
62 lex_word w@"telescope" = [Verb Trans w, Verb Intrans w, Noun w]
63 lex_word w = error $ "Not know: " ++ show w
64 }
65