summaryrefslogtreecommitdiff
path: root/examples/uusisuomi/MkLex.hs
blob: 0e63a5e6217764e3eb951fdb1daad31e80cb8ccc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
module Main where

import System
import Char

-- generate Finnish lexicon implementations with 1 or more 
-- characteristic arguments
-- usage: runghc MkLex.hs 3 cat name

main = do
  i:cat:tgt:_ <- getArgs
  let src = "correct-" ++ tgt ++ ".txt"
  ss <- readFile src >>= return . filter (not . (all isSpace)) . lines
  initiate tgt cat i
  mapM_ (mkLex cat (read i) . uncurry (++)) (zip nums ss)
  putStrLn "}"

initiate tgt cat i = mapM_ putStrLn [
  "--# -path=.:alltenses",
  "",
  header i,
  ""
  ]
 where
  header i = case i of
    "0" -> unlines [
      "abstract " ++ tgt ++ "Abs = Cat ** {",
      "fun testN : N -> Utt ;",
      "fun testV : V -> Utt ;"
      ]
    _ -> unlines [
      "concrete " ++ tgt ++ i ++ 
      " of " ++ tgt ++ 
      "Abs = CatFin ** open Nominal, Verbal, ResFin, Prelude in {",
      "",
      "lin testN = showN ;",
      "lin testV = showV ;"
     ]

nums = map prt [10001 ..] where
----  prt i = (if i < 10 then "0" else "") ++ show i ++ ". "
  prt i = show i ++ ". "

-- W is the flag for mixed-class word lists
mkLex "W" 0 line = case words line of
  num:cat:sana:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "fun " ++ nimi ++ "_" ++ cat ++ " : " ++ cat ++ " ;"
  _ -> return ()

mkLex "W" 1 line = case words line of
  num:cat:sanat@(sana:_) -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "lin " ++ nimi ++ 
               "_" ++ cat ++ " = mk" ++ cat ++ " " ++ 
               unwords (map prQuoted sanat) ++" ;"
  _ -> return ()

mkLex cat 0 line = case words line of
  num:sana:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "fun " ++ nimi ++ "_" ++ cat ++ " : " ++ cat ++ " ;"
  _ -> return ()

mkLex cat 1 line = case words line of
  num:sana:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "lin " ++ nimi ++ 
               "_" ++ cat ++ " = mk" ++ cat ++ " \"" ++ sana ++ "\" ;"
  _ -> return ()

mkLex "V" _ line = case words line of
  num:sana:_:_:_:_:_:_:sanan:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "lin " ++ nimi ++ 
      "_V = mkV \"" ++ sana ++ "\" \"" ++ sanan ++ "\" ;"
  _ -> return ()

mkLex "N" 2 line = case words line of
--  num:sana:sanan:_ -> do
  num:sana:_:_:_:_:_:sanan:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "lin " ++ nimi ++ 
      "_N = mkN \"" ++ sana ++ "\" \"" ++ sanan ++ "\" ;"
  _ -> return ()

mkLex "N" 3 line = case words line of
----  num:sana:sanan:sanoja:_ -> do
  num:sana:sanan:_:_:_:_:sanoja:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "lin " ++ nimi ++ 
      "_N = mkN \"" ++ sana ++ "\" \"" ++ sanan ++ "\" \"" ++ sanoja ++ "\" ;"
  _ -> return ()

mkLex "N" 4 line = case words line of
  num:sana:sanan:sanaa:_:_:_:sanoja:_ -> do
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "lin " ++ nimi ++ 
      "_N = mkN \"" ++ sana ++ "\" \"" ++ sanan ++ 
                 "\" \"" ++ sanoja ++ "\" \"" ++ sanaa ++ "\" ;"
  _ -> return ()

-- to initiate from a noun list that has compounds

mkLex "N" 11 line = case words line of
  _:"--":_ -> return ()
  num:sana0:_ -> do
    let sana = uncompound sana0
    let nimi = "n" ++ init num ++ "_" ++ sana 
    putStrLn $ "fun " ++ nimi ++ "_N : N ;"
    putStrLn $ "lin " ++ nimi ++ "_N = mkN \"" ++ sana ++ "\" ;"
  _ -> return ()

prQuoted s = concat ["\"",s,"\""]

-- from sora+tie to tie

uncompound = reverse . takeWhile (/= '+') . reverse