sdl92.g 37.9 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;
100
        RETURNS;
Maxime Perrotin's avatar
Maxime Perrotin committed
101
        ROUTE;
dbarbera's avatar
dbarbera committed
102
        SAVE;
103
        SELECTOR;
dbarbera's avatar
dbarbera committed
104
105
106
107
108
109
110
        SEQOF;
        SEQUENCE;
        SET;
        SIGNAL;
        SIGNAL_LIST;
        SORT;
        STATE;
111
112
        STATE_AGGREGATION;
        STATE_PARTITION_CONNECTION;
dbarbera's avatar
dbarbera committed
113
114
115
        STATELIST;
        STIMULUS;
        STOP;
Maxime Perrotin's avatar
Maxime Perrotin committed
116
        STOPIF;
dbarbera's avatar
dbarbera committed
117
        STRING;
118
        STRUCT;
119
120
        SYNONYM;
        SYNONYM_LIST;
dbarbera's avatar
dbarbera committed
121
122
123
124
125
126
127
128
129
130
131
132
        SYNTYPE;
        SYSTEM;
        TASK;
        TASK_BODY;
        TERMINATOR;
        TEXT;
        TEXTAREA;
        TEXTAREA_CONTENT;
        THEN;
        TIMER;
        TO;
        TRANSITION;
133
        TYPE_INSTANCE;
dbarbera's avatar
dbarbera committed
134
135
136
137
138
139
        USE;
        VALUE;
        VARIABLE;
        VARIABLES;
        VIA;
        VIAPATH;
Maxime Perrotin's avatar
Maxime Perrotin committed
140
141
142
143
144
145
146
147
148
}


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


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


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

Maxime Perrotin's avatar
Maxime Perrotin committed
169

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

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

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

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


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


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


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


