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