Subversion Repositories tendra.SVN

Rev

Rev 6 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
2
    		 Crown Copyright (c) 1997
3
 
4
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
12
 
13
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
15
 
16
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
19
 
20
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
22
        these conditions;
23
 
24
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
27
        it may be put.
28
*/
29
 
30
 
31
%types%
32
 
33
AltP;
34
BoolT;
35
EntryP;
36
ItemP;
37
RuleP;
38
StringT;
39
 
40
%terminals%
41
 
42
blt-types;		// %types%
43
blt-terminals;		// %maxterminal%
44
blt-productions;	// %productions% 
45
blt-entry;		// %entry%
46
identifier: () -> (: StringT);
47
typemark;		// :
48
open-tuple;		// (
49
close-tuple;		// )
50
arrow;			// ->
51
terminator;		// ;
52
begin-action;		// <
53
end-action;		// >
54
define;			// =
55
begin-rule;		// {
56
end-rule;		// }
57
alt-sep;		// ||
58
handler-sep;		// ##
59
empty;			// $
60
pred-result;		// ?
61
ignore;			// !
62
scopemark;		// ::
63
begin-scope;		// [
64
end-scope;		// ]
65
separator;		// ,
66
reference;		// &
67
eof;
68
 
69
%productions%
70
 
71
<init-tuple>;
72
<tuple-name>: (: StringT &, : StringT &) -> ();
73
<tuple-ref-name>: (: StringT &, : StringT &) -> ();
74
<tuple-type>: (: StringT &) -> ();
75
<tuple-ref-type>: (: StringT &) -> ();
76
<save-tuple>;
77
<null-type>;
78
<add-type>: (: StringT &) -> ();
79
<terminal>: (: StringT &) -> ();
80
<i-terminal>: (: StringT &) -> ();
81
<x-terminal>;
82
<add-name>: (: StringT &) -> ();
83
<add-ref-name>: (: StringT &) -> ();
84
<add-var>: (: StringT &) -> ();
85
<add-pred>;
86
<add-void>;
87
<action>: (: StringT &) -> ();
88
<x-action>;
89
<non-local>: (: StringT &, : StringT &) -> ();
90
<non-local-init>: (: StringT &) -> ();
91
<save-scope>: () -> (: EntryP, : RuleP);
92
<restore-scope>: (: EntryP, : RuleP) -> ();
93
<prod-action>: (: StringT &) -> ();
94
<x-prod-action>;
95
<x-identity>;
96
<x-prod-rule>: (: StringT &) -> ();
97
<x-prod-rule-or-identity>: (: StringT &) -> ();
98
<save>: () -> (: EntryP, : RuleP, : AltP, : BoolT, : ItemP);
99
<restore>: (: EntryP, : RuleP, : AltP, :BoolT, : ItemP) -> ();
100
<handler>;
101
<x-handler>;
102
<empty-alt>;
103
<non-empty-alt>;
104
<x-non-empty-alt>;
105
<rule>: (: StringT &) -> ();
106
<x-rule>;
107
<prod>;
108
<x-prod>;
109
<push-scope>;
110
<pop-scope>;
111
<use-global>;
112
<use-local>;
113
<add-entry>: (: StringT &) -> ();
114
<init>;
115
<x-terminals>;
116
 
117
<unhandled-syntax-error>;
118
 
119
<expected-typemark>;
120
<expected-identifier>;
121
<expected-tuple-defn>;
122
<expected-terminal-decn>;
123
<expected-separator>;
124
<expected-open-tuple>;
125
<expected-close-tuple>;
126
<expected-arrow>;
127
<expected-terminator>;
128
<expected-lhs-name>;
129
<expected-rhs-name>;
130
<expected-begin-action>;
131
<expected-end-action>;
132
<expected-end-scope>;
133
<expected-tuple-or-terminator>;
134
<expected-item-rhs>;
135
<expected-define>;
136
<expected-tuple-or-define-or-terminator>;
137
<expected-begin-rule>;
138
<expected-end-rule>;
139
<expected-item>;
140
<expected-alternative>;
141
<expected-other-defn>;
142
<expected-production-defn>;
143
<expected-blt-types>;
144
<expected-blt-terminals>;
145
<expected-blt-productions>;
146
<expected-blt-entry>;
147
<expected-eof>;
148
<expected-terminator-or-define>;
149
 