/* 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
230
231
                | process_definition
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
232
233
234
235
236


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


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


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

262

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

271
272
273

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

Maxime Perrotin's avatar
Maxime Perrotin committed
277

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

292
293
294
295
296
297
298
// Procedure result / optional return type
procedure_result
        :       ('->' | RETURNS)
                variable_id?
                sort
        ->      ^(RETURNS variable_id? sort)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
299
300
301
302
303
304

// Procedure formal parameters
fpar
        :       FPAR formal_variable_param
                (',' formal_variable_param)*
                end
305
306
        ->      ^(FPAR formal_variable_param+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
307
308
309


formal_variable_param
310
        :       (INOUT | IN | OUT)?
Maxime Perrotin's avatar
Maxime Perrotin committed
311
                variable_id (',' variable_id)* sort
312
313
        ->      ^(PARAM INOUT? IN? OUT? variable_id+ sort)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
314
315
316
317
318
319
320


// text_area: TODO add operator description in content
text_area
        :       cif
                content?
                cif_end_text
321
322
        ->      ^(TEXTAREA cif content? cif_end_text)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
323
324
325
326
327
328


// Text areas can contain textual procedures, FPAR declarations,
// and variable or timer declarations
content
        :        (procedure
329
330
                 | use_clause
                 | signal_declaration
Maxime Perrotin's avatar
Maxime Perrotin committed
331
332
                 | fpar
                 | timer_declaration
333
334
                 | syntype_definition
                 | newtype_definition
335
336
                 | variable_definition
                 | synonym_definition)*
Maxime Perrotin's avatar
Maxime Perrotin committed
337
338
        ->       ^(TEXTAREA_CONTENT fpar* procedure* variable_definition*
                   syntype_definition* newtype_definition* timer_declaration*
339
340
                   signal_declaration* use_clause* synonym_definition*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
341
342
343
344
345
346


timer_declaration
        :       TIMER timer_id
                (',' timer_id)*
                end
347
348
349
        ->      ^(TIMER timer_id+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
350

351
syntype_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
352
353
354
        :       SYNTYPE syntype_name '=' parent_sort
                (CONSTANTS (range_condition (',' range_condition)* ))?
                ENDSYNTYPE syntype_name? end
355
356
357
        ->      ^(SYNTYPE syntype_name parent_sort range_condition*)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
358
359

syntype_name
360
361
362
        :       sort
        ;

363
364

parent_sort
365
366
367
        :       sort
        ;

368
369

newtype_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
370
371
        :       NEWTYPE type_name (array_definition|structure_definition)?
                ENDNEWTYPE type_name? end
372
373
        ->      ^(NEWTYPE type_name array_definition* structure_definition*)
        ;
374
375
376


type_name
377
378
379
        :       sort
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
380

381
array_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
382
        :       ARRAY '(' sort ',' sort ')'
383
384
385
        ->      ^(ARRAY sort sort)
        ;

386
387

structure_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
388
        :       STRUCT field_list end
389
390
391
        ->      ^(STRUCT field_list)
        ;

392
393

field_list
Maxime Perrotin's avatar
Maxime Perrotin committed
394
        :       field_definition (end field_definition)*
395
396
397
        ->      ^(FIELDS field_definition+)
        ;

398
399

field_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
400
        :       field_name (',' field_name)* sort
401
402
403
        ->      ^(FIELD field_name+ sort)
        ;

404

Maxime Perrotin's avatar
Maxime Perrotin committed
405
406
407
408
variable_definition
        :       DCL variables_of_sort
                (',' variables_of_sort)*
                end
409
410
411
        ->      ^(DCL variables_of_sort+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
412

Maxime Perrotin's avatar
Maxime Perrotin committed
413
synonym_definition
414
415
416
        :       internal_synonym_definition
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
417

418
internal_synonym_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
419
420
        :       SYNONYM synonym_definition_item (',' synonym_definition_item)*
                end
421
422
423
        ->      ^(SYNONYM_LIST synonym_definition_item+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
424

425
synonym_definition_item
Maxime Perrotin's avatar
Maxime Perrotin committed
426
        :       sort sort '=' ground_expression
427
428
429
        ->      ^(SYNONYM sort sort ground_expression)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
430
431
432

variables_of_sort
        :       variable_id (',' variable_id)* sort (':=' ground_expression)?
433
434
        ->      ^(VARIABLES variable_id+ sort ground_expression?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
435
436
437
438


ground_expression
        :       expression
439
440
        ->      ^(GROUND expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
441
442
443
444


number_of_instances
        :       '(' initial_number=INT ',' maximum_number=INT ')'
445
446
        ->      ^(NUMBER_OF_INSTANCES $initial_number $maximum_number)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
447
448
449


processBody
450
451
        :       start? (state | floating_label)*
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
452
453
454
455
456


start
        :       cif?
                hyperlink?
457
                START name=state_entry_point_name? end
Maxime Perrotin's avatar
Maxime Perrotin committed
458
                transition?
459
460
        ->      ^(START cif? hyperlink? $name? end? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
461
462
463
464
465
466
467
468
469


floating_label
        :       cif?
                hyperlink?
                CONNECTION connector_name ':'
                transition?
                cif_end_label?
                ENDCONNECTION SEMI
470
471
        ->      ^(FLOATING_LABEL cif? hyperlink? connector_name transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
472
473
474


state
475
        :       cif?
Maxime Perrotin's avatar
Maxime Perrotin committed
476
477
478
479
                hyperlink?
                STATE statelist e=end
                (state_part)*
                ENDSTATE statename? f=end
480
481
        ->      ^(STATE cif? hyperlink? $e? statelist state_part*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
482
483
484
485


statelist
        :       ((statename)(',' statename)*)
486
        ->      ^(STATELIST statename+)
Maxime Perrotin's avatar
Maxime Perrotin committed
487
                | ASTERISK exception_state?
488
489
        ->      ^(ASTERISK exception_state?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
490
491
492


exception_state
493
        :       '(' statename (',' statename)* ')'
494
495
        ->      statename+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
496
497


498
// 11.11 State Machine and Composite State (SDL2000)
499
composite_state
500
501
502
503
504
505
        :       composite_state_graph
                | state_aggregation
        ;


composite_state_graph
506
507
        :       STATE statename e=end
                SUBSTRUCTURE
508
                connection_points*
509
510
                body=composite_state_body
                ENDSUBSTRUCTURE statename? f=end
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
        ->      ^(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)+
537
                state*
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
        ;


// 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?)
        ;
566
567


568
// 11.11.1 and 11.11.2 Composite State (SDL2000)
569
connection_points
570
571
572
        :       IN state_entry_exit_points end
        ->      ^(IN state_entry_exit_points end?)
                | OUT state_entry_exit_points end
573
574
        ->      ^(OUT state_entry_exit_points end?)
        ;
575
576


577
// 11.11.1 and 11.11.2 Composite State (SDL2000)
578
579
state_entry_exit_points
        :       '(' statename (',' statename)* ')'
580
581
        ->      statename+
        ;
582
583


584
// 11.11.1 Composite State graph content (SDL2000)
585
586
composite_state_body
        :       (text_area | procedure | composite_state)*
587
588
                start* (state | floating_label)*
        ;
589
590


Maxime Perrotin's avatar
Maxime Perrotin committed
591
592
593
594
595
state_part
        :       input_part
                //| priority_input        // Not supported
                | save_part               // Not supported in openGEODE
                | spontaneous_transition
596
                | continuous_signal
597
598
                | connect_part
        ;
599
600
601
602


// connect part is used to connect nested state exit points to a transition
connect_part
Maxime Perrotin's avatar
Maxime Perrotin committed
603
604
605
606
        :       cif?
                hyperlink?
                CONNECT connect_list? end
                transition?
607
608
        ->      ^(CONNECT cif? hyperlink? connect_list? end? transition?)
        ;
609
610
611
612
613


connect_list
        :       state_exit_point_name (',' state_exit_point_name)*
                -> state_exit_point_name+
614
615
                | ASTERISK
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
616
617
618
619
620
621
622
623


spontaneous_transition
        :       cif?
                hyperlink?
                INPUT NONE end
                enabling_condition?
                transition
624
625
        ->      ^(INPUT_NONE cif? hyperlink? transition)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
626
627
628
629


enabling_condition
        :       PROVIDED expression end
630
631
        ->      ^(PROVIDED expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
632
633
634


continuous_signal
635
636
637
638
        :       cif?
                hyperlink?
                PROVIDED expression e=end
                (PRIORITY p=INT end)?
639
640
                transition?
        ->      ^(PROVIDED expression cif? hyperlink? $p? $e? transition?)
641
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
642
643
644
645
646


save_part
        :       SAVE save_list
                end
647
648
        ->      ^(SAVE save_list)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
649
650
651
652


save_list
        :       signal_list
653
654
                | asterisk_save_list
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
655
656
657
658
659
660
661
662


asterisk_save_list
        :       ASTERISK;


signal_list
        :       signal_item (',' signal_item)*
663
664
        ->      ^(SIGNAL_LIST signal_item+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
665
666
667
668
669
670
671
672
673
674
675



// 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
676
/*   Not considered for the moment
Maxime Perrotin's avatar
Maxime Perrotin committed
677
678
     (irrelevant in the scope of the generation of code for a single process)
priority_input
dbarbera's avatar
dbarbera committed
679
        :       PRIORITY INPUT priority_input_list end transition;
Maxime Perrotin's avatar
Maxime Perrotin committed
680
681
682
683
684
685
686
687
688
689
690
691
692
693


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
694
695
                INPUT inputlist end
                enabling_condition?
Maxime Perrotin's avatar
Maxime Perrotin committed
696
697
                transition?
        ->      ^(INPUT cif? hyperlink? end?
698
699
                inputlist enabling_condition? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
700
701
702
703
704
705
706


// asterisk means: all signals not excplicitely specified
// (semantic is different from asterisk state)
inputlist
        :       ASTERISK
                | (stimulus (',' stimulus)*)
707
708
        ->      ^(INPUTLIST stimulus+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
709
710
711


stimulus
712
713
        :       stimulus_id input_params?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
714
715
716
717


input_params
        :       L_PAREN variable_id (',' variable_id)* R_PAREN
718
719
        ->      ^(PARAMS variable_id+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
720
721
722
723
724
725


transition
        :       action+ label? terminator_statement?
        ->      ^(TRANSITION action+ label? terminator_statement?)
                | terminator_statement
726
727
        ->      ^(TRANSITION terminator_statement)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
728
729
730
731
732
733
734
735
736
737
738
739
740


action
        :       label?
                (task
                | task_body
                | output
                | create_request
                | decision
                | transition_option
                | set_timer
                | reset_timer
                | export     // Not supported in OpenGEODE
741
742
743
                | procedure_call)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
744
745
746
747
748

export
        :       EXPORT
                L_PAREN variable_id (COMMA variable_id)* R_PAREN
                end
749
750
751
        ->      ^(EXPORT variable_id+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
752
753
754

/*
remote_procedure_call
dbarbera's avatar
dbarbera committed
755
        :       CALL remote_procedure_call_body;
Maxime Perrotin's avatar
Maxime Perrotin committed
756
757

remote_procedure_call_body
dbarbera's avatar
dbarbera committed
758
        :       remote_procedure_id actual_parameters? (TO destination)?;
Maxime Perrotin's avatar
Maxime Perrotin committed
759
760
761
762
763
*/
procedure_call
        :       cif?
                hyperlink?
                CALL procedure_call_body end
