The Higher Education and Research forge

Home My Page Projects Code Snippets Project Openings EMULSION public releases
Summary Activity Surveys SCM Listes Sympa

SCM Repository

e486c1fe5dd34890b3412fddfdc26ea28af60256
1 //  _            _  __   __
2 // | |          | | \ \ / /
3 // | |_ _____  _| |_ \ V /    __ _ _ __ __ _ _ __ ___  _ __ ___   __ _ _ __
4 // | __/ _ \ \/ / __| > <    / _` | '__/ _` | '_ ` _ \| '_ ` _ \ / _` | '__|
5 // | ||  __/>  <| |_ / . \  | (_| | | | (_| | | | | | | | | | | | (_| | |
6 //  \__\___/_/\_\\__/_/ \_\  \__, |_|  \__,_|_| |_| |_|_| |_| |_|\__,_|_|
7 //                            __/ |
8 //                           |___/
9 //   __             ______ __  __       _       _____ _
10 //  / _|           |  ____|  \/  |     | |     / ____(_)
11 // | |_ ___  _ __  | |__  | \  / |_   _| |    | (___  _  ___  _ __
12 // |  _/ _ \| '__| |  __| | |\/| | | | | |     \___ \| |/ _ \| '_ \
13 // | || (_) | |    | |____| |  | | |_| | |____ ____) | | (_) | | | |
14 // |_| \___/|_|    |______|_|  |_|\__,_|______|_____/|_|\___/|_| |_|
15 //                      _      _
16 //                     | |    | |
17 //  _ __ ___   ___   __| | ___| |___
18 // | '_ ` _ \ / _ \ / _` |/ _ \ / __|
19 // | | | | | | (_) | (_| |  __/ \__ \
20 // |_| |_| |_|\___/ \__,_|\___|_|___/
23 // EMULSION (Epidemiological Multi-Level Simulation framework)
24 // ===========================================================
25 // 
26 // Contributors and contact:
27 // -------------------------
28 // 
29 //     - Sébastien Picault (sebastien.picault@inra.fr)
30 //     - Yu-Lin Huang
31 //     - Vianney Sicard
32 //     - Sandie Arnoux
33 //     - Gaël Beaunée
34 //     - Pauline Ezanno (pauline.ezanno@inra.fr)
35 // 
36 //     BIOEPAR, INRA, Oniris, Atlanpole La Chantrerie,
37 //     Nantes CS 44307 CEDEX, France
38 // 
39 // 
40 // How to cite:
41 // ------------
42 // 
43 //     S. Picault, Y.-L. Huang, V. Sicard, P. Ezanno (2017). "Enhancing
44 //     Sustainability of Complex Epidemiological Models through a Generic
45 //     Multilevel Agent-based Approach", in: C. Sierra (ed.), 26th
46 //     International Joint Conference on Artificial Intelligence (IJCAI),
47 //     AAAI, p. 374-380. DOI: 10.24963/ijcai.2017/53
48 // 
49 // 
50 // License:
51 // --------
52 // 
53 //    Copyright 2016 INRA and Univ. Lille
54 // 
55 //    Inter Deposit Digital Number: IDDN.FR.001.280043.000.R.P.2018.000.10000
56 // 
57 //    Agence pour la Protection des Programmes,
58 //    54 rue de Paradis, 75010 Paris, France
59 // 
60 //    Licensed under the Apache License, Version 2.0 (the "License");
61 //    you may not use this file except in compliance with the License.
62 //    You may obtain a copy of the License at
63 // 
64 //        http://www.apache.org/licenses/LICENSE-2.0
65 // 
66 //    Unless required by applicable law or agreed to in writing, software
67 //    distributed under the License is distributed on an "AS IS" BASIS,
68 //    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
69 //    See the License for the specific language governing permissions and
70 //    limitations under the License.
72 // Check the metamodel: textx visualize emulsion.tx
73 // Check a model: textx visualize emulsion.tx a_model.yaml
75 // A MODEL IS COMPOSED OF SEVERAL SECTIONS IN ANY ORDER
76 EmulsionModel:
77     (('model_name:' name=ID)      // MODEL NAME (mandatory)
78     time=TimeSection              // TIME INFORMATION (mandatory)
79     levels=LevelSection           // DESCRIPTION OF LEVELS (mandatory)
80     processes=ProcessSection      // LIST OF PROCESSES PER LEVEL (mandatory)
81     modules=ModuleSection?        // SYSTEM/CUSTOM MODULES
82     groups=GroupSection?          // GROUPING INFORMATION
83     machines=StateMachineSection? // DESCRIPTION OF STATE MACHINES
84     vars=StatevarSection?         // LIST OF STATEVARS
85     params=ParameterSection?      // LIST OF PARAMETERS
86     actions=ActionSection?        // LIST OF ACTIONS
87     prototypes=ProtoSection?      // SPECS OF PROTOTYPES
88     initial=InitSection?          // SPECS OF INITIAL CONDITIONS
89     outputs=OutputSection?        // SPECS OF OUTPUTS (TODO)
90     info=InfoSection?             // ADDITIONAL INFORMATION
91     distrib=DistributionSection?  // SPECS OF DISTRIBUTIONS
92     )#
93     //     // envts ?= EnvironmentSection
94 ;
96 //   _____                           _
97 //  / ____|                         | |
98 // | |  __  ___ _ __   ___ _ __ __ _| |
99 // | | |_ |/ _ \ '_ \ / _ \ '__/ _` | |
100 // | |__| |  __/ | | |  __/ | | (_| | |
101 //  \_____|\___|_| |_|\___|_|  \__,_|_|
102 //  _____        __                           _   _
103 // |_   _|      / _|                         | | (_)
104 //   | |  _ __ | |_ ___  _ __ _ __ ___   __ _| |_ _  ___  _ __
105 //   | | | '_ \|  _/ _ \| '__| '_ ` _ \ / _` | __| |/ _ \| '_ \
106 //  _| |_| | | | || (_) | |  | | | | | | (_| | |_| | (_) | | | |
107 // |_____|_| |_|_| \___/|_|  |_| |_| |_|\__,_|\__|_|\___/|_| |_|
109 // TODO: revise this section (too general)
110 InfoSection:
111     'model_info:' items+=KeyValue ;
113     // LIST OF MODULES USED FOR SYMBOLIC COMPUTING
114 ModuleSection:
115     'modules:' ('-' names=ModuleName)+ ;
117 //  _______ _
118 // |__   __(_)
119 //    | |   _ _ __ ___   ___
120 //    | |  | | '_ ` _ \ / _ \
121 //    | |  | | | | | | |  __/
122 //    |_|  |_|_| |_| |_|\___|
124     // DESCRIPTION OF TIME INFORMATION
125 TimeSection:
126     'time_info:'
127       (('time_unit:' unit=TimeUnit)             // TIME UNIT
128       ('delta_t:' deltat=INT)                   // TIME STEP
129       ('origin:' origin=StringOrLine)?          // DATE WHERE SIMULATION STARTS
130       ('total_duration:' total=StringOrLine)?   // TOTAL DURATION OF SIMULATION (IN TIMEUNITS)
131       ('calendars:' calendars+=CalendarSpec)?)# // CALENDAR OF EVENTS
133     // ALLOWED TIME UNITS
134 TimeUnit:
135     'hours' | 'days' | 'weeks'            // ADD OTHER VALUES IF NECESSARY
137     // SPECIFICATIONS OF CALENDARS AND EVENTS
138 CalendarSpec:
139     calendar=TrueID ':'         // NAME OF THE CALENDAR
140       ((period = PeriodSpec?)   // PERIODICITY IF ANY
141       ('events:'                // LIST OF EVENTS
142         events += EventSpec))#
144     // TIME PERIOD: e.g. days: 7
145 PeriodSpec:
146     'period:' unit=TimeUnit ':' period=INT ;
148     // SPECIFICATIONS OF EVENTS
149 EventSpec:
150     name=TrueID ':'                   // NAME OF THE EVENT
151     ('date:' date=StringOrLine |      // PUNCTUAL EVENT (SINGLE DATE)
152     (('begin:' begin=StringOrLine)    // INTERVAL
153     ('end:' end=StringOrLine))#)
156 //  _                    _
157 // | |                  | |
158 // | |     _____   _____| |___
159 // | |    / _ \ \ / / _ \ / __|
160 // | |___|  __/\ V /  __/ \__ \
161 // |______\___| \_/ \___|_|___/
163     // DESCRIPTION OF THE LEVELS USED IN THE MODEL
164 LevelSection:
165     'levels:' levels+=Level ;
167     // SPECIFICATIONS OF EACH LEVEL
168 Level:
169     name=TrueID ':'                      // NAME OF THE LEVEL
170     (('desc:' desc=StringOrLine)         // ROLE OF THE LEVEL
171     // SPECIFICATIONS TO BUILD THE CLASS REPRESENTING THE LEVEL
172     ('contains:' sublevels+=SubLevel)?   // LIST OF SUBLEVELS
173     ('aggregation_type:' type=AggregationType)? // TYPE OF AGGREGATION
174     ('aggregate_vars:' aggvars+=VarsAggregation)? // TYPE OF AGGREGATION
175     ('class_name:' class=ClassName)?     // CLASS AND MODULE
176     (location=ModuleOrFile)?
177     ('super:'                   // INFORMATIONS FOR SUPERCLASS
178     (('class_name:' superclass=ClassName)
179     ('module:' supermodule=ModuleName)
180     ('master:' ((master=ClassSpec) ('options:' 'key_variable:' key=TrueID)?)#)?)#
181     )?)#
184 ModuleOrFile:
185     ('module:' module=ModuleName) | ('file:' file=FileName) ;
187 AggregationType:
188     'IBM' | 'hybrid' | 'compartment' | 'metapopulation' ;
190 SubLevel:
191     '-' level=[Level] ;
193 VarsAggregation:
194     '-'
195     (('name:' name=TrueID)
196     ('collect:' sourcevar=TrueID)
197     ('operator:' operator=StringOrLine)?)#
201 // MachineItem:
202 //     '-' machine=[StateMachine]
203 // ;
205 //  _____
206 // |  __ \
207 // | |__) | __ ___   ___ ___  ___ ___  ___  ___
208 // |  ___/ '__/ _ \ / __/ _ \/ __/ __|/ _ \/ __|
209 // | |   | | | (_) | (_|  __/\__ \__ \  __/\__ \
210 // |_|   |_|  \___/ \___\___||___/___/\___||___/
212     // DESCRIPTION OF PROCESSES OCCURRING AT EACH LEVEL
213 ProcessSection:
214     'processes:' processes+=ProcessSpec ;
216 ProcessSpec:
217     level=[Level] ':'           // NAME OF A LEVEL
218     procs+=Process              // LIST OF PROCESSES
221 Process:
222     '-' name=TrueID ;
224 // Process:
225 //     InternalProcess | MethodProcess ;
227 // InternalProcess:
228 //     '-' ref=[StateMachineOrGrouping] ;
230 // MethodProcess:
231 //     '-' method=TrueID ;
233 // StateMachineOrGrouping:
234 //     StateMachine | Grouping  ;
236 //   _____
237 //  / ____|
238 // | |  __ _ __ ___  _   _ _ __  ___
239 // | | |_ | '__/ _ \| | | | '_ \/ __|
240 // | |__| | | | (_) | |_| | |_) \__ \
241 //  \_____|_|  \___/ \__,_| .__/|___/
242 //                        | |
243 //                        |_|
245     // DESCRIPTION OF GROUPINGS FOR EACH LEVEL
246 GroupSection:
247     'grouping:' comparts+=GroupSpec ;
249 GroupSpec:
250     level=[Level] ':'           // NAME OF A LEVEL
251     concerns+=Grouping          // LIST OF GROUPINGS
253     // SPECIFICATIONS OF A GROUPING
254 Grouping:
255     name=TrueID ':'
256       (('machine_name:' machine=[StateMachine])? // STATE MACHINE NAME, IF ANY
257     // LIST OF GROUPING VARS
258     ('key_variables:' ('-' variables=[StateVarOrStateMachine])+)
259     ('compart_manager:' manager=ClassSpec)?   // CLASS FOR GROUP MANAGER
260     ('compart_class:' view=ClassSpec)?        // CLASS FOR GROUP VIEW
261     )#
264 StateVarOrStateMachine:
265     StateVar | StateMachine ;
267 //   _____ _        _       __  __            _     _
268 //  / ____| |      | |     |  \/  |          | |   (_)
269 // | (___ | |_ __ _| |_ ___| \  / | __ _  ___| |__  _ _ __   ___  ___
270 //  \___ \| __/ _` | __/ _ \ |\/| |/ _` |/ __| '_ \| | '_ \ / _ \/ __|
271 //  ____) | || (_| | ||  __/ |  | | (_| | (__| | | | | | | |  __/\__ \
272 // |_____/ \__\__,_|\__\___|_|  |_|\__,_|\___|_| |_|_|_| |_|\___||___/
274     // DESCRIPTION OF THE FINITE STATE MACHINES
275 StateMachineSection:
276     'state_machines:' machines=StateMachine+ ;
278 StateMachine:
279     name=TrueID ':'                 // NAME OF THE STATE MACHINE (A STATEVAR)
280       (('desc:' desc=StringOrLine)? // ROLE OF THE STATE MACHINE
281       ('states:'
282         states+=State)              // LIST OF STATES
283       ('transitions:'
284         transitions+=Edge)?   // LIST OF TRANSITIONS EDGES BETWEEN STATES
285       ('productions:'
286         productions+=ProductionEdge)?   // LIST OF PRODUCTION EDGES BETWEEN STATES
287     )#
290 State:
291     '-' name=StateName':'                    // NAME OF THE STATE
292       (('name:' fullname=StringOrLine)       // LONGER NAME
293       ('desc:' desc=StringOrLine)            // DESCRIPTION OF THE STATE
294       ('fillcolor:' fill=ID)?                // COLOR FOR FIGURES
295       ('duration:' duration=StringOrLine)?   // DURATION IN THE STATE IN ANY
296       ('autoremove:' autoremove=StringOrLine)? // STATE MUST EMPTY AUTOMATICALLY ?
297       ('default:' default=StringOrLine)?     // STATE IS DEFAULT VALUE ?
298       ('properties:' properties+=KeyValue)?  // CUSTOM STATE PROPERTIES
299       ('on_enter:' ('-' enter=ActionSpec)+)? // ACTIONS ON ENTER IF ANY
300       ('on_stay:' ('-' stay=ActionSpec)+)?   // ACTIONS ON STAY IF ANY
301       ('on_exit:' ('-' exit=ActionSpec)+)?)# // ACTIONS ON EXIT IF ANY
302  ;
303     // REGULAR EXPRESSION FOR ALLOWED STATE NAMES
304     // STARTS WITH CAPITAL, THEN LETTERS, DIGITS, _ + -
305 StateName:
306     /[A-Z][A-Za-z0-9_\+\-]*/ ;
308   // BUILTIN VS SPECIFIC ACTIONS
309 ActionSpec:
310     ActionSetVar | ActionClone | IncDec | ActionBecome | ActionMessage | ActionMethod ;
312        // INCREASE/DECREASE ACTIONS
313 IncDec:
314     direction=Direction ':' var=[StateVar]
315     'rate:' rate=StringOrLine
318 Direction:
319     'increase' | 'decrease' ;
321 ActionSetVar:
322     'set_var:' var=[StateVar]
323     'value:' value=StringOrLine
326 ActionClone:
327     (('clone:' | 'produce_offspring:' proto = SingleOrListProto)
328     ('amount:' amount=StringOrLine)?
329     ('proba:' probas=SingleOrListValues)?)#
332 SingleOrListProto:
333     SingleProto | ListProto ;
335 SingleOrListValues:
336     ListValue | StringOrLine ;
338 ListValue:
340     ('-' values=StringOrLine)+ ;
342 SingleProto:
343     prototype=[Prototype] ;
345 ListProto:
346     protos+=ProtoItems
349 ProtoItems:
350     ('-' protos=[Prototype])
353 ActionBecome:
354     'become:' prototype=[Prototype] ;
356 ActionMessage:
357     'message:' message=StringOrLine ;
360     // ACTION DEFINED BY A SPECIFIC METHOD
361 ActionMethod:
362     (('action:' action=[Action])               // NAME OF THE ACTION
363     ('l_params:' ('-' lparams=StringOrLine)+)? // LIST OF POSITIONAL PARAMETERS
364     ('d_params:' (dparams=KeyValue)+)?)#       // DICT OF OPTIONAL PARAMETERS
367 Edge:                                          // DEFINITION OF TRANSITIONS EDGES
368     '-'
369     (('from:' source=[State])                  // SOURCE STATE
370     ('to:' dest=[State])                       // DESTINATION STATE
371     (quantifier=QuantifierType ':' value=StringOrLine) // RATE/PROBA/AMOUNT
372     ('when:' when=StringOrLine)?               // EVENT-RELATED CONDITION
373     ('escape:' cond=StringOrLine)?             // ESCAPE CONDITION
374     ('cond:' cond=StringOrLine)?               // INDIVIDUAL CONDITION
375     ('on_cross:' ('-' cross=ActionSpec)+)?
376     ('desc:' desc=StringOrLine)?)#             // MEANING OF THE TRANSITION
379 ProductionEdge:                                  // DEFINITION OF PRODUCTION EDGES
380     '-'
381     (('from:' source=[State])                  // SOURCE STATE
382     ('to:' dest=[State])                       // DESTINATION STATE
383     (quantifier=QuantifierType ':' value=StringOrLine) // RATE/PROBA/AMOUNT
384     ('when:' when=StringOrLine)?               // EVENT-RELATED CONDITION
385     ('cond:' cond=StringOrLine)?               // INDIVIDUAL CONDITION
386     ('prototype:' prototype=[Prototype])?      // PROTOTYPE FOR INDIVIDUAL PRODUCTION
387     // ('on_cross:' ('-' cross=ActionSpec)+)?
388     ('desc:' desc=StringOrLine)?)#             // MEANING OF THE TRANSITION
391 QuantifierType:
392     'rate' | 'proba' | 'amount-all-but' | 'amount'
395 //  _____                               _
396 // |  __ \                             | |
397 // | |__) |_ _ _ __ __ _ _ __ ___   ___| |_ ___ _ __ ___
398 // |  ___/ _` | '__/ _` | '_ ` _ \ / _ \ __/ _ \ '__/ __|
399 // | |  | (_| | | | (_| | | | | | |  __/ ||  __/ |  \__ \
400 // |_|   \__,_|_|  \__,_|_| |_| |_|\___|\__\___|_|  |___/
402     // DESCRIPTION OF PARAMETERS
403 ParameterSection:
404     'parameters:' params+=Parameter ;
406 Parameter:
407     name=TrueID ':'                     // NAME OF THE PARAMETER
408       (('desc:' desc=StringOrLine)      // ROLE OF THE PARAMETER
409       ('value:' value=StringOrLine)     // VALUE OF THE PARAMETER
410       ('source:' source=StringOrLine)?  // SOURCE FOR THE PARAMETER VALUE
411     )#
415 //   _____ _        _
416 //  / ____| |      | |
417 // | (___ | |_ __ _| |_ _____   ____ _ _ __ ___
418 //  \___ \| __/ _` | __/ _ \ \ / / _` | '__/ __|
419 //  ____) | || (_| | ||  __/\ V / (_| | |  \__ \
420 // |_____/ \__\__,_|\__\___| \_/ \__,_|_|  |___/
422     // DESCRIPTION OF STATEVARS
423 StatevarSection:
424     'statevars:' statevars+=StateVar ;
426 StateVar:
427     name=TrueID ':'                     // NAME OF THE STATE VARIABLE
428       'desc:' desc=StringOrLine         // DESCRIPTION
431 //               _   _
432 //     /\       | | (_)
433 //    /  \   ___| |_ _  ___  _ __  ___
434 //   / /\ \ / __| __| |/ _ \| '_ \/ __|
435 //  / ____ \ (__| |_| | (_) | | | \__ \
436 // /_/    \_\___|\__|_|\___/|_| |_|___/
438     // DESCRIPTION OF ACTIONS
439 ActionSection:
440     'actions:' actions+=Action ;
442 Action:
443     name=TrueID ':'                     // NAME OF THE ACTION
444     'desc:' desc=StringOrLine           // DESCRIPTION
447 //   ____        _               _
448 //  / __ \      | |             | |
449 // | |  | |_   _| |_ _ __  _   _| |_ ___
450 // | |  | | | | | __| '_ \| | | | __/ __|
451 // | |__| | |_| | |_| |_) | |_| | |_\__ \
452 //  \____/ \__,_|\__| .__/ \__,_|\__|___/
453 //                  | |
454 //                  |_|
456     // TODO
457 OutputSection:
458     'outputs:'
459       (('type:' type=OutputType)
460       ('database_information:' base=DataBase)?
461       outputs*=OutputSpec)#
464 OutputType:
465     'relational' | 'json' | 'csv' ;
467 DataBase:
468     (('database:' dbname=ID)?
469     ('dialect:' dbtype='mysql'|'postgresql')?
470     ('driver:' dbdriver=ID)?
471     ('server_name:' dbserver=ValidHostName|ValidIP)?
472     ('port:' dbport=INT)?
473     ('username:' dbuser=ID)?
474     ('password:' dwpwd=StringOrLine)?)#
477 OutputSpec:
478     level=[Level] ':'
479     (('period:' period=INT)
480     ('extra_vars:' vars+=VarList)?)#
483 VarList:
484     '-' name=TrueID ;
486 //  _____           _        _
487 // |  __ \         | |      | |
488 // | |__) | __ ___ | |_ ___ | |_ _   _ _ __   ___  ___
489 // |  ___/ '__/ _ \| __/ _ \| __| | | | '_ \ / _ \/ __|
490 // | |   | | | (_) | || (_) | |_| |_| | |_) |  __/\__ \
491 // |_|   |_|  \___/ \__\___/ \__|\__, | .__/ \___||___/
492 //                                __/ | |
493 //                               |___/|_|
494     // DEFINITION OF PROTOTYPES FOR INITIAL/NEW AGENTS
495 ProtoSection:
496     'prototypes:' protos+=ProtoSpec ;
498 ProtoSpec:
499     level=[Level] ':'           // LEVEL WHERE THE PROTOTYPES ARE USED
500     prototypes+=Prototype       // LIST OF PROTOTYPES
503 Prototype:
504     '-' name=TrueID ':'           // NAME OF THE PROTOTYPE
505     content += ProtoContent
508 ProtoContent:
509     ('desc:' desc=StringOrLine)   // DESCRIPTION
510     | (init=InitProp)                // DICT OF VARIABLES
513 InitProp:
514     // var=[StateVarOrStateMachine] ':' value=StringOrLine // TODO:NOT WORKING?
515     var=TrueID ':' value=ListOrStringOrLine
518 ListOrStringOrLine:
519     ListOfValues | StringOrLine
522 ListOfValues:
523     ('-' val=NUMBER)+
526 //  _____       _ _   _       _
527 // |_   _|     (_) | (_)     | |
528 //   | |  _ __  _| |_ _  __ _| |
529 //   | | | '_ \| | __| |/ _` | |
530 //  _| |_| | | | | |_| | (_| | |
531 // |_____|_| |_|_|\__|_|\__,_|_|
533 //   _____                _ _ _   _
534 //  / ____|              | (_) | (_)
535 // | |     ___  _ __   __| |_| |_ _  ___  _ __  ___
536 // | |    / _ \| '_ \ / _` | | __| |/ _ \| '_ \/ __|
537 // | |___| (_) | | | | (_| | | |_| | (_) | | | \__ \
538 //  \_____\___/|_| |_|\__,_|_|\__|_|\___/|_| |_|___/
540     // DEFINITION OF SIMPLE INITIAL CONDITIONS
541 InitSection:
542     'initial_conditions:' inits+=InitSpec ;
544 InitSpec:
545     level=[Level] ':'           // LEVEL TO INITIALIZE
546     conditions+=InitialCondition       // LIST OF INITIAL CONDITIONS
549 InitialCondition:
550     PrototypeCondition | PopulationCondition
553 PrototypeCondition:
554     '-' (
555     ('prototype:' prototype=[Prototype]) // NAME OF THE PROTOTYPE
556     ('amount:' amount=StringOrLine) // QUANTITY OF AGENTS WITH THIS PROTOTYPE
557     )#
560 PopulationCondition:
561     '-' 'population:'
562     population += PopList
565 PopList:
566     TotalSpec | VarAmountSpec ;
568 TotalSpec:
569     '-' 'total:' total=StringOrLine ;
571 VarAmountSpec:
572     '-' (
573     ('vars:' varlist += VarList)
574     ('amount:' amount=StringOrLine)
575     )# ;
577 VarList:
578     '-' var=TrueID ;
581 ListOrStringOrLine:
582     ListOfValues | StringOrLine
585 ListOfValues:
586     ('-' val=NUMBER)+
591 //  _____  _     _        _ _           _   _
592 // |  __ \(_)   | |      (_) |         | | (_)
593 // | |  | |_ ___| |_ _ __ _| |__  _   _| |_ _  ___  _ __  ___
594 // | |  | | / __| __| '__| | '_ \| | | | __| |/ _ \| '_ \/ __|
595 // | |__| | \__ \ |_| |  | | |_) | |_| | |_| | (_) | | | \__ \
596 // |_____/|_|___/\__|_|  |_|_.__/ \__,_|\__|_|\___/|_| |_|___/
597     // TODO
598 DistributionSection:
599     'distributions:' dist+=Distribution ;
601     // SPECIFICATIONS FOR DISTRIBUTIONS
602 Distribution:
603     '-' name=TrueID ':'             // NAME
604     (('desc:' desc=StringOrLine)    // DESCRIPTION
605     ('type:' DistributionType)      // TYPE OF DISTRIBUTION
606     ('value:' values+=KeyValue))#   // PARAMETERS OF DISTRIBUTION
609 DistributionType:
610     'multinomial' ;
614 //  ______            _                                      _
615 // |  ____|          (_)                                    | |
616 // | |__   _ ____   ___ _ __ ___  _ __  _ __ ___   ___ _ __ | |_ ___
617 // |  __| | '_ \ \ / / | '__/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __/ __|
618 // | |____| | | \ V /| | | | (_) | | | | | | | | |  __/ | | | |_\__ \
619 // |______|_| |_|\_/ |_|_|  \___/|_| |_|_| |_| |_|\___|_| |_|\__|___/
621 // EnvironmentSection:
622 //     'environments:'
623 // ;
624 //TODO
627 //   _____                           _   _____       _
628 //  / ____|                         | | |  __ \     | |
629 // | |  __  ___ _ __   ___ _ __ __ _| | | |__) |   _| | ___  ___
630 // | | |_ |/ _ \ '_ \ / _ \ '__/ _` | | |  _  / | | | |/ _ \/ __|
631 // | |__| |  __/ | | |  __/ | | (_| | | | | \ \ |_| | |  __/\__ \
632 //  \_____|\___|_| |_|\___|_|  \__,_|_| |_|  \_\__,_|_|\___||___/
634     // KEY: VALUE PAIRS
635 KeyValue:
636     key=TrueID ':' value=StringOrLine ;
638     // AN ID THAT IS NOT A KEYWORD
639 TrueID:
640     (!Reserved ID) ;
642     // LIST OF KEYWORDS FOR EMULSION DSL
643 Reserved:
644     SectionName | ConstantKeyword | MajorKeyword | MinorKeyword ;
646 SectionName:
647     'model_name:' | 'levels:' | 'model_info:' | 'modules:' | 'outputs:' | 'grouping:' |
648     'parameters:' | 'processes:' | 'prototypes:' | 'state_machines:' |
649     'states:' | 'transitions:' | 'actions:' | 'statevars:' | 'time_info:' |
650     'calendars:' | 'events:' | 'initial_conditions:' | 'productions:'
653 ConstantKeyword:
654     'IBM' | 'hybrid' | 'compartment' | 'metapopulation' ;
656 MajorKeyword:
657     'desc:' | 'key_variables:' | 'value:' | 'machine_name:' |
658     'duration:' | 'fillcolor:' | 'name:' | 'on_enter:' | 'on_stay:' |
659     'on_exit:' | 'on_cross:' | 'from:' | 'to:' | 'rate:' | 'action:' |
660     'proba:' | 'amount:' | 'amount-all-but:' | 'when:' | 'cond:' | 'escape:' |
661     'date:' | 'begin:' | 'end:' | 'period:' | 'delta_t:' | 'origin:' |
662     'time_unit:' | 'total_duration:' | 'contains:' | 'aggregation_type:' |
663     'message:' | 'become:' | 'population:' | 'prototype:' | 'total:' |
664     'produce_offspring:' | 'set_var:' | 'aggregate_vars:' |
665     'collect:' | 'operator:'
668 MinorKeyword:
669     'compart_class:' | 'compart_manager:' | 'class_name:' | 'module:' | 'file:' |
670     'super:' | 'master:' | 'database_information:' | 'dialect:' |
671     'driver:' | 'password:' | 'server_name:' | 'username:' | 'type:' |
672     'init:' | 'options:' | 'distributions:' | 'extra_vars:' | 'autoremove:' | 'default:'
674     // EITHER A DELIMITED STRING OR THE END OF THE CURRENT LINE
675 StringOrLine:
676     STRING | /[\w\[{].*$/
679     // PATTERNS FOR VALID HOST NAMES
680 ValidHostName:
681     'localhost' |
682     /^(([a-z]|[a-z][a-z0-9\-]*[a-z0-9])\.)*([a-z]|[a-z][a-z0-9\-]*[a-z0-9])$/
685     // PATTERN FOR VALID IP ADDRESS
686 ValidIP:
687     /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
690     // SPECIFICATIONS OF A CLASS
691 ClassSpec:
692     (('module:' module=ModuleName)
693      ('class_name:' class=ClassName))#
696 ModuleName:
697     /[a-zA-Z0-9_\.]+/ ;
699 FileName:
700     /[a-zA-Z0-9_\.\/]+.py/ ;
702 ClassName:
703     /\b[A-Z][a-zA-Z0-9_]+/ ;
705 Comment:
706     /\#.*$/ ;