sdl92.g 39.4 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
*/

grammar sdl92;

options {
Maxime Perrotin's avatar
Maxime Perrotin committed
15
    language=Python3;
Maxime Perrotin's avatar
Maxime Perrotin committed
16
17
18
19
20
21
22
    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
// There should be at least one route in the signal route
// However it is now optional (* and not +) to appease the
// syntax checker in the tool.
Maxime Perrotin's avatar
Maxime Perrotin committed
236
signalroute
237
238
239
        :       SIGNALROUTE route_id end?
                route*
        ->      ^(SIGNALROUTE route_id route*)
240
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
241
242
243
244


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


249
250
251
252
253
254
255
256
/* process_definition
   Covers various cases such as:
   PROCESS name REFERENCED;
   PROCESS name;
      <body>
   ENDPROCESS <name>;
   Etc. The grammar is tolerant, semantic checks are done in the code.
*/
Maxime Perrotin's avatar
Maxime Perrotin committed
257
process_definition
258
        :       cif?
Maxime Perrotin's avatar
Maxime Perrotin committed
259
                PROCESS t=TYPE? process_id
260
                number_of_instances? (':' type_inst)? REFERENCED? a=end
261
                pfpar?
262
                (text_area | procedure | (composite_state_preamble) =>composite_state)*
Maxime Perrotin's avatar
Maxime Perrotin committed
263
                processBody? ENDPROCESS? TYPE? process_id?
264
265
                end?
        ->      ^(PROCESS cif? process_id number_of_instances? type_inst?
Maxime Perrotin's avatar
Maxime Perrotin committed
266
                $t? REFERENCED? $a? pfpar? text_area* procedure*
267
                composite_state* processBody?)
268
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
269

270

271
272
273
274
// Process formal parameters
pfpar
        :       FPAR parameters_of_sort
                (',' parameters_of_sort)*
275
                end?
276
277
278
        ->      ^(PFPAR parameters_of_sort+)
        ;

279
280
281

parameters_of_sort
        :       variable_id (',' variable_id)* sort
282
283
        ->      ^(PARAM variable_id+ sort)
        ;
284

Maxime Perrotin's avatar
Maxime Perrotin committed
285

286
// procedure
Maxime Perrotin's avatar
Maxime Perrotin committed
287
288
procedure
        :       cif?
289
                PROCEDURE procedure_id (e1=end | SEMI)
Maxime Perrotin's avatar
Maxime Perrotin committed
290
                fpar?
291
                res=procedure_result?
Maxime Perrotin's avatar
Maxime Perrotin committed
292
293
                (text_area | procedure)*
                ((processBody? ENDPROCEDURE procedure_id?) | EXTERNAL)
294
                e2=end
295
        ->      ^(PROCEDURE cif? procedure_id $e1? $e2? fpar? $res?
296
297
                text_area* procedure* processBody? EXTERNAL?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
298

299
300
301
302
// Procedure result / optional return type
procedure_result
        :       ('->' | RETURNS)
                variable_id?
303
                sort end?
304
305
        ->      ^(RETURNS variable_id? sort)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
306
307
308
309
310

// Procedure formal parameters
fpar
        :       FPAR formal_variable_param
                (',' formal_variable_param)*
311
                end
312
313
        ->      ^(FPAR formal_variable_param+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
314
315
316


formal_variable_param
317
        :       (INOUT | IN | OUT)?
Maxime Perrotin's avatar
Maxime Perrotin committed
318
                variable_id (',' variable_id)* sort
319
320
        ->      ^(PARAM INOUT? IN? OUT? variable_id+ sort)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
321
322
323
324
325
326
327


// text_area: TODO add operator description in content
text_area
        :       cif
                content?
                cif_end_text
328
329
        ->      ^(TEXTAREA cif content? cif_end_text)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
330
331
332
333
334
335


// Text areas can contain textual procedures, FPAR declarations,
// and variable or timer declarations
content
        :        (procedure
336
337
                 | use_clause
                 | signal_declaration
Maxime Perrotin's avatar
Maxime Perrotin committed
338
                 | fpar
339
                 | res=procedure_result
Maxime Perrotin's avatar
Maxime Perrotin committed
340
                 | timer_declaration
341
342
                 | syntype_definition
                 | newtype_definition
343
344
                 | variable_definition
                 | synonym_definition)*
345
        ->       ^(TEXTAREA_CONTENT fpar* $res? procedure* variable_definition*
Maxime Perrotin's avatar
Maxime Perrotin committed
346
                   syntype_definition* newtype_definition* timer_declaration*
347
348
                   signal_declaration* use_clause* synonym_definition*)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
349
350
351
352
353
354


timer_declaration
        :       TIMER timer_id
                (',' timer_id)*
                end
355
356
357
        ->      ^(TIMER timer_id+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
358

359
syntype_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
360
361
362
        :       SYNTYPE syntype_name '=' parent_sort
                (CONSTANTS (range_condition (',' range_condition)* ))?
                ENDSYNTYPE syntype_name? end
363
364
365
        ->      ^(SYNTYPE syntype_name parent_sort range_condition*)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
366
367

syntype_name
368
369
370
        :       sort
        ;

371
372

parent_sort
373
374
375
        :       sort
        ;

376
377

newtype_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
378
379
        :       NEWTYPE type_name (array_definition|structure_definition)?
                ENDNEWTYPE type_name? end
380
381
        ->      ^(NEWTYPE type_name array_definition* structure_definition*)
        ;
382
383
384


type_name
385
386
387
        :       sort
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
388

389
array_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
390
        :       ARRAY '(' sort ',' sort ')'
391
392
393
        ->      ^(ARRAY sort sort)
        ;

394
395

structure_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
396
        :       STRUCT field_list end
397
398
399
        ->      ^(STRUCT field_list)
        ;

400
401

field_list
Maxime Perrotin's avatar
Maxime Perrotin committed
402
        :       field_definition (end field_definition)*
403
404
405
        ->      ^(FIELDS field_definition+)
        ;

406
407

field_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
408
        :       field_name (',' field_name)* sort
409
410
411
        ->      ^(FIELD field_name+ sort)
        ;

412

Maxime Perrotin's avatar
Maxime Perrotin committed
413
414
415
416
variable_definition
        :       DCL variables_of_sort
                (',' variables_of_sort)*
                end
417
418
419
        ->      ^(DCL variables_of_sort+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
420

Maxime Perrotin's avatar
Maxime Perrotin committed
421
synonym_definition
422
423
424
        :       internal_synonym_definition
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
425

426
internal_synonym_definition
Maxime Perrotin's avatar
Maxime Perrotin committed
427
428
        :       SYNONYM synonym_definition_item (',' synonym_definition_item)*
                end
429
430
431
        ->      ^(SYNONYM_LIST synonym_definition_item+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
432

433
synonym_definition_item
Maxime Perrotin's avatar
Maxime Perrotin committed
434
        :       sort sort '=' ground_expression
435
436
437
        ->      ^(SYNONYM sort sort ground_expression)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
438
439
440

variables_of_sort
        :       variable_id (',' variable_id)* sort (':=' ground_expression)?
441
442
        ->      ^(VARIABLES variable_id+ sort ground_expression?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
443
444
445
446


ground_expression
        :       expression
447
448
        ->      ^(GROUND expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
449
450
451
452


number_of_instances
        :       '(' initial_number=INT ',' maximum_number=INT ')'
453
454
        ->      ^(NUMBER_OF_INSTANCES $initial_number $maximum_number)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
455
456
457


processBody
458
459
        :       start? (state | floating_label)*
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
460
461
462
463
464


start
        :       cif?
                hyperlink?
465
                START name=state_entry_point_name? end
Maxime Perrotin's avatar
Maxime Perrotin committed
466
                transition?
467
468
        ->      ^(START cif? hyperlink? $name? end? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
469
470
471
472
473
474
475
476
477


floating_label
        :       cif?
                hyperlink?
                CONNECTION connector_name ':'
                transition?
                cif_end_label?
                ENDCONNECTION SEMI
478
479
        ->      ^(FLOATING_LABEL cif? hyperlink? connector_name transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
480

481
// state is either a full state definition, or a declaration of an instance
Maxime Perrotin's avatar
Maxime Perrotin committed
482
state
483
484
485
486
487
        : state_definition
          | state_instance
        ;

state_definition
488
        :       cif?
Maxime Perrotin's avatar
Maxime Perrotin committed
489
                hyperlink?
490
                STATE statelist (e=end | SEMI) // "via" part may be in NEXTSTATE
Maxime Perrotin's avatar
Maxime Perrotin committed
491
492
                (state_part)*
                ENDSTATE statename? f=end
493
        ->      ^(STATE cif? hyperlink? $e? statelist state_part*)
494
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
495
496


497
498
499
500
501
502
503
504
505
state_instance
        :       cif?
                hyperlink?
                STATE statename ':' type_inst e=end
                ENDSTATE statename? f=end
        ->      ^(STATE cif? hyperlink? $e? statename type_inst)
        ;


Maxime Perrotin's avatar
Maxime Perrotin committed
506
507
statelist
        :       ((statename)(',' statename)*)
508
        ->      ^(STATELIST statename+)
Maxime Perrotin's avatar
Maxime Perrotin committed
509
                | ASTERISK exception_state?
510
511
        ->      ^(ASTERISK exception_state?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
512
513
514


exception_state
515
        :       '(' statename (',' statename)* ')'
516
517
        ->      statename+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
518
519


520
// 11.11 State Machine and Composite State (SDL2000)
521
composite_state
522
523
524
525
        :       composite_state_graph
                | state_aggregation
        ;

526
527
528
529
530
// used for syntactic predicate
composite_state_preamble
        :       STATE AGGREGATION? statename end
                SUBSTRUCTURE
        ;
531
532

composite_state_graph
533
534
        :       STATE statename e=end
                SUBSTRUCTURE
535
                connection_points*
536
537
                body=composite_state_body
                ENDSUBSTRUCTURE statename? f=end
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
        ->      ^(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
563
        :       (state_partitioning | state_partition_connection)*
564
                state*
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
        ;


// 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?)
        ;
593
594


595
// 11.11.1 and 11.11.2 Composite State (SDL2000)
596
connection_points
597
598
599
        :       IN state_entry_exit_points end
        ->      ^(IN state_entry_exit_points end?)
                | OUT state_entry_exit_points end
600
601
        ->      ^(OUT state_entry_exit_points end?)
        ;
602
603


604
// 11.11.1 and 11.11.2 Composite State (SDL2000)
605
606
state_entry_exit_points
        :       '(' statename (',' statename)* ')'
607
608
        ->      statename+
        ;
609
610


611
// 11.11.1 Composite State graph content (SDL2000)
612
613
// Use a syntactic predicate to disambiguate the parsing of the composite
// state vs a normal state, in the case of a syntax error in the composite.
614
composite_state_body
615
616
617
618
        :  (text_area
            | procedure
            | (composite_state_preamble) =>composite_state)*
           start* (state | floating_label)*
619
           EOF?
620
        ;
621
622


Maxime Perrotin's avatar
Maxime Perrotin committed
623
624
625
626
627
state_part
        :       input_part
                //| priority_input        // Not supported
                | save_part               // Not supported in openGEODE
                | spontaneous_transition
628
                | continuous_signal
629
630
                | connect_part
        ;
631
632
633
634


// connect part is used to connect nested state exit points to a transition
connect_part
Maxime Perrotin's avatar
Maxime Perrotin committed
635
636
637
638
        :       cif?
                hyperlink?
                CONNECT connect_list? end
                transition?
639
640
        ->      ^(CONNECT cif? hyperlink? connect_list? end? transition?)
        ;
641
642
643
644
645


connect_list
        :       state_exit_point_name (',' state_exit_point_name)*
                -> state_exit_point_name+
646
647
                | ASTERISK
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
648
649
650
651
652
653
654
655


spontaneous_transition
        :       cif?
                hyperlink?
                INPUT NONE end
                enabling_condition?
                transition
656
657
        ->      ^(INPUT_NONE cif? hyperlink? transition)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
658
659
660
661


enabling_condition
        :       PROVIDED expression end
662
663
        ->      ^(PROVIDED expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
664
665
666


continuous_signal
667
668
669
670
        :       cif?
                hyperlink?
                PROVIDED expression e=end
                (PRIORITY p=INT end)?
671
672
                transition?
        ->      ^(PROVIDED expression cif? hyperlink? $p? $e? transition?)
673
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
674
675
676
677
678


save_part
        :       SAVE save_list
                end
679
680
        ->      ^(SAVE save_list)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
681
682
683
684


save_list
        :       signal_list
685
686
                | asterisk_save_list
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
687
688
689
690
691
692
693
694


asterisk_save_list
        :       ASTERISK;


signal_list
        :       signal_item (',' signal_item)*
695
696
        ->      ^(SIGNAL_LIST signal_item+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
697
698
699
700
701
702
703
704
705
706
707



// 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
708
/*   Not considered for the moment
Maxime Perrotin's avatar
Maxime Perrotin committed
709
710
     (irrelevant in the scope of the generation of code for a single process)
priority_input
dbarbera's avatar
dbarbera committed
711
        :       PRIORITY INPUT priority_input_list end transition;
Maxime Perrotin's avatar
Maxime Perrotin committed
712
713
714
715
716
717
718
719
720
721
722
723
724
725


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
726
727
                INPUT inputlist end
                enabling_condition?
Maxime Perrotin's avatar
Maxime Perrotin committed
728
729
                transition?
        ->      ^(INPUT cif? hyperlink? end?
730
731
                inputlist enabling_condition? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
732
733
734
735
736
737
738


// asterisk means: all signals not excplicitely specified
// (semantic is different from asterisk state)
inputlist
        :       ASTERISK
                | (stimulus (',' stimulus)*)
739
740
        ->      ^(INPUTLIST stimulus+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
741
742
743


stimulus
744
745
        :       stimulus_id input_params?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
746
747
748
749


input_params
        :       L_PAREN variable_id (',' variable_id)* R_PAREN
750
751
        ->      ^(PARAMS variable_id+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
752
753
754
755
756
757


transition
        :       action+ label? terminator_statement?
        ->      ^(TRANSITION action+ label? terminator_statement?)
                | terminator_statement
758
759
        ->      ^(TRANSITION terminator_statement)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
760
761
762
763
764
765
766
767
768
769
770
771
772


action
        :       label?
                (task
                | task_body
                | output
                | create_request
                | decision
                | transition_option
                | set_timer
                | reset_timer
                | export     // Not supported in OpenGEODE
773
774
775
                | procedure_call)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
776
777
778
779
780

export
        :       EXPORT
                L_PAREN variable_id (COMMA variable_id)* R_PAREN
                end
781
782
783
        ->      ^(EXPORT variable_id+)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
784
785
786

/*
remote_procedure_call
dbarbera's avatar
dbarbera committed
787
        :       CALL remote_procedure_call_body;
Maxime Perrotin's avatar
Maxime Perrotin committed
788
789

remote_procedure_call_body
dbarbera's avatar
dbarbera committed
790
        :       remote_procedure_id actual_parameters? (TO destination)?;
Maxime Perrotin's avatar
Maxime Perrotin committed
791
792
793
794
795
*/
procedure_call
        :       cif?
                hyperlink?
                CALL procedure_call_body end
796
797
        ->      ^(PROCEDURE_CALL cif? hyperlink? end? procedure_call_body)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
798
799
800


procedure_call_body
dbarbera's avatar
dbarbera committed
801
        :       procedure_id actual_parameters?
802
803
        ->      ^(OUTPUT_BODY procedure_id actual_parameters?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
804
805
806
807
808


set_timer
        :       SET set_statement (COMMA set_statement)*
                end
809
810
        ->      set_statement+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
811
812
813
814


set_statement
        :       L_PAREN (expression COMMA)? timer_id R_PAREN
815
816
        ->      ^(SET expression? timer_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
817
818
819
820
821
822
        // ('('expression_list')')? ')'; (removed because of non-LL(*) problem)


reset_timer
        :       RESET reset_statement (',' reset_statement)*
                end
823
824
        ->      reset_statement+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
825
826
827
828


reset_statement
        :       timer_id ('(' expression_list ')')?
829
830
        ->      ^(RESET timer_id expression_list?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
831
832
833
834
835
836
837


transition_option
        :       ALTERNATIVE alternative_question e=end
                answer_part
                alternative_part
                ENDALTERNATIVE f=end
838
839
        ->      ^(ALTERNATIVE answer_part alternative_part)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
840
841
842
843
844
845


alternative_part
        :       (answer_part+ else_part?)
        ->      answer_part+ else_part?
                | else_part
846
847
        ->      else_part
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
848
849
850
851


alternative_question
        :       expression
852
853
                | informal_text
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
854
855
856
857
858
859
860
861
862
863


decision
        :       cif?
                hyperlink?
                DECISION question e=end
                answer_part?
                alternative_part?
                ENDDECISION f=end
        ->      ^(DECISION cif? hyperlink? $e? question
864
865
                answer_part? alternative_part?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
866
867
868
869
870
871


answer_part
        :       cif?
                hyperlink?
                L_PAREN answer R_PAREN ':' transition?
872
873
        ->      ^(ANSWER cif? hyperlink? answer transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
874
875
876
877


answer
        :       range_condition
878
879
                | informal_text
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
880
881
882
883
884
885


else_part
        :       cif?
                hyperlink?
                ELSE ':' transition?
886
887
        ->      ^(ELSE cif? hyperlink? transition?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
888
889
890


question
891
892
        :       informal_text
                | expression
Maxime Perrotin's avatar
Maxime Perrotin committed
893
894
        ->      ^(QUESTION expression)
                | ANY
895
896
        ->      ^(ANY)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
897
898
899


range_condition
900
901
        :       (closed_range | open_range)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
902
903
904
905
                //(',' (closed_range|open_range))*;


closed_range
906
        :       a=expression ':' b=expression
907
908
        ->      ^(CLOSED_RANGE $a $b)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
909
910
911
912
913
914


open_range
        :       constant
        ->      constant
                | ( (EQ|NEQ|GT|LT|LE|GE) constant)
915
916
        ->      ^(OPEN_RANGE EQ? NEQ? GT? LT? LE? GE? constant)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
917
918
919
920


constant
        :       expression
921
922
        ->      ^(CONSTANT expression)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
923
924
925


create_request
dbarbera's avatar
dbarbera committed
926
        :       CREATE
Maxime Perrotin's avatar
Maxime Perrotin committed
927
928
929
                createbody
                actual_parameters?
                end
930
931
        ->      ^(CREATE createbody actual_parameters?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
932
933
934
935


createbody
        :       process_id
936
937
                | THIS
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
938
939
940
941
942
943


output
        :       cif?
                hyperlink?
                OUTPUT outputbody end
944
945
        ->      ^(OUTPUT cif? hyperlink? end? outputbody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
946
947
948


outputbody
949
        :       outputstmt (',' outputstmt)* to_part?
950
951
        ->      ^(OUTPUT_BODY outputstmt+ to_part?)
        ;
952
953
 //               via_part?
 //     -> (signal_id actual_parameters?)+ to_part? via_part?;
Maxime Perrotin's avatar
Maxime Perrotin committed
954
955
956


outputstmt
dbarbera's avatar
dbarbera committed
957
        :       signal_id
958
959
                actual_parameters?
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
960

961
to_part
Maxime Perrotin's avatar
Maxime Perrotin committed
962
        :       (TO destination)
963
964
        ->      ^(TO destination)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
965

966
via_part
dbarbera's avatar
dbarbera committed
967
        :       VIA viabody
968
969
        ->      ^(VIA viabody)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
970
971
972
973


// ambiguous in SDL92, added OR between ALL and via_path
viabody
dbarbera's avatar
dbarbera committed
974
        :       ALL
Maxime Perrotin's avatar
Maxime Perrotin committed
975
976
        ->      ^(ALL)
                | via_path
977
978
        ->      ^(VIAPATH via_path)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
979
980
981
982
983


destination
        :       pid_expression
                | process_id
984
985
                | THIS
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
986
987
988
989


via_path
        :       via_path_element (',' via_path_element)*
990
991
        ->      via_path_element+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
992
993
994


via_path_element
995
996
        :       ID
        ; // signal_route_id | channel_id | gate_id;
Maxime Perrotin's avatar
Maxime Perrotin committed
997
998
999
1000


actual_parameters
        :      '(' expression (',' expression)* ')'
1001
1002
        ->     ^(PARAMS expression+)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1003
1004
1005
1006
1007


task
        :       cif?
                hyperlink?
1008
                TASK task_body? end
1009
1010
        ->      ^(TASK cif? hyperlink? end? task_body?)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021


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

1022

Maxime Perrotin's avatar
Maxime Perrotin committed
1023
1024
// SDL extension - FOR loop in TASKs
forloop
1025
        :       FOR variable_id IN (range | variable) ':'
Maxime Perrotin's avatar
Maxime Perrotin committed
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
                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
1044
        :       postfix_expression
dbarbera's avatar
dbarbera committed
1045
1046
        |       ID                     ->  ^(VARIABLE ID);

Maxime Perrotin's avatar
Maxime Perrotin committed
1047
1048

field_selection
1049
        :       (('!' | DOT) field_name);
Maxime Perrotin's avatar
Maxime Perrotin committed
1050

1051

dbarbera's avatar
dbarbera committed
1052
expression
1053
1054
        :       binary_expression;

1055

1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
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)*;

1069

1070
unary_expression
1071
1072
        :       postfix_expression
        |       primary_expression
1073
        |       NOT^ unary_expression
1074
1075
        |       DASH unary_expression    -> ^(NEG unary_expression)
        |       CALL procedure_call_body -> ^(PROCEDURE_CALL procedure_call_body)
1076
1077
1078
1079
1080
        ;


postfix_expression
        :       (ID -> ^(PRIMARY ^(VARIABLE ID)))
1081
1082
1083
1084
                (   '(' params=expression_list ')'
                -> ^(CALL $postfix_expression ^(PARAMS $params))
                |   ('!' | DOT) field_name
                -> ^(SELECTOR $postfix_expression field_name)
1085
1086
1087
                )+
        ;

1088
1089
1090

primary_expression
        :       primary                       -> ^(PRIMARY primary)
1091
        |       '(' expression ')'            -> ^(PAREN expression)
1092
        |       conditional_expression
1093
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1094

Maxime Perrotin's avatar
Maxime Perrotin committed
1095
1096
1097
1098
//  primary covers most expressions with ASN.1 value notation
//  note that mkstring is the SDL operator transforming an element
//  into an array. The regular sytanx { hello(1) } is ambiguous because
//  it could be a record element with value 1 as well as an array with index 1
1099
primary
1100
        :       TRUE^
Maxime Perrotin's avatar
Maxime Perrotin committed
1101
        |       FALSE^
1102
        |       STRING
Maxime Perrotin's avatar
Maxime Perrotin committed
1103
1104
        |       PLUS_INFINITY^
        |       MINUS_INFINITY^
1105
1106
        |       INT^
        |       FLOAT^
1107
        |       ID ':' expression           -> ^(CHOICE ID expression)
dbarbera's avatar
dbarbera committed
1108
        |       ID                          -> ^(VARIABLE ID)
1109
1110
        |       '{' '}'                     -> ^(EMPTYSTR)
        |       '{'
Maxime Perrotin's avatar
Maxime Perrotin committed
1111
1112
                MANTISSA mant=INT COMMA
                BASE bas=INT COMMA
dbarbera's avatar
dbarbera committed
1113
                EXPONENT exp=INT
1114
1115
                '}'                         -> ^(FLOAT2 $mant $bas $exp)
        |       '{'
1116
1117
                named_value (COMMA named_value)*
                '}'                         -> ^(SEQUENCE named_value+)
1118
        |       '{'
1119
1120
                expression (COMMA expression)*
                '}'                         -> ^(SEQOF expression+)
Maxime Perrotin's avatar
Maxime Perrotin committed
1121
1122
        |       MKSTRING '(' expression (COMMA expression)* ')'
                                            -> ^(SEQOF expression+)
1123
        |       STATE^
Maxime Perrotin's avatar
Maxime Perrotin committed
1124
1125
        ;

1126

Maxime Perrotin's avatar
Maxime Perrotin committed
1127
informal_text
1128
        :        STRING
1129
1130
        ->       ^(INFORMAL_TEXT STRING)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1131
1132
1133


// { a 5 } (SEQUENCE field value)
1134
named_value
1135
1136
        :       ID expression
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1137

Alexandre Esteves's avatar
Alexandre Esteves committed
1138
/*
Maxime Perrotin's avatar
Maxime Perrotin committed
1139
1140
1141
1142
primary_params
        :      '(' expression_list ')'
        ->     ^(PARAMS expression_list)
               | '!' literal_id
1143
1144
        ->     ^(FIELD_NAME literal_id)
        ;
Alexandre Esteves's avatar
Alexandre Esteves committed
1145
*/
Maxime Perrotin's avatar
Maxime Perrotin committed
1146

dbarbera's avatar
dbarbera committed
1147
/* All cases are covered by the ground primary
Maxime Perrotin's avatar
Maxime Perrotin committed
1148
1149
1150
1151
1152
   above (Except structure primary, but we favour ASN.1 notation)
extended_primary
        :       synonym         |
                indexed_primary |
                field_primary   |
1153
1154
                structure_primary
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1155
1156
1157
1158
*/


indexed_primary
1159
1160
        :       primary '(' expression_list ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1161
1162
1163


field_primary
1164
1165
        :       primary field_selection
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1166
1167
1168


structure_primary
1169
1170
        :       '(.' expression_list '.)'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1171
1172
1173
// Removed "qualifier" from the standard
// (to be put later, but never used in practice)

Alexandre Esteves's avatar
Alexandre Esteves committed
1174
/*
Maxime Perrotin's avatar
Maxime Perrotin committed
1175
active_expression
1176
1177
        :       active_primary
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1178
1179
1180
1181
1182
1183
1184
1185


active_primary
        :       variable_access
                | operator_application
                | conditional_expression
                | imperative_operator
                | '(' active_expression ')'
1186
1187
                | 'ERROR'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1188
1189
1190
1191
1192
1193
1194
1195
1196
   // active_extended_primary removed because not defined in the standard


imperative_operator
        :       now_expression
                | import_expression
                | pid_expression
                | view_expression
                | timer_active_expression
1197
1198
                | anyvalue_expression
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1199
1200
1201


timer_active_expression
1202
1203
        :       ACTIVE '(' timer_id ('(' expression_list ')')? ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1204
1205
1206


anyvalue_expression
1207
1208
        :       ANY '(' sort ')'
        ;
Alexandre Esteves's avatar
Alexandre Esteves committed
1209
*/
Maxime Perrotin's avatar
Maxime Perrotin committed
1210
1211

sort    :       sort_id
1212
1213
1214
        ->      ^(SORT sort_id)
        ;

Maxime Perrotin's avatar
Maxime Perrotin committed
1215

1216
1217
type_inst
        :       type_id
1218
1219
        ->      ^(TYPE_INSTANCE type_id)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1220

1221
1222
1223

syntype :       syntype_id
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1224

Alexandre Esteves's avatar
Alexandre Esteves committed
1225
/*
Maxime Perrotin's avatar
Maxime Perrotin committed
1226
import_expression
1227
1228
        :       IMPORT '(' remote_variable_id (',' destination)? ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1229
1230
1231


view_expression
1232
1233
        :       VIEW '(' view_id (',' pid_expression)? ')'
        ;
Alexandre Esteves's avatar
Alexandre Esteves committed
1234
*/
Maxime Perrotin's avatar
Maxime Perrotin committed
1235
1236

variable_access
1237
1238
        :       variable_id
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1239

1240
/*
Maxime Perrotin's avatar
Maxime Perrotin committed
1241
operator_application
1242
1243
        :       operator_id '('active_expression_list ')'
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1244

1245

dbarbera's avatar
dbarbera committed
1246
active_expression_list
1247
1248
        :       active_expression (',' expression_list)?
        ;
Alexandre Esteves's avatar
Alexandre Esteves committed
1249
// 	| ground_expression ',' active_expression_list;   // Will not work (recursion)
Maxime Perrotin's avatar
Maxime Perrotin committed
1250

Alexandre Esteves's avatar
Alexandre Esteves committed
1251
*/
Maxime Perrotin's avatar
Maxime Perrotin committed
1252

1253
//synonym :       ID; // synonym_id | external_synonym;
Maxime Perrotin's avatar
Maxime Perrotin committed
1254
1255

external_synonym
1256
1257
        :       external_synonym_id
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1258
1259


1260
conditional_expression
Maxime Perrotin's avatar
Maxime Perrotin committed
1261
1262
1263
        :       IF ifexpr=expression
                THEN thenexpr=expression
                ELSE elseexpr=expression FI
1264
1265
        ->      ^(CONDITIONAL $ifexpr $thenexpr $elseexpr)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1266
1267


dbarbera's avatar
dbarbera committed
1268
expression_list
Maxime Perrotin's avatar
Maxime Perrotin committed
1269
        :       expression (',' expression)*
1270
1271
        ->      expression+
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1272
1273
1274
1275
1276
1277
1278
1279


terminator_statement
        :       label?
                cif?
                hyperlink?
                terminator
                end
1280
1281
        ->      ^(TERMINATOR label? cif? hyperlink? end? terminator)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1282
1283
1284

label
        :       cif? connector_name ':'
1285
1286
        ->      ^(LABEL cif? connector_name)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1287
1288
1289


terminator
1290
1291
        :       nextstate | join | stop | return_stmt
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1292
1293
1294
1295


join
        :        JOIN connector_name
1296
1297
        ->       ^(JOIN connector_name)
        ;
Maxime Perrotin's avatar
Maxime Perrotin committed
1298
1299