-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathJboSyntax.hs
337 lines (290 loc) · 10.5 KB
/
JboSyntax.hs
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
-- This file is part of tersmu
-- Copyright (C) 2014 Martin Bays <[email protected]>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of version 3 of the GNU General Public License as
-- published by the Free Software Foundation.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see http://www.gnu.org/licenses/.
{-# LANGUAGE DeriveDataTypeable #-}
module JboSyntax where
import Logic hiding (Term, Connective)
import Control.Applicative
import Data.Data
-- Abstract syntax:
data Text = Text {textFrees::[Free], vaguelyNegatedText::Bool,
textParas::[Paragraph]}
deriving (Eq, Show, Ord, Typeable, Data)
type Paragraph = [Either Fragment Statement]
data Fragment
= FragPrenex [Term]
| FragTerms [Term]
| FragCon Connective
| FragQuantifier Mex
| FragNA Cmavo
| FragRels [RelClause]
| FragLinks [Term]
deriving (Eq, Show, Ord, Typeable, Data)
data Statement = Statement [Free] [Term] Statement1
deriving (Eq, Show, Ord, Typeable, Data)
data LogJboConnective = LogJboConnective Bool Char Bool
deriving (Eq, Show, Ord, Typeable, Data)
data Statement1 = ConnectedStatement Connective Statement1 Statement1
| StatementSentence [Free] Sentence
| StatementParas (Maybe Tag) [Paragraph]
deriving (Eq, Show, Ord, Typeable, Data)
data Subsentence = Subsentence [Free] [Term] Sentence
deriving (Eq, Show, Ord, Typeable, Data)
data Sentence = Sentence [Term] BridiTail
deriving (Eq, Show, Ord, Typeable, Data)
data Free
= Bracketed Text
| Discursive BridiTail
| TruthQ (Maybe Int)
| Vocative [COI] (Maybe Sumti)
| MAI Mex
| XI Mex
| MexPrecedence BridiTail
| SOI Sumti (Maybe Sumti)
| Indicator {indicatorNai :: Bool, indicatorCmavo :: Cmavo}
| NullFree
deriving (Eq, Show, Ord, Typeable, Data)
data COI = COI {coiCOI::String, coiNAI::Bool}
deriving (Eq, Show, Ord, Typeable, Data)
type FreeIndex = Int
data Term
= Sumti Tagged Sumti
| Negation
| Termset [Term]
| ConnectedTerms Bool Connective Term Term
| BareTag Tag
| BareFA (Maybe Int)
| NullTerm
deriving (Eq, Show, Ord, Typeable, Data)
data Tagged = Untagged
| Tagged Tag
| FATagged Int
| FAITagged
deriving (Eq, Show, Ord, Typeable, Data)
data AbsTag r t
= DecoratedTagUnits [DecoratedAbsTagUnit r t]
| ConnectedTag (AbsConnective r t) (AbsTag r t) (AbsTag r t)
deriving (Eq, Show, Ord, Typeable, Data)
data DecoratedAbsTagUnit r t = DecoratedTagUnit
{tagNahe::Maybe Cmavo, tagSE::Maybe Int, tagNAI::Bool, tagUnit::AbsTagUnit r t}
deriving (Eq, Show, Ord, Typeable, Data)
data AbsTagUnit r t
= TenseCmavo Cmavo
| CAhA Cmavo
| FAhA {fahaHasMohi::Bool, fahaCmavo::Cmavo}
| ROI {roiroi::Cmavo, roiIsSpace::Bool, roiQuantifier::AbsMex r t}
| TAhE_ZAhO {taheZoheIsSpace::Bool, taheZahoCmavo::Cmavo}
| BAI Cmavo
| FIhO r
| CUhE
| KI
deriving (Eq, Show, Ord, Typeable, Data)
tagNaiIsScalar :: AbsTagUnit r t -> Bool
tagNaiIsScalar (ROI _ _ _) = True
tagNaiIsScalar (TAhE_ZAhO _ _) = True
tagNaiIsScalar (CAhA _) = True
tagNaiIsScalar _ = False
type Tag = AbsTag Selbri Sumti
type DecoratedTagUnit = DecoratedAbsTagUnit Selbri Sumti
type TagUnit = AbsTagUnit Selbri Sumti
data AbsConnective r t
= JboConnLog (Maybe (AbsTag r t)) LogJboConnective
| JboConnJoik (Maybe (AbsTag r t)) Joik
deriving (Eq, Show, Ord, Typeable, Data)
type Connective = AbsConnective Selbri Sumti
type Joik = String
-- XXX we arbitarily consider a mix of tense and "modal" to be a tense
isTense :: AbsTag r t -> Bool
isTense (ConnectedTag _ t1 t2) = isTense t1 || isTense t2
isTense (DecoratedTagUnits dtus) = or $ map isTenseDTU dtus
where isTenseDTU (DecoratedTagUnit _ _ _ tu) = case tu of
BAI _ -> False
FIhO _ -> False
_ -> True
type Cmavo = String
data Sumti = ConnectedSumti Bool Connective Sumti Sumti [RelClause]
| QAtom [Free] (Maybe Mex) [RelClause] SumtiAtom
| QSelbri Mex [RelClause] Selbri
deriving (Eq, Show, Ord, Typeable, Data)
appendRelsToSumti newrels (ConnectedSumti fore con s1 s2 rels) =
ConnectedSumti fore con s1 s2 (rels++newrels)
appendRelsToSumti newrels (QAtom fs q rels sa) =
QAtom fs q (rels++newrels) sa
appendRelsToSumti newrels (QSelbri q rels s) =
QSelbri q (rels++newrels) s
data RelClause = Restrictive Subsentence -- poi
| Incidental Subsentence -- noi
| Descriptive Subsentence -- voi
| Assignment Term -- goi
| RestrictiveGOI String Term -- pe etc.
| IncidentalGOI String Term -- ne etc.
deriving (Eq, Show, Ord, Typeable, Data)
data SumtiAtom = Name Gadri [RelClause] String
| Variable Int -- da
| NonAnaphoricProsumti String -- mi
| RelVar Int -- ke'a
| LambdaVar (Maybe Int) (Maybe Int) -- ce'u [xi ly] [xi ny]
| SelbriVar -- fake, for description sumti
| Description Gadri (Maybe Sumti) (Maybe Mex) (Either Selbri Sumti) [RelClause] [RelClause]
| Assignable Int -- ko'a
| LerfuString [Lerfu]
| Ri Int -- ri
| Ra Cmavo -- ra/ru
| MainBridiSumbasti Int -- vo'a
| Quote Text
| NonJboQuote String
| ErrorQuote [String]
| Word String
| MexLi Mex -- li
| MexMex Mex -- mo'e
| Zohe -- zo'e
| SumtiQ (Maybe Int) -- ma [kau]
| QualifiedSumti SumtiQualifier [RelClause] Sumti
deriving (Eq, Show, Ord, Typeable, Data)
data Lerfu
= LerfuChar Char
| LerfuPA Cmavo
| LerfuValsi String
| LerfuShift Cmavo
| LerfuShifted Cmavo Lerfu
| LerfuComposite [Lerfu]
deriving (Eq, Show, Ord, Typeable, Data)
type Gadri = String
getsRi :: SumtiAtom -> Bool
getsRi Zohe = False
getsRi (Assignable _) = False
getsRi (LerfuString _) = False
getsRi (MainBridiSumbasti _) = False
getsRi (Variable _) = False
getsRi (NonAnaphoricProsumti p) = p `elem` ["ti","ta","tu"]
getsRi _ = True
isAssignable :: SumtiAtom -> Bool
isAssignable (Assignable _) = True
isAssignable (LerfuString _) = True
isAssignable (Name _ _ _) = True
isAssignable _ = False
data SumtiQualifier = LAhE String | NAhE_BO String
deriving (Eq, Show, Ord, Typeable, Data)
data BridiTail = ConnectedBT Connective BridiTail BridiTail [Term]
| BridiTail3 Selbri [Term]
| GekSentence GekSentence
deriving (Eq, Show, Ord, Typeable, Data)
data GekSentence = ConnectedGS Connective Subsentence Subsentence [Term]
| TaggedGS Tag GekSentence
| NegatedGS GekSentence
deriving (Eq, Show, Ord, Typeable, Data)
data Selbri = Negated Selbri
| TaggedSelbri Tag Selbri
| Selbri2 Selbri2
deriving (Eq, Show, Ord, Typeable, Data)
data Selbri2 = SBInverted Selbri3 Selbri2
| Selbri3 Selbri3
deriving (Eq, Show, Ord, Typeable, Data)
data Selbri3 = SBTanru Selbri3 Selbri3
| ConnectedSB Bool Connective Selbri Selbri3
| BridiBinding Selbri3 Selbri3
| ScalarNegatedSB NAhE Selbri3
| TanruUnit [Free] TanruUnit [Term]
deriving (Eq, Show, Ord, Typeable, Data)
type NAhE = Cmavo
sb3tosb :: Selbri3 -> Selbri
sb3tosb = Selbri2 . Selbri3
data TanruUnit
= TUBrivla String
| TUZei [String]
| TUBridiQ (Maybe Int)
| TUGOhA String Int
| TUMe Sumti
| TUMoi Sumti String
| TUAbstraction Abstractor Subsentence
| TUPermuted Int TanruUnit
| TUJai (Maybe Tag) TanruUnit
| TUOperator Operator
| TUXOhI Tag
| TUSelbri3 Selbri3
deriving (Eq, Show, Ord, Typeable, Data)
data Abstractor
= NU Cmavo
| NegatedAbstractor Abstractor
-- Note: tagged connectives aren't allowed with NU, which makes things simpler
-- (but less uniform...)
| LogConnectedAbstractor LogJboConnective Abstractor Abstractor
| JoiConnectedAbstractor Joik Abstractor Abstractor
deriving (Eq, Show, Ord, Typeable, Data)
data AbsMex r t
= Operation (AbsOperator r t) [AbsMex r t]
| ConnectedMex Bool (AbsConnective r t) (AbsMex r t) (AbsMex r t)
| QualifiedMex SumtiQualifier (AbsMex r t)
| MexInt Int
| MexNumeralString [Numeral]
| MexLerfuString [Lerfu]
| MexSelbri r
| MexSumti t
| MexArray [AbsMex r t]
deriving (Eq, Show, Ord, Typeable, Data)
type Mex = AbsMex Selbri Sumti
mexIsNumberOrLS (MexInt _) = True
mexIsNumberOrLS (MexNumeralString _) = True
mexIsNumberOrLS (MexLerfuString _) = True
mexIsNumberOrLS _ = False
data Numeral = PA Cmavo | NumeralLerfu Lerfu
deriving (Eq, Show, Ord, Typeable, Data)
data AbsOperator r t
= ConnectedOperator Bool (AbsConnective r t) (AbsOperator r t) (AbsOperator r t)
| OpPermuted Int (AbsOperator r t)
| OpScalarNegated NAhE (AbsOperator r t)
| OpMex (AbsMex r t)
| OpSelbri r
| OpVUhU Cmavo
deriving (Eq, Show, Ord, Typeable, Data)
type Operator = AbsOperator Selbri Sumti
lerfuStringsOfSelbri :: Selbri -> [[Lerfu]]
lerfuStringsOfSelbri (Negated sb) = lerfuStringsOfSelbri sb
lerfuStringsOfSelbri (TaggedSelbri _ sb) = lerfuStringsOfSelbri sb
lerfuStringsOfSelbri (Selbri2 sb2) = do
s <- sb2tols sb2
[s, take 1 s]
where
sb2tols (SBInverted sb3 sb2) = (++) <$> sb3tols sb3 <*> sb2tols sb2
sb2tols (Selbri3 sb3) = sb3tols sb3
sb3tols (SBTanru sb sb') = (++) <$> sb3tols sb <*> sb3tols sb'
sb3tols (ConnectedSB _ _ sb sb3) = (++) <$> sbtols sb <*> sb3tols sb3
sb3tols (BridiBinding sb3 _) = sb3tols sb3
sb3tols (TanruUnit _ tu _) = tutols tu
sbtols = lerfuStringsOfSelbri
tutols (TUBrivla s) = return $ [LerfuChar $ head s]
tutols (TUZei vs) = [map (LerfuChar . head) $ vs
, [LerfuChar . head . head $ vs]]
tutols (TUAbstraction (NU s) _) =
-- Allow {nu bu} etc as abstraction anaphora.
-- Suggested by Michael Turniansky.
[[LerfuChar $ head s], [LerfuValsi s]]
tutols (TUSelbri3 sb3) = sb3tols sb3
tutols _ = return $ []
{-
class Bifunctor p where
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d
instance Bifunctor AbsMex where
bimap fr ft = bimap' where
bimap' (Operation o ms) = Operation (bimap' o) (map bimap' ms)
bimap' (ConnectedMex f c m1 m2) = ConnectedMex f (bimap' c) (bimap' m1) (bimap' m2)
bimap' (QualifiedMex q m) = QualifiedMex q (bimap' m)
bimap' (MexArray ms) = MexArray $ map bimap' ms
bimap' (MexSelbri r) = MexSelbri $ fr r
bimap' (MexSumti t) = MexSumti $ ft t
bimap' x = x
instance Bifunctor AbsOperator where
bimap fr ft = bimap' where
bimap' (ConnectedOperator f c o1 o2) = ConnectedOperator f (bimap' c) (bimap' o1) (bimap' o2)
bimap' (OpPermuted s o) = OpPermuted s $ bimap' o
bimap' (OpScalarNegated n o) = OpScalarNegated n $ bimap' o
bimap' (OpMex m) = OpMex $ bimap' m
bimap' (OpSelbri r) = OpSelbri $ fr r
bimap' x = x
-}