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

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 | ActionBecome | IncDec | 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 ActionBecome:
333     (('become:' proto=SingleOrListProto)
334     ('proba:' probas=SingleOrListValues)?)#
337 SingleOrListProto:
338     SingleProto | ListProto ;
340 SingleOrListValues:
341     ListValue | StringOrLine ;
343 ListValue:
345     ('-' values=StringOrLine)+ ;
347 SingleProto:
348     prototype=[Prototype] ;
350 ListProto:
351     protos+=ProtoItems
354 ProtoItems:
355     ('-' protos=[Prototype])
358 ActionMessage:
359     'message:' message=StringOrLine ;
362     // ACTION DEFINED BY A SPECIFIC METHOD
363 ActionMethod:
364     (('action:' action=[Action])               // NAME OF THE ACTION
365     ('l_params:' ('-' lparams=StringOrLine)+)? // LIST OF POSITIONAL PARAMETERS
366     ('d_params:' (dparams=KeyValue)+)?)#       // DICT OF OPTIONAL PARAMETERS
369 Edge:                                          // DEFINITION OF TRANSITIONS EDGES
370     '-'
371     (('from:' source=[State])                  // SOURCE STATE
372     ('to:' dest=[State])                       // DESTINATION STATE
373     (quantifier=QuantifierType ':' value=StringOrLine) // RATE/PROBA/AMOUNT
374     ('when:' when=StringOrLine)?               // EVENT-RELATED CONDITION
375     ('escape:' cond=StringOrLine)?             // ESCAPE CONDITION
376     ('cond:' cond=StringOrLine)?               // INDIVIDUAL CONDITION
377     ('on_cross:' ('-' cross=ActionSpec)+)?
378     ('desc:' desc=StringOrLine)?)#             // MEANING OF THE TRANSITION
381 ProductionEdge:                                  // DEFINITION OF PRODUCTION EDGES
382     '-'
383     (('from:' source=[State])                  // SOURCE STATE
384     ('to:' dest=[State])                       // DESTINATION STATE
385     (quantifier=QuantifierType ':' value=StringOrLine) // RATE/PROBA/AMOUNT
386     ('when:' when=StringOrLine)?               // EVENT-RELATED CONDITION
387     ('cond:' cond=StringOrLine)?               // INDIVIDUAL CONDITION
388     ('prototype:' prototype=[Prototype])?      // PROTOTYPE FOR INDIVIDUAL PRODUCTION
389     // ('on_cross:' ('-' cross=ActionSpec)+)?
390     ('desc:' desc=StringOrLine)?)#             // MEANING OF THE TRANSITION
393 QuantifierType:
394     'rate' | 'proba' | 'amount-all-but' | 'amount'
397 //  _____                               _
398 // |  __ \                             | |
399 // | |__) |_ _ _ __ __ _ _ __ ___   ___| |_ ___ _ __ ___
400 // |  ___/ _` | '__/ _` | '_ ` _ \ / _ \ __/ _ \ '__/ __|
401 // | |  | (_| | | | (_| | | | | | |  __/ ||  __/ |  \__ \
402 // |_|   \__,_|_|  \__,_|_| |_| |_|\___|\__\___|_|  |___/
404     // DESCRIPTION OF PARAMETERS
405 ParameterSection:
406     'parameters:' params+=Parameter ;
408 Parameter:
409     name=TrueID ':'                     // NAME OF THE PARAMETER
410       (('desc:' desc=StringOrLine)      // ROLE OF THE PARAMETER
411       ('value:' value=StringOrLine)     // VALUE OF THE PARAMETER
412       ('source:' source=StringOrLine)?  // SOURCE FOR THE PARAMETER VALUE
413     )#
417 //   _____ _        _
418 //  / ____| |      | |
419 // | (___ | |_ __ _| |_ _____   ____ _ _ __ ___
420 //  \___ \| __/ _` | __/ _ \ \ / / _` | '__/ __|
421 //  ____) | || (_| | ||  __/\ V / (_| | |  \__ \
422 // |_____/ \__\__,_|\__\___| \_/ \__,_|_|  |___/
424     // DESCRIPTION OF STATEVARS
425 StatevarSection:
426     'statevars:' statevars+=StateVar ;
428 StateVar:
429     name=TrueID ':'                     // NAME OF THE STATE VARIABLE
430       'desc:' desc=StringOrLine         // DESCRIPTION
433 //               _   _
434 //     /\       | | (_)
435 //    /  \   ___| |_ _  ___  _ __  ___
436 //   / /\ \ / __| __| |/ _ \| '_ \/ __|
437 //  / ____ \ (__| |_| | (_) | | | \__ \
438 // /_/    \_\___|\__|_|\___/|_| |_|___/
440     // DESCRIPTION OF ACTIONS
441 ActionSection:
442     'actions:' actions+=Action ;
444 Action:
445     name=TrueID ':'                     // NAME OF THE ACTION
446     'desc:' desc=StringOrLine           // DESCRIPTION
449 //   ____        _               _
450 //  / __ \      | |             | |
451 // | |  | |_   _| |_ _ __  _   _| |_ ___
452 // | |  | | | | | __| '_ \| | | | __/ __|
453 // | |__| | |_| | |_| |_) | |_| | |_\__ \
454 //  \____/ \__,_|\__| .__/ \__,_|\__|___/
455 //                  | |
456 //                  |_|
458     // TODO
459 OutputSection:
460     'outputs:'
461       (('type:' type=OutputType)
462       ('database_information:' base=DataBase)?
463       outputs*=OutputSpec)#
466 OutputType:
467     'relational' | 'json' | 'csv' ;
469 DataBase:
470     (('database:' dbname=ID)?
471     ('dialect:' dbtype='mysql'|'postgresql')?
472     ('driver:' dbdriver=ID)?
473     ('server_name:' dbserver=ValidHostName|ValidIP)?
474     ('port:' dbport=INT)?
475     ('username:' dbuser=ID)?
476     ('password:' dwpwd=StringOrLine)?)#
479 OutputSpec:
480     level=[Level] ':'
481     (('period:' period=INT)
482     ('extra_vars:' vars+=VarList)?)#
485 VarList:
486     '-' name=TrueID ;
488 //  _____           _        _
489 // |  __ \         | |      | |
490 // | |__) | __ ___ | |_ ___ | |_ _   _ _ __   ___  ___
491 // |  ___/ '__/ _ \| __/ _ \| __| | | | '_ \ / _ \/ __|
492 // | |   | | | (_) | || (_) | |_| |_| | |_) |  __/\__ \
493 // |_|   |_|  \___/ \__\___/ \__|\__, | .__/ \___||___/
494 //                                __/ | |
495 //                               |___/|_|
496     // DEFINITION OF PROTOTYPES FOR INITIAL/NEW AGENTS
497 ProtoSection:
498     'prototypes:' protos+=ProtoSpec ;
500 ProtoSpec:
501     level=[Level] ':'           // LEVEL WHERE THE PROTOTYPES ARE USED
502     prototypes+=Prototype       // LIST OF PROTOTYPES
505 Prototype:
506     '-' name=TrueID ':'           // NAME OF THE PROTOTYPE
507     content += ProtoContent
510 ProtoContent:
511     ('desc:' desc=StringOrLine)   // DESCRIPTION
512     | (init=InitProp)                // DICT OF VARIABLES
515 InitProp:
516     // var=[StateVarOrStateMachine] ':' value=StringOrLine // TODO:NOT WORKING?
517     var=TrueID ':' value=ListOrStringOrLine
520 ListOrStringOrLine:
521     ListOfValues | StringOrLine
524 ListOfValues:
525     ('-' val=NUMBER)+
528 //  _____       _ _   _       _
529 // |_   _|     (_) | (_)     | |
530 //   | |  _ __  _| |_ _  __ _| |
531 //   | | | '_ \| | __| |/ _` | |
532 //  _| |_| | | | | |_| | (_| | |
533 // |_____|_| |_|_|\__|_|\__,_|_|
535 //   _____                _ _ _   _
536 //  / ____|              | (_) | (_)
537 // | |     ___  _ __   __| |_| |_ _  ___  _ __  ___
538 // | |    / _ \| '_ \ / _` | | __| |/ _ \| '_ \/ __|
539 // | |___| (_) | | | | (_| | | |_| | (_) | | | \__ \
540 //  \_____\___/|_| |_|\__,_|_|\__|_|\___/|_| |_|___/
542     // DEFINITION OF SIMPLE INITIAL CONDITIONS
543 InitSection:
544     'initial_conditions:' inits+=InitSpec ;
546 InitSpec:
547     level=[Level] ':'           // LEVEL TO INITIALIZE
548     conditions+=InitialCondition       // LIST OF INITIAL CONDITIONS
551 InitialCondition:
552     PrototypeCondition | PopulationCondition
555 PrototypeCondition:
556     '-' (
557     ('prototype:' prototype=[Prototype]) // NAME OF THE PROTOTYPE
558     ('amount:' amount=StringOrLine) // QUANTITY OF AGENTS WITH THIS PROTOTYPE
559     )#
562 PopulationCondition:
563     '-' 'population:'
564     population += PopList
567 PopList:
568     TotalSpec | VarAmountSpec ;
570 TotalSpec:
571     '-' 'total:' total=StringOrLine ;
573 VarAmountSpec:
574     '-' (
575     ('vars:' varlist += VarList)
576     ('amount:' amount=StringOrLine)
577     )# ;
579 VarList:
580     '-' var=TrueID ;
583 ListOrStringOrLine:
584     ListOfValues | StringOrLine
587 ListOfValues:
588     ('-' val=NUMBER)+
593 //  _____  _     _        _ _           _   _
594 // |  __ \(_)   | |      (_) |         | | (_)
595 // | |  | |_ ___| |_ _ __ _| |__  _   _| |_ _  ___  _ __  ___
596 // | |  | | / __| __| '__| | '_ \| | | | __| |/ _ \| '_ \/ __|
597 // | |__| | \__ \ |_| |  | | |_) | |_| | |_| | (_) | | | \__ \
598 // |_____/|_|___/\__|_|  |_|_.__/ \__,_|\__|_|\___/|_| |_|___/
599     // TODO
600 DistributionSection:
601     'distributions:' dist+=Distribution ;
603     // SPECIFICATIONS FOR DISTRIBUTIONS
604 Distribution:
605     '-' name=TrueID ':'             // NAME
606     (('desc:' desc=StringOrLine)    // DESCRIPTION
607     ('type:' DistributionType)      // TYPE OF DISTRIBUTION
608     ('value:' values+=KeyValue))#   // PARAMETERS OF DISTRIBUTION
611 DistributionType:
612     'multinomial' ;
616 //  ______            _                                      _
617 // |  ____|          (_)                                    | |
618 // | |__   _ ____   ___ _ __ ___  _ __  _ __ ___   ___ _ __ | |_ ___
619 // |  __| | '_ \ \ / / | '__/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __/ __|
620 // | |____| | | \ V /| | | | (_) | | | | | | | | |  __/ | | | |_\__ \
621 // |______|_| |_|\_/ |_|_|  \___/|_| |_|_| |_| |_|\___|_| |_|\__|___/
623 // EnvironmentSection:
624 //     'environments:'
625 // ;
626 //TODO
629 //   _____                           _   _____       _
630 //  / ____|                         | | |  __ \     | |
631 // | |  __  ___ _ __   ___ _ __ __ _| | | |__) |   _| | ___  ___
632 // | | |_ |/ _ \ '_ \ / _ \ '__/ _` | | |  _  / | | | |/ _ \/ __|
633 // | |__| |  __/ | | |  __/ | | (_| | | | | \ \ |_| | |  __/\__ \
634 //  \_____|\___|_| |_|\___|_|  \__,_|_| |_|  \_\__,_|_|\___||___/
636     // KEY: VALUE PAIRS
637 KeyValue:
638     key=TrueID ':' value=StringOrLine ;
640     // AN ID THAT IS NOT A KEYWORD
641 TrueID:
642     (!Reserved ID) ;
644     // LIST OF KEYWORDS FOR EMULSION DSL
645 Reserved:
646     SectionName | ConstantKeyword | MajorKeyword | MinorKeyword ;
648 SectionName:
649     'model_name:' | 'levels:' | 'model_info:' | 'modules:' | 'outputs:' | 'grouping:' |
650     'parameters:' | 'processes:' | 'prototypes:' | 'state_machines:' |
651     'states:' | 'transitions:' | 'actions:' | 'statevars:' | 'time_info:' |
652     'calendars:' | 'events:' | 'initial_conditions:' | 'productions:'
655 ConstantKeyword:
656     'IBM' | 'hybrid' | 'compartment' | 'metapopulation' ;
658 MajorKeyword:
659     'desc:' | 'key_variables:' | 'value:' | 'machine_name:' |
660     'duration:' | 'fillcolor:' | 'name:' | 'on_enter:' | 'on_stay:' |
661     'on_exit:' | 'on_cross:' | 'from:' | 'to:' | 'rate:' | 'action:' |
662     'proba:' | 'amount:' | 'amount-all-but:' | 'when:' | 'cond:' | 'escape:' |
663     'date:' | 'begin:' | 'end:' | 'period:' | 'delta_t:' | 'origin:' |
664     'time_unit:' | 'total_duration:' | 'contains:' | 'aggregation_type:' |
665     'message:' | 'become:' | 'population:' | 'prototype:' | 'total:' |
666     'produce_offspring:' | 'set_var:' | 'aggregate_vars:' |
667     'collect:' | 'operator:'
670 MinorKeyword:
671     'compart_class:' | 'compart_manager:' | 'class_name:' | 'module:' | 'file:' |
672     'super:' | 'master:' | 'database_information:' | 'dialect:' |
673     'driver:' | 'password:' | 'server_name:' | 'username:' | 'type:' |
674     'init:' | 'options:' | 'distributions:' | 'extra_vars:' | 'autoremove:' | 'default:'
676     // EITHER A DELIMITED STRING OR THE END OF THE CURRENT LINE
677 StringOrLine:
678     STRING | /[\w\[{].*$/
681     // PATTERNS FOR VALID HOST NAMES
682 ValidHostName:
683     'localhost' |
684     /^(([a-z]|[a-z][a-z0-9\-]*[a-z0-9])\.)*([a-z]|[a-z][a-z0-9\-]*[a-z0-9])$/
687     // PATTERN FOR VALID IP ADDRESS
688 ValidIP:
689     /^(([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])$/
692     // SPECIFICATIONS OF A CLASS
693 ClassSpec:
694     (('module:' module=ModuleName)
695      ('class_name:' class=ClassName))#
698 ModuleName:
699     /[a-zA-Z0-9_\.]+/ ;
701 FileName:
702     /[a-zA-Z0-9_\.\/]+.py/ ;
704 ClassName:
705     /\b[A-Z][a-zA-Z0-9_]+/ ;
707 Comment:
708     /\#.*$/ ;