1
1
module BuildModel where
2
2
3
3
import Control.Applicative ( (<|>) )
4
+ import Control.Monad ( when )
4
5
import Data.Char ( isAsciiLower
5
6
, isDigit
6
7
, toLower
@@ -30,7 +31,7 @@ data LineContents =
30
31
| ModuleDeclaration String
31
32
| ModuleUsed String
32
33
| ModuleSubprogramDeclaration
33
- | SubmoduleDeclaration String String
34
+ | SubmoduleDeclaration String String String
34
35
| Other
35
36
36
37
data RawSource = RawSource {
@@ -55,6 +56,7 @@ data Source =
55
56
{ submoduleSourceFileName :: FilePath
56
57
, submoduleObjectFileName :: FilePath -> FilePath
57
58
, submoduleModulesUsed :: [String ]
59
+ , submoduleBaseModuleName :: String
58
60
, submoduleParentName :: String
59
61
, submoduleName :: String
60
62
}
@@ -68,33 +70,37 @@ data CompileTimeInfo = CompileTimeInfo {
68
70
69
71
processRawSource :: RawSource -> Source
70
72
processRawSource rawSource =
71
- let sourceFileName = rawSourceFilename rawSource
72
- parsedContents = parseContents rawSource
73
- objectFileName =
74
- \ bd -> bd </> (pathSeparatorsToUnderscores sourceFileName) <.> " o"
75
- modulesUsed = getModulesUsed parsedContents
76
- in if hasProgramDeclaration parsedContents
77
- then Program { programSourceFileName = sourceFileName
78
- , programObjectFileName = objectFileName
79
- , programModulesUsed = modulesUsed
80
- }
81
- else if hasModuleDeclaration parsedContents
82
- then Module
83
- { moduleSourceFileName = sourceFileName
84
- , moduleObjectFileName = objectFileName
85
- , moduleModulesUsed = modulesUsed
86
- , moduleName = getModuleName parsedContents
87
- , moduleProducesSmod = hasModuleSubprogramDeclaration parsedContents
73
+ let
74
+ sourceFileName = rawSourceFilename rawSource
75
+ parsedContents = parseContents rawSource
76
+ objectFileName =
77
+ \ bd -> bd </> (pathSeparatorsToUnderscores sourceFileName) <.> " o"
78
+ modulesUsed = getModulesUsed parsedContents
79
+ in
80
+ if hasProgramDeclaration parsedContents
81
+ then Program { programSourceFileName = sourceFileName
82
+ , programObjectFileName = objectFileName
83
+ , programModulesUsed = modulesUsed
84
+ }
85
+ else if hasModuleDeclaration parsedContents
86
+ then Module
87
+ { moduleSourceFileName = sourceFileName
88
+ , moduleObjectFileName = objectFileName
89
+ , moduleModulesUsed = modulesUsed
90
+ , moduleName = getModuleName parsedContents
91
+ , moduleProducesSmod = hasModuleSubprogramDeclaration parsedContents
92
+ }
93
+ else if hasSubmoduleDeclaration parsedContents
94
+ then Submodule
95
+ { submoduleSourceFileName = sourceFileName
96
+ , submoduleObjectFileName = objectFileName
97
+ , submoduleModulesUsed = modulesUsed
98
+ , submoduleBaseModuleName = getSubmoduleBaseModuleName
99
+ parsedContents
100
+ , submoduleParentName = getSubmoduleParentName parsedContents
101
+ , submoduleName = getSubmoduleName parsedContents
88
102
}
89
- else if hasSubmoduleDeclaration parsedContents
90
- then Submodule
91
- { submoduleSourceFileName = sourceFileName
92
- , submoduleObjectFileName = objectFileName
93
- , submoduleModulesUsed = modulesUsed
94
- , submoduleParentName = getSubmoduleParentName parsedContents
95
- , submoduleName = getSubmoduleName parsedContents
96
- }
97
- else undefined
103
+ else undefined
98
104
99
105
getAvailableModules :: [Source ] -> [String ]
100
106
getAvailableModules = mapMaybe maybeModuleName
@@ -110,8 +116,8 @@ getAllObjectFiles buildDirectory sources = map getObjectFile sources
110
116
getObjectFile s@ (Submodule {}) = (submoduleObjectFileName s) buildDirectory
111
117
112
118
getSourceFileName :: Source -> FilePath
113
- getSourceFileName p@ (Program {}) = programSourceFileName p
114
- getSourceFileName m@ (Module {}) = moduleSourceFileName m
119
+ getSourceFileName p@ (Program {} ) = programSourceFileName p
120
+ getSourceFileName m@ (Module {} ) = moduleSourceFileName m
115
121
getSourceFileName s@ (Submodule {}) = submoduleSourceFileName s
116
122
117
123
constructCompileTimeInfo :: Source -> [String ] -> FilePath -> CompileTimeInfo
@@ -144,7 +150,7 @@ constructCompileTimeInfo s@(Submodule{}) availableModules buildDirectory =
144
150
, compileTimeInfoObjectFileProduced = (submoduleObjectFileName s)
145
151
buildDirectory
146
152
, compileTimeInfoOtherFilesProduced = [ buildDirectory
147
- </> submoduleParentName s
153
+ </> submoduleBaseModuleName s
148
154
++ " @"
149
155
++ submoduleName s
150
156
<.> " smod"
@@ -215,19 +221,27 @@ getModuleName pc = head $ mapMaybe contentToMaybeModuleName pc
215
221
ModuleDeclaration moduleName -> Just moduleName
216
222
_ -> Nothing
217
223
224
+ getSubmoduleBaseModuleName :: [LineContents ] -> String
225
+ getSubmoduleBaseModuleName pc = head $ mapMaybe contentToMaybeModuleName pc
226
+ where
227
+ contentToMaybeModuleName content = case content of
228
+ SubmoduleDeclaration baseModuleName submoduleParentName submoduleName ->
229
+ Just baseModuleName
230
+ _ -> Nothing
231
+
218
232
getSubmoduleParentName :: [LineContents ] -> String
219
233
getSubmoduleParentName pc = head $ mapMaybe contentToMaybeModuleName pc
220
234
where
221
235
contentToMaybeModuleName content = case content of
222
- SubmoduleDeclaration submoduleParentName submoduleName ->
236
+ SubmoduleDeclaration baseModuleName submoduleParentName submoduleName ->
223
237
Just submoduleParentName
224
238
_ -> Nothing
225
239
226
240
getSubmoduleName :: [LineContents ] -> String
227
241
getSubmoduleName pc = head $ mapMaybe contentToMaybeModuleName pc
228
242
where
229
243
contentToMaybeModuleName content = case content of
230
- SubmoduleDeclaration submoduleParentName submoduleName ->
244
+ SubmoduleDeclaration baseModuleName submoduleParentName submoduleName ->
231
245
Just submoduleName
232
246
_ -> Nothing
233
247
@@ -271,6 +285,7 @@ moduleDeclaration = do
271
285
_ <- string " module"
272
286
skipAtLeastOneWhiteSpace
273
287
moduleName <- validIdentifier
288
+ when (moduleName == " procedure" ) (fail " " )
274
289
skipSpaceCommentOrEnd
275
290
return $ ModuleDeclaration moduleName
276
291
@@ -279,10 +294,13 @@ submoduleDeclaration = do
279
294
skipSpaces
280
295
_ <- string " submodule"
281
296
parents <- submoduleParents
297
+ let parentName = case parents of
298
+ (baseModule : [] ) -> baseModule
299
+ (multiple ) -> (head multiple) ++ " @" ++ (last multiple)
282
300
skipSpaces
283
301
name <- validIdentifier
284
302
skipSpaceCommentOrEnd
285
- return $ SubmoduleDeclaration (intercalate " @ " parents) name
303
+ return $ SubmoduleDeclaration (head parents) parentName name
286
304
287
305
submoduleParents :: ReadP [String ]
288
306
submoduleParents = do
0 commit comments