764
765
        ->      ^(PROCEDURE_CALL cif? hyperlink? end? procedure_call_body)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
766
767
768


procedure_call_body
dbarbera's avatar
dbarbera committed
769
        :       procedure_id actual_parameters?
770
771
        ->      ^(OUTPUT_BODY procedure_id actual_parameters?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
772
773
774
775
776


set_timer
        :       SET set_statement (COMMA set_statement)*
                end
777
778
        ->      set_statement+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
779
780
781
782


set_statement
        :       L_PAREN (expression COMMA)? timer_id R_PAREN
783
784
        ->      ^(SET expression? timer_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
785
786
787
788
789
790
        // ('('expression_list')')? ')'; (removed because of non-LL(*) problem)


reset_timer
        :       RESET reset_statement (',' reset_statement)*
                end
791
792
        ->      reset_statement+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
793
794
795
796


reset_statement
        :       timer_id ('(' expression_list ')')?
797
798
        ->      ^(RESET timer_id expression_list?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
799
800
801
802
803
804
805


transition_option
        :       ALTERNATIVE alternative_question e=end
                answer_part
                alternative_part
                ENDALTERNATIVE f=end
806
807
        ->      ^(ALTERNATIVE answer_part alternative_part)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
808
809
810
811
812
813


alternative_part
        :       (answer_part+ else_part?)
        ->      answer_part+ else_part?
                | else_part
814
815
        ->      else_part
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
816
817
818
819


alternative_question
        :       expression
820
821
                | informal_text
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
822
823
824
825
826
827
828
829
830
831


decision
        :       cif?
                hyperlink?
                DECISION question e=end
                answer_part?
                alternative_part?
                ENDDECISION f=end
        ->      ^(DECISION cif? hyperlink? $e? question
832
833
                answer_part? alternative_part?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
834
835
836
837
838
839


answer_part
        :       cif?
                hyperlink?
                L_PAREN answer R_PAREN ':' transition?
840
841
        ->      ^(ANSWER cif? hyperlink? answer transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
842
843
844
845


answer
        :       range_condition
846
847
                | informal_text
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
848
849
850
851
852
853


else_part
        :       cif?
                hyperlink?
                ELSE ':' transition?
854
855
        ->      ^(ELSE cif? hyperlink? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
856
857
858


question
859
860
        :       informal_text
                | expression
Maxime Perrotin's avatar
Maxime Perrotin committed
861
862
        ->      ^(QUESTION expression)
                | ANY
863
864
        ->      ^(ANY)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
865
866
867


range_condition
868
869
        :       (closed_range | open_range)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
870
871
872
873
                //(',' (closed_range|open_range))*;


closed_range
874
        :       a=expression ':' b=expression
875
876
        ->      ^(CLOSED_RANGE $a $b)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
877
878
879
880
881
882


open_range
        :       constant
        ->      constant
                | ( (EQ|NEQ|GT|LT|LE|GE) constant)
883
884
        ->      ^(OPEN_RANGE EQ? NEQ? GT? LT? LE? GE? constant)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
885
886
887
888


constant
        :       expression
889
890
        ->      ^(CONSTANT expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
891
892
893


create_request
dbarbera's avatar
dbarbera committed
894
        :       CREATE
Maxime Perrotin's avatar
Maxime Perrotin committed
895
896
897
                createbody
                actual_parameters?
                end
898
899
        ->      ^(CREATE createbody actual_parameters?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
900
901
902
903


createbody
        :       process_id
904
905
                | THIS
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
906
907
908
909
910
911


output
        :       cif?
                hyperlink?
                OUTPUT outputbody end
912
913
        ->      ^(OUTPUT cif? hyperlink? end? outputbody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
914
915
916


outputbody
917
        :       outputstmt (',' outputstmt)* to_part?
918
919
        ->      ^(OUTPUT_BODY outputstmt+ to_part?)
        ;
920
921
 //               via_part?
 //     -> (signal_id actual_parameters?)+ to_part? via_part?;
Maxime Perrotin's avatar
Maxime Perrotin committed
922
923
924


outputstmt
dbarbera's avatar
dbarbera committed
925
        :       signal_id
926
927
                actual_parameters?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
928

929
to_part
Maxime Perrotin's avatar
Maxime Perrotin committed
930
        :       (TO destination)
931
932
        ->      ^(TO destination)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
933

934
via_part
dbarbera's avatar
dbarbera committed
935
        :       VIA viabody
936
937
        ->      ^(VIA viabody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
938
939
940
941


// ambiguous in SDL92, added OR between ALL and via_path
viabody
dbarbera's avatar
dbarbera committed
942
        :       ALL
Maxime Perrotin's avatar
Maxime Perrotin committed
943
944
        ->      ^(ALL)
                | via_path
945
946
        ->      ^(VIAPATH via_path)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
947
948
949
950
951


destination
        :       pid_expression
                | process_id
952
953
                | THIS
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
954
955
956
957


via_path
        :       via_path_element (',' via_path_element)*
958
959
        ->      via_path_element+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
960
961
962


via_path_element
963
964
        :       ID
        ; // signal_route_id | channel_id | gate_id;
Maxime Perrotin's avatar
Maxime Perrotin committed
965
966
967
968


actual_parameters
        :      '(' expression (',' expression)* ')'
969
970
        ->     ^(PARAMS expression+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
971
972
973
974
975


task
        :       cif?
                hyperlink?
976
                TASK task_body? end
977
978
        ->      ^(TASK cif? hyperlink? end? task_body?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
979
980
981
982
983
984
985
986
987
988
989


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

990

Maxime Perrotin's avatar
Maxime Perrotin committed
991
992
// SDL extension - FOR loop in TASKs
forloop
993
        :       FOR variable_id IN (range | variable) ':'
Maxime Perrotin's avatar
Maxime Perrotin committed
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
                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
1012
        :       postfix_expression
dbarbera's avatar
dbarbera committed
1013
1014
        |       ID                     ->  ^(VARIABLE ID);

Maxime Perrotin's avatar
Maxime Perrotin committed
1015
1016
1017
1018

field_selection
        :       (('!'|'.') field_name);

1019

dbarbera's avatar
dbarbera committed
1020
expression
1021
1022
        :       binary_expression;

1023

1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
binary_expression
        :       binary_expression_0 ( IMPLIES^ binary_expression_0)*;
binary_expression_0
        :       binary_expression_1 (( (OR^ ELSE?) | XOR^ ) binary_expression_1)*;
binary_expression_1
        :       binary_expression_2 ( AND^ THEN? binary_expression_2)*;
binary_expression_2
        :       binary_expression_3 (( EQ^ | NEQ^ | GT^ | GE^ | LT^ | LE^ | IN^ ) binary_expression_3)*;
binary_expression_3
        :       binary_expression_4 (( PLUS^ | DASH^ | APPEND^ ) binary_expression_4)*;
binary_expression_4
        :       unary_expression (( ASTERISK^ | DIV^ | MOD^ | REM^ ) unary_expression)*;

1037

1038
unary_expression
1039
1040
        :       postfix_expression
        |       primary_expression
1041
        |       NOT^ unary_expression
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
        |       DASH unary_expression -> ^(NEG unary_expression)
        ;


postfix_expression
        :       (ID -> ^(PRIMARY ^(VARIABLE ID)))
                (   '(' params=expression_list ')' -> ^(CALL $postfix_expression ^(PARAMS $params))
                |   '!' field_name  -> ^(SELECTOR $postfix_expression field_name)
                )+
        ;

1053
1054
1055

primary_expression
        :       primary                       -> ^(PRIMARY primary)
1056
        |       '(' expression ')'            -> ^(PAREN expression)
1057
        |       conditional_expression
1058
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1059

1060

1061
primary
1062
        :       TRUE^
Maxime Perrotin's avatar
Maxime Perrotin committed
1063
        |       FALSE^
1064
        |       STRING
Maxime Perrotin's avatar
Maxime Perrotin committed
1065
1066
1067
        |       NULL^
        |       PLUS_INFINITY^
        |       MINUS_INFINITY^
1068
1069
        |       INT^
        |       FLOAT^
1070
        |       ID ':' expression           -> ^(CHOICE ID expression)
dbarbera's avatar
dbarbera committed
1071
        |       ID                          -> ^(VARIABLE ID)
1072
1073
        |       '{' '}'                     -> ^(EMPTYSTR)
        |       '{'
Maxime Perrotin's avatar
Maxime Perrotin committed
1074
1075
                MANTISSA mant=INT COMMA
                BASE bas=INT COMMA
dbarbera's avatar
dbarbera committed
1076
                EXPONENT exp=INT
1077
1078
                '}'                         -> ^(FLOAT2 $mant $bas $exp)
        |       '{'
1079
1080
                named_value (COMMA named_value)*
                '}'                         -> ^(SEQUENCE named_value+)
1081
        |       '{'
1082
1083
                primary (COMMA primary)*
                '}'                         -> ^(SEQOF primary+)
1084
        |       STATE^
Maxime Perrotin's avatar
Maxime Perrotin committed
1085
1086
        ;

1087

Maxime Perrotin's avatar
Maxime Perrotin committed
1088
informal_text
1089
        :        STRING
1090
1091
        ->       ^(INFORMAL_TEXT STRING)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1092
1093
1094


// { a 5 } (SEQUENCE field value)
1095
named_value
1096
1097
        :       ID expression
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1098
1099
1100
1101
1102
1103


primary_params
        :      '(' expression_list ')'
        ->     ^(PARAMS expression_list)
               | '!' literal_id
1104
1105
        ->     ^(FIELD_NAME literal_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1106
1107


dbarbera's avatar
dbarbera committed
1108
/* All cases are covered by the ground primary
Maxime Perrotin's avatar
Maxime Perrotin committed
1109
1110
1111
1112
1113
   above (Except structure primary, but we favour ASN.1 notation)
extended_primary
        :       synonym         |
                indexed_primary |
                field_primary   |
1114
1115
                structure_primary
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1116
1117
1118
1119
*/


indexed_primary
1120
1121
        :       primary '(' expression_list ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1122
1123
1124


field_primary
1125
1126
        :       primary field_selection
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1127
1128
1129


structure_primary
1130
1131
        :       '(.' expression_list '.)'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1132
1133
1134
1135
1136
// Removed "qualifier" from the standard
// (to be put later, but never used in practice)


active_expression
1137
1138
        :       active_primary
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1139
1140
1141
1142
1143
1144
1145
1146


active_primary
        :       variable_access
                | operator_application
                | conditional_expression
                | imperative_operator
                | '(' active_expression ')'
1147
1148
                | 'ERROR'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1149
1150
1151
1152
1153
1154
1155
1156
1157
   // active_extended_primary removed because not defined in the standard


imperative_operator
        :       now_expression
                | import_expression
                | pid_expression
                | view_expression
                | timer_active_expression
1158
1159
                | anyvalue_expression
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1160
1161
1162


timer_active_expression
1163
1164
        :       ACTIVE '(' timer_id ('(' expression_list ')')? ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1165
1166
1167


anyvalue_expression
1168
1169
        :       ANY '(' sort ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1170
1171
1172


sort    :       sort_id
1173
1174
1175
        ->      ^(SORT sort_id)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
1176

1177
1178
type_inst
        :       type_id
1179
1180
        ->      ^(TYPE_INSTANCE type_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1181

1182
1183
1184

syntype :       syntype_id
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1185
1186
1187


import_expression
1188
1189
        :       IMPORT '(' remote_variable_id (',' destination)? ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1190
1191
1192


view_expression
1193
1194
        :       VIEW '(' view_id (',' pid_expression)? ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1195
1196
1197


variable_access
1198
1199
        :       variable_id
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1200
1201
1202


operator_application
1203
1204
        :       operator_id '('active_expression_list ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1205
1206


dbarbera's avatar
dbarbera committed
1207
active_expression_list
1208
1209
1210
        :       active_expression (',' expression_list)?
        ;
/* |
Maxime Perrotin's avatar
Maxime Perrotin committed
1211
1212
1213
                ground_expression ',' active_expression_list;*/   // Will not work (recursion)


1214
//synonym :       ID; // synonym_id | external_synonym;
Maxime Perrotin's avatar
Maxime Perrotin committed
1215
1216

external_synonym
1217
1218
        :       external_synonym_id
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1219
1220


1221
conditional_expression
Maxime Perrotin's avatar
Maxime Perrotin committed
1222
1223
1224
        :       IF ifexpr=expression
                THEN thenexpr=expression
                ELSE elseexpr=expression FI
1225
1226
        ->      ^(CONDITIONAL $ifexpr $thenexpr $elseexpr)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1227
1228


dbarbera's avatar
dbarbera committed
1229
expression_list
Maxime Perrotin's avatar
Maxime Perrotin committed
1230
        :       expression (',' expression)*
1231
1232
        ->      expression+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1233
1234
1235
1236
1237
1238
1239
1240


terminator_statement
        :       label?
                cif?
                hyperlink?
                terminator
                end
1241
1242
        ->      ^(TERMINATOR label? cif? hyperlink? end? terminator)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1243
1244
1245

label
        :       cif? connector_name ':'
1246
1247
        ->      ^(LABEL cif? connector_name)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1248
1249
1250


terminator
1251
1252
        :       nextstate | join | stop | return_stmt
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1253
1254
1255
1256


join
        :        JOIN connector_name
1257
1258
        ->       ^(JOIN connector_name)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1259
1260


1261
1262
stop    :       STOP
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1263
1264
1265
1266


return_stmt
        :       RETURN expression?
1267
1268
        ->      ^(RETURN expression?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1269
1270
1271
1272


nextstate
        :       NEXTSTATE nextstatebody
1273
1274
        ->      ^(NEXTSTATE nextstatebody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1275
1276
1277


nextstatebody
1278
        :       statename via?
1279
1280
                | dash_nextstate
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1281
1282


1283
via     :       VIA state_entry_point_name
1284
1285
        ->      ^(VIA state_entry_point_name)
        ;
1286
1287


Maxime Perrotin's avatar
Maxime Perrotin committed
1288
end
1289
        :   (cif? hyperlink? COMMENT STRING)? SEMI+
1290
1291
        -> ^(COMMENT cif? hyperlink? STRING)?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1292
1293
1294
1295
1296
1297


cif
        :       cif_decl symbolname
                L_PAREN x=INT COMMA y=INT R_PAREN
                COMMA
dbarbera's avatar
dbarbera committed
1298
                L_PAREN width=INT COMMA height=INT R_PAREN
Maxime Perrotin's avatar
Maxime Perrotin committed
1299
                cif_end
1300
1301
        ->      ^(CIF $x $y $width $height)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1302
1303
1304


hyperlink
1305
        :       cif_decl KEEP SPECIFIC GEODE HYPERLINK STRING
Maxime Perrotin's avatar
Maxime Perrotin committed
1306
                cif_end
1307
1308
        ->      ^(HYPERLINK STRING)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1309
1310
1311

/* OpenGEODE specific: SDL does not allow specifying the name
   of signal parameters, but it is needed to generate function signatures
dbarbera's avatar
dbarbera committed
1312
   when generating code (in particular in Ada, where the name in the
Maxime Perrotin's avatar
Maxime Perrotin committed
1313
1314
1315
1316
1317
1318
   body must comply with the one of the source
   Extension is using CIF comment so it is invisible to other SDL parsers
   (This is valid SDL code - see ITU-T Z106)
*/
paramnames
        :       cif_decl KEEP SPECIFIC GEODE PARAMNAMES field_name+ cif_end
1319
1320
        ->      ^(PARAMNAMES field_name+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1321
1322
1323
1324
1325
1326
1327


/* OpenGEODE specific: Allow specifying the name of an ASN.1 file
   as a CIF extension linked to a USE clause.
   CIF Extensions are valid SDL constructs (ITU-T Z106)
*/
use_asn1