sdl92.g 37.6 KB
Newer Older
dbarbera's avatar
dbarbera committed
1
/*
Maxime Perrotin's avatar
Maxime Perrotin committed
2
3
    OpenGEODE
    ANTLR 3.1.3 grammar for the SDL92 langage
4
5
    Includes the following features from SDL2000+:
    - FOR loops in TASKs
6
    - Composite states (nested and agreggation/parallel states)
Maxime Perrotin's avatar
Maxime Perrotin committed
7
8

    author: Maxime Perrotin
9
    with contributions from Diego Barbera, Laurent Meyer
Maxime Perrotin's avatar
Maxime Perrotin committed
10
11
12
13
14
15
16
17
18
19
20
21
22
*/

grammar sdl92;

options {
    language=Python;
    output=AST;
    ASTLabelType=CommonTree;
    backtrack=true;
}

tokens {
        ACTION;
dbarbera's avatar
dbarbera committed
23
        ALL;
Maxime Perrotin's avatar
Maxime Perrotin committed
24
25
        ALTERNATIVE;
        ANSWER;
dbarbera's avatar
dbarbera committed
26
27
28
29
30
31
32
33
        ARRAY;
        ASN1;
        ASSIGN;
        BITSTR;
        BLOCK;
        CHANNEL;
        CHOICE;
        CIF;
Maxime Perrotin's avatar
Maxime Perrotin committed
34
        CLOSED_RANGE;
dbarbera's avatar
dbarbera committed
35
36
        COMMENT;
        COMPOSITE_STATE;
37
        CONDITIONAL;
dbarbera's avatar
dbarbera committed
38
39
        CONNECT;
        CONNECTION;
Maxime Perrotin's avatar
Maxime Perrotin committed
40
        CONSTANT;
dbarbera's avatar
dbarbera committed
41
42
43
44
        CONSTANTS;
        DCL;
        DECISION;
        DIGITS;
Maxime Perrotin's avatar
Maxime Perrotin committed
45
        ELSE;
dbarbera's avatar
dbarbera committed
46
47
48
49
        EMPTYSTR;
        ENDNEWTYPE;
        ENDSYNTYPE;
        ENDTEXT;
50
        ENTRY_POINT;
dbarbera's avatar
dbarbera committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
        EXPORT;
        EXPRESSION;
        EXTERNAL;
        FI;
        FIELD;
        FIELD_NAME;
        FIELDS;
        FLOAT2;
        FLOAT;
        FLOATING_LABEL;
        FOR;
        FPAR;
        GROUND;
        HYPERLINK;
        IF;
        IFTHENELSE;
        IN;
        INFORMAL_TEXT;
        INOUT;
        INPUT;
        INPUT_NONE;
        INPUTLIST;
        JOIN;
        LABEL;
75
        LITERAL;
dbarbera's avatar
dbarbera committed
76
77
78
79
80
81
        NEG;
        NEWTYPE;
        NEXTSTATE;
        NUMBER_OF_INSTANCES;
        OCTSTR;
        OPEN_RANGE;
Maxime Perrotin's avatar
Maxime Perrotin committed
82
83
        OUTPUT;
        OUTPUT_BODY;
dbarbera's avatar
dbarbera committed
84
85
        PARAM;
        PARAMNAMES;
Maxime Perrotin's avatar
Maxime Perrotin committed
86
        PARAMS;
87
        PAREN;
88
        PFPAR;
89
        POINT;
Maxime Perrotin's avatar
Maxime Perrotin committed
90
        PRIMARY;
dbarbera's avatar
dbarbera committed
91
92
93
94
95
        PROCEDURE;
        PROCEDURE_CALL;
        PROCEDURE_NAME;
        PROCESS;
        PROVIDED;
Maxime Perrotin's avatar
Maxime Perrotin committed
96
        QUESTION;
dbarbera's avatar
dbarbera committed
97
98
99
        RANGE;
        RESET;
        RETURN;
Maxime Perrotin's avatar
Maxime Perrotin committed
100
        ROUTE;
dbarbera's avatar
dbarbera committed
101
        SAVE;
102
        SELECTOR;
dbarbera's avatar
dbarbera committed
103
104
105
106
107
108
109
        SEQOF;
        SEQUENCE;
        SET;
        SIGNAL;
        SIGNAL_LIST;
        SORT;
        STATE;
110
111
        STATE_AGGREGATION;
        STATE_PARTITION_CONNECTION;
dbarbera's avatar
dbarbera committed
112
113
114
        STATELIST;
        STIMULUS;
        STOP;
Maxime Perrotin's avatar
Maxime Perrotin committed
115
        STOPIF;
dbarbera's avatar
dbarbera committed
116
        STRING;
117
        STRUCT;
118
119
        SYNONYM;
        SYNONYM_LIST;
dbarbera's avatar
dbarbera committed
120
121
122
123
124
125
126
127
128
129
130
131
        SYNTYPE;
        SYSTEM;
        TASK;
        TASK_BODY;
        TERMINATOR;
        TEXT;
        TEXTAREA;
        TEXTAREA_CONTENT;
        THEN;
        TIMER;
        TO;
        TRANSITION;
132
        TYPE_INSTANCE;
dbarbera's avatar
dbarbera committed
133
134
135
136
137
138
        USE;
        VALUE;
        VARIABLE;
        VARIABLES;
        VIA;
        VIAPATH;
Maxime Perrotin's avatar
Maxime Perrotin committed
139
140
141
142
143
144
145
146
147
}