150
<destroy-string>: (: StringT &) -> ();
151
 
152
<skip-to-end-of-tuple-defn>;
153
<skip-to-end-of-terminal-decn>;
154
<skip-to-end-of-lhs-name>;
155
<skip-to-end-of-rhs-name>;
156
<skip-to-end-of-action-decn>;
157
<skip-to-end-of-item>;
158
<skip-to-end-of-alternative>;
159
<skip-to-end-of-other-defn>;
160
<skip-to-end-of-production-defn>;
161
<skip-to-end-of-entry-list>;
162
<skip-recover>;
163
 
164
<is-blt-entry-or-end-scope-or-eof>: () -> (: BoolT);
165
<is-close-tuple-or-skipped-or-eof>: () -> (: BoolT);
166
<is-terminator>: () -> (: BoolT);
167
<is-not-separator>: () -> (: BoolT);
168
 
169
/*
170
-------------------------------------------------------------------------------
171
| Before calling the "sid-parse-grammar" function, the following variables
172
| should have been initialized: "sid_current_stream" and "sid_current_grammar".
173
-------------------------------------------------------------------------------
174
*/
175
 
176
sid-parse-grammar [
177
    // FUNCTION TYPE SPECIFICATIONS:
178
    function-type-defn [
179
	tuple-defn = {
180
	    name = identifier;
181
	    {
182
		typemark;
183
	      ##
184
		<expected-typemark>;
185
	    };
186
	    {
187
		type = identifier;
188
		{
189
		    reference;
190
		    <tuple-ref-name> (&name, &type);
191
		  ||
192
		    <tuple-name> (&name, &type);
193
		};
194
	      ##
195
		<expected-identifier>;
196
		<destroy-string> (&name);
197
		<skip-to-end-of-tuple-defn>;
198
	    };
199
	  ||
200
	    typemark;
201
	    {
202
		type = identifier;
203
		{
204
		    reference;
205
		    <tuple-ref-type> (&type);
206
		  ||
207
		    <tuple-type> (&type);
208
		};
209
	      ##
210
		<expected-identifier>;
211
		<skip-to-end-of-tuple-defn>;
212
	    };
213
	  ##
214
	    <expected-tuple-defn>;
215
	    <skip-to-end-of-tuple-defn>;
216
	};
217
 
218
	tuple-defn-list-1 = {
219
	    tuple-defn;
220
	    {
221
		? = <is-close-tuple-or-skipped-or-eof>;
222
	      ||
223
		separator;
224
		tuple-defn-list-1;
225
	      ##
226
		<expected-separator>;
227
		tuple-defn-list-1;
228
	    };
229
	};
230
 
231
	tuple-defn-list = {
232
	    $;
233
	  ||
234
	    tuple-defn-list-1;
235
	};
236
 
237
	type-tuple-defn = {
238
	    <init-tuple>;
239
	    {
240
		open-tuple;
241
	      ##
242
		<expected-open-tuple>;
243
	    };
244
	    tuple-defn-list;
245
	    <skip-recover>;
246
	    {
247
		close-tuple;
248
	      ##
249
		<expected-close-tuple>;
250
	    };
251
	};
252
    ] = {
253
	typemark;
254
	type-tuple-defn;
255
	<save-tuple>;
256
	{
257
	    arrow;
258
	  ##
259
	    <expected-arrow>;
260
	};
261
	type-tuple-defn;
262
      ||
263
	<null-type>;
264
    };
265
 
266
    // TYPE DECLARATIONS:
267
    type-decl-list [
268
	type-decl = {
269
	    id = identifier;
270
	    <add-type> (&id);
271
	    {
272
		terminator;
273
	      ##
274
		<expected-terminator>;
275
	    };
276
	};
277
    ] = {
278
	$;
279
      ||
280
	type-decl;
281
	type-decl-list;
282
    };
283
 
284
    // TERMINAL DECLARATIONS:
285
    terminal-decn-list [
286
	terminal-decn = {
287
	    id = identifier;
288
	    <terminal> (&id);
289
	    function-type-defn;
290
	    <x-terminal>;
291
	    {
292
		terminator;
293
	      ##
294
		<expected-terminator>;
295
	    };
296
	  ||
297
	    ignore;
298
	    {
299
		id = identifier;
300
		<i-terminal> (&id);
301
		function-type-defn;
302
		<x-terminal>;
303
		{
304
		    terminator;
305
		  ##
306
		    <expected-terminator>;
307
		};
308
	      ##
309
		<expected-identifier>;
310
		<skip-to-end-of-terminal-decn>;
311
	    };
312
	  ##
313
	    <expected-terminal-decn>;
314
	    <skip-to-end-of-terminal-decn>;
315
	};
316
    ] = {
317
	terminal-decn;
318
	<skip-recover>;
319
	{
320
	    $;
321
	  ||
322
	    terminal-decn-list;
323
	};
324
    };
325
 
326
    // PRODUCTION DEFINITIONS:
327
    production-defn-list [
328
	// LHS TUPLES:
329
	lhs-name-tuple [
330
	    lhs-name = {
331
		id = identifier;
332
		<add-name> (&id);
333
	      ||
334
		reference;
335
		{
336
		    id = identifier;
337
		    <add-var> (&id);
338
		  ##
339
		    <expected-identifier>;
340
		};
341
	      ||
342
		pred-result;
343
		<add-pred>;
344
	      ||
345
		ignore;
346
		<add-void>;
347
	      ##
348
		<expected-lhs-name>;
349
		<skip-to-end-of-lhs-name>;
350
	    };
351
 
352
	    lhs-name-list-1 = {
353
		lhs-name;
354
		{
355
		    ? = <is-close-tuple-or-skipped-or-eof>;
356
		  ||
357
		    separator;
358
		    lhs-name-list-1;
359
		  ##
360
		    <expected-separator>;
361
		    lhs-name-list-1;
362
		};
363
	    };
364
 
365
	    lhs-name-list = {
366
		$;
367
	      ||
368
		lhs-name-list-1;
369
	    };
370
	] = {
371
	    <init-tuple>;
372
	    {
373
		open-tuple;
374
	      ##
375
		<expected-open-tuple>;
376
	    };
377
	    lhs-name-list;
378
	    <skip-recover>;
379
	    {
380
		close-tuple;
381
	      ##
382
		<expected-close-tuple>;
383
	    };
384
	};
385
 
386
	// RHS TUPLES:
387
	rhs-name-tuple [
388
	    rhs-name = {
389
		id = identifier;
390
		<add-name> (&id);
391
	      ||
392
		reference;
393
		{
394
		    id = identifier;
395
		    <add-ref-name> (&id);
396
		  ##
397
		    <expected-identifier>;
398
		    <skip-to-end-of-rhs-name>;
399
		};
400
	      ##
401
		<expected-rhs-name>;
402
		<skip-to-end-of-rhs-name>;
403
	    };
404
 
405
	    rhs-name-list-1 = {
406
		rhs-name;
407
		{
408
		    ? = <is-close-tuple-or-skipped-or-eof>;
409
		  ||
410
		    separator;
411
		    rhs-name-list-1;
412
		  ##
413
		    <expected-separator>;
414
		    rhs-name-list-1;
415
		};
416
	    };
417
 
418
	    rhs-name-list = {
419
		$;
420
	      ||
421
		rhs-name-list-1;
422
	    };
423
	] = {
424
	    <init-tuple>;
425
	    {
426
		open-tuple;
427
	      ##
428
		<expected-open-tuple>;
429
	    };
430
	    rhs-name-list;
431
	    <skip-recover>;
432
	    {
433
		close-tuple;
434
	      ##
435
		<expected-close-tuple>;
436
	    };
437
	};
438
 
439
	// ACTION DECLARATIONS:
440
	action-decn = {
441
	    begin-action;
442
	    {
443
		id = identifier;
444
		<action> (&id);
445
		{
446
		    end-action;
447
		  ##
448
		    <expected-end-action>;
449
		};
450
		function-type-defn;
451
		<x-action>;
452
		{
453
		    terminator;
454
		  ##
455
		    <expected-terminator>;
456
		};
457
	      ##
458
		<expected-identifier>;
459
		<skip-to-end-of-action-decn>;
460
	    };
461
	};
462
 
463
	// PRODUCTION DEFINITIONS:
464
	production-locals = {
465
	    $;
466
	  ||
467
	    begin-scope;
468
	    (entry, rule) = <save-scope>;
469
	    production-defn-list;
470
	    <restore-scope> (entry, rule);
471
	    {
472
		end-scope;
473
	      ##
474
		<expected-end-scope>;
475
	    };
476
	};
477
 
478
	production-defn-define-4 = {
479
	    rhs-name-tuple;
480
	    <x-prod-action>;
481
	    {
482
		terminator;
483
	      ##
484
		<expected-terminator>;
485
	    };
486
	  ||
487
	    <init-tuple>;
488
	    <x-prod-action>;
489
	    terminator;
490
	  ##
491
	    <expected-tuple-or-terminator>;
492
	    <skip-to-end-of-item>;
493
	};
494
 
495
	production-defn-define-1 = {
496
	    begin-action;
497
	    {
498
		id = identifier;
499
		<prod-action> (&id);
500
		{
501
		    end-action;
502
		  ##
503
		    <expected-end-action>;
504
		};
505
		production-defn-define-4;
506
	      ##
507
		<expected-identifier>;
508
		<skip-to-end-of-item>;
509
	    };
510
	  ||
511
	    id = identifier;
512
	    {
513
		<init-tuple>;
514
		<x-prod-rule-or-identity> (&id);
515
		terminator;
516
	      ||
517
		rhs-name-tuple;
518
		<x-prod-rule> (&id);
519
		{
520
		    terminator;
521
		  ##
522
		    <expected-terminator>;
523
		};
524
	      ##
525
		<expected-tuple-or-terminator>;
526
		<destroy-string> (&id);
527
		<skip-to-end-of-item>;
528
	    };
529
	  ||
530
	    <init-tuple>;
531
	    reference;
532
	    {
533
		id = identifier;
534
		<add-ref-name> (&id);
535
		<x-identity>;
6 7u83 536
		{
537
			terminator;
538
		  ##
539
			<expected-terminator>;
540
		};
2 7u83 541
	      ##
542
		<expected-identifier>;
543
		<skip-to-end-of-item>;
544
	    };
545
	  ||
546
	    rhs-name-tuple;
547
	    <x-identity>;
548
	    {
549
		terminator;
550
	      ##
551
		<expected-terminator>;
552
	    };
553
	  ##
554
	    <expected-item-rhs>;
555
	    <skip-to-end-of-item>;
556
	};
557
 
558
	production-defn-define = {
559
	    lhs-name-tuple;
560
	    <save-tuple>;
561
	    {
562
		define;
563
	      ##
564
		<expected-define>;
565
	    };
566
	    production-defn-define-1;
567
	  ||
568
	    <init-tuple>;
569
	    <add-pred>;
570
	    pred-result;
571
	    <save-tuple>;
572
	    {
573
		define;
574
	      ##
575
		<expected-define>;
576
	    };
577
	    production-defn-define-1;
578
	  ||
579
	    <init-tuple>;
580
	    <add-void>;
581
	    ignore;
582
	    <save-tuple>;
583
	    {
584
		define;
585
	      ##
586
		<expected-define>;
587
	    };
588
	    production-defn-define-1;
589
	  ||
590
	    reference;
591
	    {
592
		id = identifier;
593
		<init-tuple>;
594
		<add-var> (&id);
595
		<save-tuple>;
596
		{
597
		    define;
598
		  ##
599
		    <expected-define>;
600
		};
601
		production-defn-define-1;
602
	      ##
603
		<expected-identifier>;
604
	    };
605
	  ||
606
	    id = identifier;
607
	    {
608
		<init-tuple>;
609
		<save-tuple>;
610
		rhs-name-tuple;
611
		<x-prod-rule> (&id);
612
		{
613
		    terminator;
614
		  ##
615
		    <expected-terminator>;
616
		};
617
	      ||
618
		<init-tuple>;
619
		<add-name> (&id);
620
		<save-tuple>;
621
		define;
622
		production-defn-define-1;
623
	      ||
624
		<init-tuple>;
625
		<save-tuple>;
626
		<init-tuple>;
627
		<x-prod-rule> (&id);
628
		terminator;
629
	      ##
630
		<expected-tuple-or-define-or-terminator>;
631
		<destroy-string> (&id);
632
		<skip-to-end-of-item>;
633
	    };
634
	  ||
635
	    <init-tuple>;
636
	    <save-tuple>;
637
	    begin-action;
638
	    {
639
		id = identifier;
640
		<prod-action> (&id);
641
		{
642
		    end-action;
643
		  ##
644
		    <expected-end-action>;
645
		};
646
		production-defn-define-4;
647
	      ##
648
		<expected-identifier>;
649
		<skip-to-end-of-item>;
650
	    };
651
	};
652
 
653
	production-defn-rhs;
654
 
655
	production-defn-item = {
656
	    production-defn-define;
657
	    <skip-recover>;
658
	  ||
659
	    begin-rule;
660
	    (entry, rule, alt, internal, item) = <save>;
661
	    production-defn-rhs;
662
	    <restore> (entry, rule, alt, internal, item);
663
	    {
664
		end-rule;
665
	      ##
666
		<expected-end-rule>;
667
	    };
668
	    {
669
		terminator;
670
	      ##
671
		<expected-terminator>;
672
	    };
673
	};
674
 
675
	production-defn-non-empty-alternative = {
676
	    production-defn-item;
677
	  ||
678
	    production-defn-item;
679
	    production-defn-non-empty-alternative;
680
	  ##
681
	    <expected-item>;
682
	    <skip-to-end-of-item>;
683
	    <skip-recover>;
684
	};
685
 
686
	exception-handler = {
687
	    <handler>;
688
	    production-defn-non-empty-alternative;
689
	    <x-handler>;
690
	};
691
 
692
	production-defn-alternative = {
693
	    <empty-alt>;
694
	    empty;
695
	    {
696
		terminator;
697
	      ##
698
		<expected-terminator>;
699
	    };
700
	  ||
701
	    <non-empty-alt>;
702
	    production-defn-non-empty-alternative;
703
	    <x-non-empty-alt>;
704
	  ##
705
	    <expected-alternative>;
706
	    <skip-to-end-of-alternative>;
707
	    <skip-recover>;
708
	};
709
 
710
	production-defn-alternatives = {
711
	    production-defn-alternative;
712
	    {
713
		$;
714
	      ||
715
		alt-sep;
716
		production-defn-alternatives;
717
	    };
718
	};
719
 
720
	production-defn-rhs = {
721
	    production-defn-alternatives;
722
	    {
723
		$;
724
	      ||
725
		handler-sep;
726
		exception-handler;
727
	    };
728
	};
729
 
730
	other-defn = {
731
	    id = identifier;
732
	    {
733
		typemark;
734
		{
735
		    type = identifier;
736
		    <non-local> (&id, &type);
737
		    {
738
			terminator;
739
		      ||
740
			define;
741
			{
742
			    begin-action;
743
			  ##
744
			    <expected-begin-action>;
745
			};
746
			{
747
			    action = identifier;
748
			    <non-local-init> (&action);
749
			    {
750
				end-action;
751
			      ##
752
				<expected-end-action>;
753
			    };
754
			    {
755
				terminator;
756
			      ##
757
				<expected-terminator>;
758
			    };
759
			  ##
760
			    <expected-identifier>;
761
			};
762
		      ##
763
			<expected-terminator-or-define>;
764
		    };
765
		  ##
766
		    <expected-identifier>;
767
		    <destroy-string> (&id);
768
		    <skip-to-end-of-other-defn>;
769
		};
770
	      ||
771
		function-type-defn;
772
		<rule> (&id);
773
		{
774
		    <x-rule>;
775
		    terminator;
776
		  ||
777
		    <prod>;
778
		    <push-scope>;
779
		    production-locals;
780
		    {
781
			define;
782
		      ##
783
			<expected-define>;
784
		    };
785
		    {
786
			begin-rule;
787
		      ##
788
			<expected-begin-rule>;
789
		    };
790
		    production-defn-rhs;
791
		    {
792
			end-rule;
793
		      ##
794
			<expected-end-rule>;
795
		    };
796
		    <pop-scope>;
797
		    <x-prod>;
798
		    {
799
			terminator;
800
		      ##
801
			<expected-terminator>;
802
		    };
803
		};
804
	      ##
805
		<expected-other-defn>;
806
		<destroy-string> (&id);
807
		<skip-to-end-of-other-defn>;
808
	    };
809
	};
810
 
811
	production-defn = {
812
	    {
813
		scopemark;
814
		<use-global>;
815
	       ||
816
		<use-local>;
817
	    };
818
	    {
819
		action-decn;
820
	      ||
821
		other-defn;
822
	    };
823
	};
824
    ] /* production-defn-list */ = {
825
	production-defn;
826
	<skip-recover>;
827
	{
828
	    ? = <is-blt-entry-or-end-scope-or-eof>;
829
	  ||
830
	    production-defn-list;
831
	};
832
      ##
833
	<expected-production-defn>;
834
	<skip-to-end-of-production-defn>;
835
	<skip-recover>;
836
	{
837
	    ? = <is-blt-entry-or-end-scope-or-eof>;
838
	  ##
839
	    production-defn-list;
840
	};
841
    };
842
 
843
    // ENTRY DECLARATIONS:
844
    entry-list [
845
	entry = {
846
	    id = identifier;
847
	    <add-entry> (&id);
848
	  ##
849
	    <expected-identifier>;
850
	};
851
    ] = {
852
	entry;
853
	{
854
	    ? = <is-terminator>;
855
	  ||
856
	    separator;
857
	    entry-list;
858
	  ##
859
	    <expected-separator>;
860
	    <skip-to-end-of-entry-list>;
861
	    <skip-recover>;
862
	    {
863
		? = <is-not-separator>;
864
	      ##
865
		entry-list;
866
	    };
867
	};
868
    };
869
] /* sid-parse-grammar */ = {
870
    <init>;
871
    {
872
	blt-types;
873
      ##
874
	<expected-blt-types>;
875
    };
876
    type-decl-list;
877
    {
878
	blt-terminals;
879
      ##
880
	<expected-blt-terminals>;
881
    };
882
    terminal-decn-list;
883
    <x-terminals>;
884
    {
885
	blt-productions;
886
      ##
887
	<expected-blt-productions>;
888
    };
889
    production-defn-list;
890
    {
891
	blt-entry;
892
      ##
893
	<expected-blt-entry>;
894
    };
895
    entry-list;
896
    {
897
	terminator;
898
      ##
899
	<expected-terminator>;
900
    };
901
    {
902
	eof;
903
      ##
904
	<expected-eof>;
905
    };
906
  ##
907
    <unhandled-syntax-error>;
908
};
909
 
910
%entry% sid-parse-grammar;