/*
    Top level: any .pr file
*/
pr_file
        :       (use_clause
                | system_definition
148
149
                | process_definition)+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
150
151
152
153
154
155


system_definition
        :       SYSTEM system_name end
                entity_in_system*
                ENDSYSTEM system_name? end
156
157
        ->      ^(SYSTEM system_name entity_in_system*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
158
159
160
161


use_clause
        :       use_asn1?
162
163
164
                USE package_name
                ('/' def_selection_list )?
                end
165
166
167
        ->      ^(USE use_asn1? end? package_name def_selection_list?)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
168

169
170
171
172
/*
    In USE clause: USE package/X, Y, Z;
*/
def_selection_list
173
174
175
        :       ID (','! ID)*
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
176
177
178
179
180
181

/* Entity in system:
   Declare signals, external procedures, connections and blocks
*/
entity_in_system
        :       signal_declaration
182
                | text_area
Maxime Perrotin's avatar
Maxime Perrotin committed
183
184
                | procedure
                | channel
185
186
                | block_definition
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
187
188
189
190
191
192
193

/* signal_declaration:
   e.g. SIGNAL open_door(typeA, typeB);
*/
signal_declaration
        :       paramnames?
                SIGNAL signal_id input_params? end
194
195
        ->      ^(SIGNAL paramnames? signal_id input_params?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
196
197
198
199
200
201


channel
        :       CHANNEL channel_id
                route+
                ENDCHANNEL end
202
203
        ->      ^(CHANNEL channel_id route+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
204
205
206
207


route
        :       FROM source_id TO dest_id WITH signal_id (',' signal_id)* end
208
209
        ->      ^(ROUTE source_id dest_id signal_id+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
210
211
212
213


block_definition
        :       BLOCK block_id end
dbarbera's avatar
dbarbera committed
214
                entity_in_block*
Maxime Perrotin's avatar
Maxime Perrotin committed
215
                ENDBLOCK end
216
217
        ->      ^(BLOCK block_id entity_in_block*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
218
219
220
221
222
223
224
225
226
227
228


/* Inside a SDL block:
   there can be nested blocks, processes, signalroutes and connections
   to above channels
*/
entity_in_block
        :       signal_declaration
                | signalroute
                | connection
                | block_definition
229
230
                | process_definition
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
231
232
233
234
235


signalroute
        :       SIGNALROUTE route_id
                route+
236
237
        ->      ^(SIGNALROUTE route_id route+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
238
239
240
241


connection
        :       CONNECT channel_id AND route_id end
242
243
        ->      ^(CONNECTION channel_id route_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
244
245
246
247
248


process_definition
        :       PROCESS process_id number_of_instances? REFERENCED end
        ->      ^(PROCESS process_id number_of_instances? REFERENCED)
249
                | cif? PROCESS process_id number_of_instances? end
250
                pfpar?
251
                (text_area | procedure | composite_state)*
Maxime Perrotin's avatar
Maxime Perrotin committed
252
253
                processBody? ENDPROCESS process_id?
                end
254
255
256
257
258
259
        ->      ^(PROCESS cif? process_id number_of_instances? end?
                pfpar? text_area* procedure* composite_state* processBody?)
                | cif? PROCESS process_id number_of_instances? (':' type_inst)?
                end
        ->      ^(PROCESS cif? process_id type_inst? number_of_instances? end?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
260

261

262
263
264
265
266
// Process formal parameters
pfpar
        :       FPAR parameters_of_sort
                (',' parameters_of_sort)*
                end
267
268
269
        ->      ^(PFPAR parameters_of_sort+)
        ;

270
271
272

parameters_of_sort
        :       variable_id (',' variable_id)* sort
273
274
        ->      ^(PARAM variable_id+ sort)
        ;
275

Maxime Perrotin's avatar
Maxime Perrotin committed
276

277
278
// procedure: missing the RETURNS statement
// (TODO - but check new SDL2000 syntax that has no RETURNS token)
Maxime Perrotin's avatar
Maxime Perrotin committed
279
280
procedure
        :       cif?
281
                PROCEDURE procedure_id e1=end
Maxime Perrotin's avatar
Maxime Perrotin committed
282
283
284
                fpar?
                (text_area | procedure)*
                ((processBody? ENDPROCEDURE procedure_id?) | EXTERNAL)
285
286
                e2=end
        ->      ^(PROCEDURE cif? procedure_id $e1? $e2? fpar?
287
288
                text_area* procedure* processBody? EXTERNAL?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
289
290
291
292
293
294
295


// Procedure formal parameters
fpar
        :       FPAR formal_variable_param
                (',' formal_variable_param)*
                end
296
297
        ->      ^(FPAR formal_variable_param+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
298
299
300


formal_variable_param
301
        :       (INOUT | IN | OUT)?
Maxime Perrotin's avatar
Maxime Perrotin committed
302
                variable_id (',' variable_id)* sort
303
304
        ->      ^(PARAM INOUT? IN? OUT? variable_id+ sort)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
305
306
307
308
309
310
311


// text_area: TODO add operator description in content
text_area
        :       cif
                content?
                cif_end_text
312
313
        ->      ^(TEXTAREA cif content? cif_end_text)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
314
315
316
317
318
319


// Text areas can contain textual procedures, FPAR declarations,
// and variable or timer declarations
content
        :        (procedure
320
321
                 | use_clause
                 | signal_declaration
Maxime Perrotin's avatar
Maxime Perrotin committed
322
323
                 | fpar
                 | timer_declaration
324
325
                 | syntype_definition
                 | newtype_definition
326
327
                 | variable_definition
                 | synonym_definition)*
Maxime Perrotin's avatar
Maxime Perrotin committed
328
329
        ->       ^(TEXTAREA_CONTENT fpar* procedure* variable_definition*
                   syntype_definition* newtype_definition* timer_declaration*
330
331
                   signal_declaration* use_clause* synonym_definition*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
332
333
334
335
336
337


timer_declaration
        :       TIMER timer_id
                (',' timer_id)*
                end
338
339
340
        ->      ^(TIMER timer_id+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
341

342
syntype_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
343
344
345
        :       SYNTYPE syntype_name '=' parent_sort
                (CONSTANTS (range_condition (',' range_condition)* ))?
                ENDSYNTYPE syntype_name? end
346
347
348
        ->      ^(SYNTYPE syntype_name parent_sort range_condition*)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
349
350

syntype_name
351
352
353
        :       sort
        ;

354
355

parent_sort
356
357
358
        :       sort
        ;

359
360

newtype_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
361
362
        :       NEWTYPE type_name (array_definition|structure_definition)?
                ENDNEWTYPE type_name? end
363
364
        ->      ^(NEWTYPE type_name array_definition* structure_definition*)
        ;
365
366
367


type_name
368
369
370
        :       sort
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
371

372
array_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
373
        :       ARRAY '(' sort ',' sort ')'
374
375
376
        ->      ^(ARRAY sort sort)
        ;

377
378

structure_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
379
        :       STRUCT field_list end
380
381
382
        ->      ^(STRUCT field_list)
        ;

383
384

field_list
Maxime Perrotin's avatar
Maxime Perrotin committed
385
        :       field_definition (end field_definition)*
386
387
388
        ->      ^(FIELDS field_definition+)
        ;

389
390

field_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
391
        :       field_name (',' field_name)* sort
392
393
394
        ->      ^(FIELD field_name+ sort)
        ;

395

Maxime Perrotin's avatar
Maxime Perrotin committed
396
397
398
399
variable_definition
        :       DCL variables_of_sort
                (',' variables_of_sort)*
                end
400
401
402
        ->      ^(DCL variables_of_sort+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
403

Maxime Perrotin's avatar
Maxime Perrotin committed
404
synonym_definition
405
406
407
        :       internal_synonym_definition
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
408

409
internal_synonym_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
410
411
        :       SYNONYM synonym_definition_item (',' synonym_definition_item)*
                end
412
413
414
        ->      ^(SYNONYM_LIST synonym_definition_item+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
415

416
synonym_definition_item
Maxime Perrotin's avatar
Maxime Perrotin committed
417
        :       sort sort '=' ground_expression
418
419
420
        ->      ^(SYNONYM sort sort ground_expression)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
421
422
423

variables_of_sort
        :       variable_id (',' variable_id)* sort (':=' ground_expression)?
424
425
        ->      ^(VARIABLES variable_id+ sort ground_expression?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
426
427
428
429


ground_expression
        :       expression
430
431
        ->      ^(GROUND expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
432
433
434
435


number_of_instances
        :       '(' initial_number=INT ',' maximum_number=INT ')'
436
437
        ->      ^(NUMBER_OF_INSTANCES $initial_number $maximum_number)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
438
439
440


processBody
441
442
        :       start? (state | floating_label)*
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
443
444
445
446
447


start
        :       cif?
                hyperlink?
448
                START name=state_entry_point_name? end
Maxime Perrotin's avatar
Maxime Perrotin committed
449
                transition?
450
451
        ->      ^(START cif? hyperlink? $name? end? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
452
453
454
455
456
457
458
459
460


floating_label
        :       cif?
                hyperlink?
                CONNECTION connector_name ':'
                transition?
                cif_end_label?
                ENDCONNECTION SEMI
461
462
        ->      ^(FLOATING_LABEL cif? hyperlink? connector_name transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
463
464
465


state
466
        :       cif?
Maxime Perrotin's avatar
Maxime Perrotin committed
467
468
469
470
                hyperlink?
                STATE statelist e=end
                (state_part)*
                ENDSTATE statename? f=end
471
472
        ->      ^(STATE cif? hyperlink? $e? statelist state_part*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
473
474
475
476


statelist
        :       ((statename)(',' statename)*)
477
        ->      ^(STATELIST statename+)
Maxime Perrotin's avatar
Maxime Perrotin committed
478
                | ASTERISK exception_state?
479
480
        ->      ^(ASTERISK exception_state?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
481
482
483


exception_state
484
        :       '(' statename (',' statename)* ')'
485
486
        ->      statename+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
487
488


489
// 11.11 State Machine and Composite State (SDL2000)
490
composite_state
491
492
493
494
495
496
        :       composite_state_graph
                | state_aggregation
        ;


composite_state_graph
497
498
        :       STATE statename e=end
                SUBSTRUCTURE
499
                connection_points*
500
501
                body=composite_state_body
                ENDSUBSTRUCTURE statename? f=end
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
        ->      ^(COMPOSITE_STATE statename connection_points* $body $e?)
        ;


// 11.11.2 State Aggregation (SDL2000)
state_aggregation
        :       STATE AGGREGATION statename e=end
                SUBSTRUCTURE
                connection_points*
                entities=entity_in_composite_state*
                body=state_aggregation_body
                ENDSUBSTRUCTURE statename? f=end
        ->      ^(STATE_AGGREGATION statename connection_points*
                                    $entities* $body $e?)
        ;


// 11.11.2 State Aggregation (SDL2000)
entity_in_composite_state
        :       (text_area | procedure)
        ;


// 11.11.2 State Aggregation (SDL2000)
state_aggregation_body
        :       (state_partitioning | state_partition_connection)+
528
                state*
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
        ;


// 11.11.2 State Aggregation (SDL2000)
state_partitioning
        :       composite_state
        ;


// 11.11.2 State Aggregation (SDL2000)
state_partition_connection
        :       CONNECT outer=entry_point AND inner=entry_point end
        ->      ^(STATE_PARTITION_CONNECTION $outer $inner end?)
        ;


// 11.11.2 State Aggregation (SDL2000)
entry_point
        :       state_part_id=ID VIA point
        ->      ^(ENTRY_POINT $state_part_id point)
        ;


// 11.11.2 State Aggregation (SDL2000)
point
        :       (state_point=ID | DEFAULT)
        ->      ^(POINT $state_point? DEFAULT?)
        ;
557
558


559
// 11.11.1 and 11.11.2 Composite State (SDL2000)
560
connection_points
561
562
563
        :       IN state_entry_exit_points end
        ->      ^(IN state_entry_exit_points end?)
                | OUT state_entry_exit_points end
564
565
        ->      ^(OUT state_entry_exit_points end?)
        ;
566
567


568
// 11.11.1 and 11.11.2 Composite State (SDL2000)
569
570
state_entry_exit_points
        :       '(' statename (',' statename)* ')'
571
572
        ->      statename+
        ;
573
574


575
// 11.11.1 Composite State graph content (SDL2000)
576
577
composite_state_body
        :       (text_area | procedure | composite_state)*
578
579
                start* (state | floating_label)*
        ;
580
581


Maxime Perrotin's avatar
Maxime Perrotin committed
582
583
584
585
586
state_part
        :       input_part
                //| priority_input        // Not supported
                | save_part               // Not supported in openGEODE
                | spontaneous_transition
587
                | continuous_signal       // Not supoorted in openGEODE
588
589
                | connect_part
        ;
590
591
592
593


// connect part is used to connect nested state exit points to a transition
connect_part
Maxime Perrotin's avatar
Maxime Perrotin committed
594
595
596
597
        :       cif?
                hyperlink?
                CONNECT connect_list? end
                transition?
598
599
        ->      ^(CONNECT cif? hyperlink? connect_list? end? transition?)
        ;
600
601
602
603
604


connect_list
        :       state_exit_point_name (',' state_exit_point_name)*
                -> state_exit_point_name+
605
606
                | ASTERISK
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
607
608
609
610
611
612
613
614


spontaneous_transition
        :       cif?
                hyperlink?
                INPUT NONE end
                enabling_condition?
                transition
615
616
        ->      ^(INPUT_NONE cif? hyperlink? transition)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
617
618
619
620


enabling_condition
        :       PROVIDED expression end
621
622
        ->      ^(PROVIDED expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
623
624
625


continuous_signal
dbarbera's avatar
dbarbera committed
626
        :       PROVIDED expression end
627
                (PRIORITY integer_literal_name=INT end)?
Maxime Perrotin's avatar
Maxime Perrotin committed
628
                transition
629
630
        ->      ^(PROVIDED expression $integer_literal_name? transition)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
631
632
633
634
635


save_part
        :       SAVE save_list
                end
636
637
        ->      ^(SAVE save_list)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
638
639
640
641


save_list
        :       signal_list
642
643
                | asterisk_save_list
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
644
645
646
647
648
649
650
651


asterisk_save_list
        :       ASTERISK;


signal_list
        :       signal_item (',' signal_item)*
652
653
        ->      ^(SIGNAL_LIST signal_item+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
654
655
656
657
658
659
660
661
662
663
664



// Signal_item alternatives are all of the same ID type.
// Should be resolved at semantic analysis.
signal_item
        :       signal_id; /* |
                priority_signal_id |
                signal_list_id |
                timer_id;*/

dbarbera's avatar
dbarbera committed
665
/*   Not considered for the moment
Maxime Perrotin's avatar
Maxime Perrotin committed
666
667
     (irrelevant in the scope of the generation of code for a single process)
priority_input
dbarbera's avatar
dbarbera committed
668
        :       PRIORITY INPUT priority_input_list end transition;
Maxime Perrotin's avatar
Maxime Perrotin committed
669
670
671
672
673
674
675
676
677
678
679
680
681
682


priority_input_list
        :       priority_stimulus (',' priority_stimulus)*;

priority_stimulus
        :       priority_signal_id ( '(' variable_id (',' variable_id)* ')');
*/


// this is only the "basic input part" from SDL92
input_part
        :       cif?
                hyperlink?
Maxime Perrotin's avatar
Maxime Perrotin committed
683
684
                INPUT inputlist end
                enabling_condition?
Maxime Perrotin's avatar
Maxime Perrotin committed
685
686
                transition?
        ->      ^(INPUT cif? hyperlink? end?
687
688
                inputlist enabling_condition? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
689
690
691
692
693
694
695


// asterisk means: all signals not excplicitely specified
// (semantic is different from asterisk state)
inputlist
        :       ASTERISK
                | (stimulus (',' stimulus)*)
696
697
        ->      ^(INPUTLIST stimulus+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
698
699
700


stimulus
701
702
        :       stimulus_id input_params?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
703
704
705
706


input_params
        :       L_PAREN variable_id (',' variable_id)* R_PAREN
707
708
        ->      ^(PARAMS variable_id+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
709
710
711
712
713
714


transition
        :       action+ label? terminator_statement?
        ->      ^(TRANSITION action+ label? terminator_statement?)
                | terminator_statement
715
716
        ->      ^(TRANSITION terminator_statement)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
717
718
719
720
721
722
723
724
725
726
727
728
729


action
        :       label?
                (task
                | task_body
                | output
                | create_request
                | decision
                | transition_option
                | set_timer
                | reset_timer
                | export     // Not supported in OpenGEODE
730
731
732
                | procedure_call)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
733
734
735
736
737

export
        :       EXPORT
                L_PAREN variable_id (COMMA variable_id)* R_PAREN
                end
738
739
740
        ->      ^(EXPORT variable_id+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
741
742
743

/*
remote_procedure_call
dbarbera's avatar
dbarbera committed
744
        :       CALL remote_procedure_call_body;
Maxime Perrotin's avatar
Maxime Perrotin committed
745
746

remote_procedure_call_body
dbarbera's avatar
dbarbera committed
747
        :       remote_procedure_id actual_parameters? (TO destination)?;
Maxime Perrotin's avatar
Maxime Perrotin committed
748
749
750
751
752
*/
procedure_call
        :       cif?
                hyperlink?
                CALL procedure_call_body end
753
754
        ->      ^(PROCEDURE_CALL cif? hyperlink? end? procedure_call_body)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
755
756
757


procedure_call_body
dbarbera's avatar
dbarbera committed
758
        :       procedure_id actual_parameters?
759
760
        ->      ^(OUTPUT_BODY procedure_id actual_parameters?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
761
762
763
764
765


set_timer
        :       SET set_statement (COMMA set_statement)*
                end
766
767
        ->      set_statement+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
768
769
770
771


set_statement
        :       L_PAREN (expression COMMA)? timer_id R_PAREN
772
773
        ->      ^(SET expression? timer_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
774
775
776
777
778
779
        // ('('expression_list')')? ')'; (removed because of non-LL(*) problem)


reset_timer
        :       RESET reset_statement (',' reset_statement)*
                end
780
781
        ->      reset_statement+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
782
783
784
785


reset_statement
        :       timer_id ('(' expression_list ')')?
786
787
        ->      ^(RESET timer_id expression_list?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
788
789
790
791
792
793
794


transition_option
        :       ALTERNATIVE alternative_question e=end
                answer_part
                alternative_part
                ENDALTERNATIVE f=end
795
796
        ->      ^(ALTERNATIVE answer_part alternative_part)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
797
798
799
800
801
802


alternative_part
        :       (answer_part+ else_part?)
        ->      answer_part+ else_part?
                | else_part
803
804
        ->      else_part
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
805
806
807
808


alternative_question
        :       expression
809
810
                | informal_text
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
811
812
813
814
815
816
817
818
819
820


decision
        :       cif?
                hyperlink?
                DECISION question e=end
                answer_part?
                alternative_part?
                ENDDECISION f=end
        ->      ^(DECISION cif? hyperlink? $e? question
821
822
                answer_part? alternative_part?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
823
824
825
826
827
828


answer_part
        :       cif?
                hyperlink?
                L_PAREN answer R_PAREN ':' transition?
829
830
        ->      ^(ANSWER cif? hyperlink? answer transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
831
832
833
834


answer
        :       range_condition
835
836
                | informal_text
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
837
838
839
840
841
842


else_part
        :       cif?
                hyperlink?
                ELSE ':' transition?
843
844
        ->      ^(ELSE cif? hyperlink? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
845
846
847


question
848
849
        :       informal_text
                | expression
Maxime Perrotin's avatar
Maxime Perrotin committed
850
851
        ->      ^(QUESTION expression)
                | ANY
852
853
        ->      ^(ANY)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
854
855
856


range_condition
857
858
        :       (closed_range | open_range)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
859
860
861
862
                //(',' (closed_range|open_range))*;


closed_range
863
        :       a=expression ':' b=expression
864
865
        ->      ^(CLOSED_RANGE $a $b)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
866
867
868
869
870
871


open_range
        :       constant
        ->      constant
                | ( (EQ|NEQ|GT|LT|LE|GE) constant)
872
873
        ->      ^(OPEN_RANGE EQ? NEQ? GT? LT? LE? GE? constant)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
874
875
876
877


constant
        :       expression
878
879
        ->      ^(CONSTANT expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
880
881
882


create_request
dbarbera's avatar
dbarbera committed
883
        :       CREATE
Maxime Perrotin's avatar
Maxime Perrotin committed
884
885
886
                createbody
                actual_parameters?
                end
887
888
        ->      ^(CREATE createbody actual_parameters?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
889
890
891
892


createbody
        :       process_id
893
894
                | THIS
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
895
896
897
898
899
900


output
        :       cif?
                hyperlink?
                OUTPUT outputbody end
901
902
        ->      ^(OUTPUT cif? hyperlink? end? outputbody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
903
904
905


outputbody
906
        :       outputstmt (',' outputstmt)* to_part?
907
908
        ->      ^(OUTPUT_BODY outputstmt+ to_part?)
        ;
909
910
 //               via_part?
 //     -> (signal_id actual_parameters?)+ to_part? via_part?;
Maxime Perrotin's avatar
Maxime Perrotin committed
911
912
913


outputstmt
dbarbera's avatar
dbarbera committed
914
        :       signal_id
915
916
                actual_parameters?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
917

918
to_part
Maxime Perrotin's avatar
Maxime Perrotin committed
919
        :       (TO destination)
920
921
        ->      ^(TO destination)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
922

923
via_part
dbarbera's avatar
dbarbera committed
924
        :       VIA viabody
925
926
        ->      ^(VIA viabody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
927
928
929
930


// ambiguous in SDL92, added OR between ALL and via_path
viabody
dbarbera's avatar
dbarbera committed
931
        :       ALL
Maxime Perrotin's avatar
Maxime Perrotin committed
932
933
        ->      ^(ALL)
                | via_path
934
935
        ->      ^(VIAPATH via_path)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
936
937
938
939
940


destination
        :       pid_expression
                | process_id
941
942
                | THIS
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
943
944
945
946


via_path
        :       via_path_element (',' via_path_element)*
947
948
        ->      via_path_element+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
949
950
951


via_path_element
952
953
        :       ID
        ; // signal_route_id | channel_id | gate_id;
Maxime Perrotin's avatar
Maxime Perrotin committed
954
955
956
957


actual_parameters
        :      '(' expression (',' expression)* ')'
958
959
        ->     ^(PARAMS expression+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
960
961
962
963
964


task
        :       cif?
                hyperlink?
965
                TASK task_body? end
966
967
        ->      ^(TASK cif? hyperlink? end? task_body?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
968
969
970
971
972
973
974
975
976
977
978


task_body
        :       (assignement_statement (',' assignement_statement)*)
        ->      ^(TASK_BODY assignement_statement+)
                | (informal_text (',' informal_text)*)
        ->      ^(TASK_BODY informal_text+)
                | (forloop (',' forloop)*)
        ->      ^(TASK_BODY forloop+)
        ;

979

Maxime Perrotin's avatar
Maxime Perrotin committed
980
981
// SDL extension - FOR loop in TASKs
forloop
982
        :       FOR variable_id IN (range | variable) ':'
Maxime Perrotin's avatar
Maxime Perrotin committed
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
                transition?
                ENDFOR
        ->      ^(FOR variable_id variable? range? transition?);

range
        :       RANGE
                L_PAREN a=ground_expression
                (COMMA b=ground_expression)? (COMMA step=INT)?
                R_PAREN
        ->      ^(RANGE $a $b? $step?);

assignement_statement
        :       variable ':=' expression
        ->      ^(ASSIGN variable expression);


// Variable: covers eg. toto(5)(4)!titi(3)!tutu!yoyo
variable
For faster browsing, not all history is shown. View entire blame