1#ignore ::=
2		[
3			#skipIgnore(C++)
4			[
5					'#' #continue
6					#readIdentifier:sDirective
7					directive<sDirective>
8				|
9					#break
10			]
11		]*
12		;
13
14specification ::= #ignore [import]* [definition]+;
15
16definition ::=
17		type_dcl ';' | const_dcl /*';'*/ | except_dcl /*';'*/ | interface /*';'*/ | module /*';'*/
18			|
19		value /*';'*/ | type_id_dcl ';' | type_prefix_dcl ';' | event ';' | component /*';'*/ | home_dcl /*';'*/
20		;
21
22module ::= #readIdentifier:"module" #continue identifier '{' [definition]+ '}' ';';
23
24interface ::=
25		[#readIdentifier:{"abstract", "local"}]? #readIdentifier:"interface"
26		#continue
27		identifier
28		[
29				// forward declaration
30				';'
31			|
32				// interface declaration
33				[ interface_inheritance_spec ]?
34				'{'
35				#continue
36				interface_body '}'
37				';'
38		]
39		;
40
41interface_inheritance_spec ::= ':' #continue interface_name [',' #continue interface_name]*;
42
43interface_body ::= [export]*;
44
45export ::= type_dcl ';'
46| const_dcl /*';'*/
47| except_dcl /*';'*/
48| attr_dcl ';'
49| op_dcl ';'
50| type_id_dcl ';'
51| type_prefix_dcl ';';
52
53
54interface_name ::= scoped_name;
55
56scoped_name ::= identifier ["::" #continue identifier]*;
57
58//July 2002 CORBA, v3.0: OMG IDL Grammar 3-13
59//3
60value ::= value_dcl | value_abs_dcl | value_box_dcl | value_forward_dcl;
61
62value_forward_dcl ::= [#readIdentifier:"abstract"]? #readIdentifier:"valuetype" identifier ';';
63
64value_box_dcl ::= #readIdentifier:"valuetype" identifier type_spec ';';
65
66value_abs_dcl ::= #readIdentifier:"abstract" #readIdentifier:"valuetype" identifier [value_inheritance_spec]? '{' #continue [export]* '}' ';';
67
68value_dcl ::= value_header '{' #continue [value_element]* '}' ';';
69
70value_header ::= [#readIdentifier:"custom" ]? #readIdentifier:"valuetype" identifier [ value_inheritance_spec ]?;
71
72value_inheritance_spec ::=
73		[
74			':' #continue
75			[ #readIdentifier:"truncatable" ]?
76			value_name [',' #continue value_name]*
77		]?
78		[
79			#readIdentifier:"supports" #continue
80			interface_name [',' #continue interface_name]*
81		]?;
82
83value_name ::= scoped_name;
84
85value_element ::= export |  state_member | init_dcl;
86
87state_member ::= #readIdentifier:{"public", "private"} #continue type_spec declarators ';';
88
89init_dcl ::=
90		#readIdentifier:"factory" identifier
91		'(' #continue [ init_param_decls ]? ')'
92		[ raises_expr ]? ';';
93
94init_param_decls ::= init_param_decl [ ',' #continue init_param_decl]*;
95
96init_param_decl ::= init_param_attribute param_type_spec simple_declarator;
97
98init_param_attribute ::= #readIdentifier:"in";
99
100const_dcl ::= #readIdentifier:"const" #continue const_type identifier '=' const_exp ';';
101
102const_type ::= integer_type
103| char_type
104| wide_char_type
105| boolean_type
106| floating_pt_type
107| string_type
108| wide_string_type
109| fixed_pt_const_type
110| scoped_name
111| octet_type;
112
113const_exp ::= or_expr;
114or_expr ::= xor_expr ['|' #continue xor_expr]*;
115xor_expr ::= and_expr ['^' #continue and_expr]*;
116and_expr ::= shift_expr ['&' #continue shift_expr]*;
117shift_expr ::= add_expr [[">>" | "<<"] #continue  add_expr]*;
118
119//3-14 Common Object Request Broker Architecture (CORBA), v3.0 July 2002
120//3
121add_expr ::= mult_expr [['+' | '-'] #continue mult_expr]*;
122mult_expr ::= unary_expr [['*' | '/' | '%'] #continue unary_expr]*;
123unary_expr ::= unary_operator primary_expr | primary_expr;
124unary_operator ::= '-' | '+' | '~';
125
126primary_expr ::= literal | scoped_name | '(' #continue const_exp ')';
127
128literal ::= #readInteger
129	| #readCString
130//| wide_#readCString
131	| character_literal
132//| wide_character_literal
133| #readNumeric
134| boolean_literal;
135
136character_literal ::= #!ignore "'" ['\\']? #readChar "'";
137boolean_literal ::= #readIdentifier:{"TRUE", "FALSE"};
138positive_int_const ::= const_exp;
139
140type_dcl ::= #readIdentifier:"typedef" #continue type_declarator
141| struct_type
142| union_type
143| enum_type
144| #readIdentifier:"native" #continue simple_declarator
145| constr_forward_decl;
146
147type_declarator ::= type_spec declarators;
148
149type_spec ::= simple_type_spec | constr_type_spec;
150
151simple_type_spec ::= base_type_spec | template_type_spec | scoped_name;
152
153base_type_spec ::=
154			floating_pt_type | integer_type | char_type | wide_char_type | boolean_type
155		|
156			octet_type | any_type | object_type | value_base_type;
157
158template_type_spec ::= sequence_type | string_type | wide_string_type | fixed_pt_type;
159
160constr_type_spec ::= struct_type | union_type | enum_type;
161
162declarators ::= declarator [ ',' #continue declarator]*;
163
164declarator ::= complex_declarator | simple_declarator;
165
166simple_declarator ::= identifier;
167
168complex_declarator ::= array_declarator;
169
170floating_pt_type ::= #readIdentifier:"float" | #readIdentifier:"double" | #readIdentifier:"long" #readIdentifier:"double";
171
172integer_type ::= signed_int | unsigned_int;
173
174signed_int ::= signed_short_int | signed_long_int | signed_longlong_int;
175
176signed_short_int ::= #readIdentifier:"short";
177
178signed_long_int ::= #readIdentifier:"long";
179
180signed_longlong_int ::= #readIdentifier:"long" #readIdentifier:"long";
181
182unsigned_int ::= unsigned_short_int | unsigned_long_int | unsigned_longlong_int;
183
184unsigned_short_int ::= #readIdentifier:"unsigned" #readIdentifier:"short";
185
186unsigned_long_int ::= #readIdentifier:"unsigned" #readIdentifier:"long";
187
188unsigned_longlong_int ::= #readIdentifier:"unsigned" #readIdentifier:"long" #readIdentifier:"long";
189
190char_type ::= #readIdentifier:"char";
191
192wide_char_type ::= #readIdentifier:"wchar";
193
194boolean_type ::= #readIdentifier:"boolean";
195
196octet_type ::= #readIdentifier:"octet";
197
198any_type ::= #readIdentifier:"any";
199
200object_type ::= #readIdentifier:"Object";
201
202struct_type ::= #readIdentifier:"struct" identifier '{' #continue member_list '}';
203
204member_list ::= [member]+;
205
206member ::= type_spec declarators ';';
207
208union_type ::=
209		#readIdentifier:"union" identifier #readIdentifier:"switch" #continue
210		'(' switch_type_spec ')'
211		'{' switch_body '}';
212
213switch_type_spec ::= integer_type | char_type | boolean_type | enum_type | scoped_name;
214
215switch_body ::= [case]+;
216
217//3-16 Common Object Request Broker Architecture (CORBA), v3.0 July 2002
218//3
219case ::= [case_label]+ #continue element_spec ';';
220
221case_label ::=
222		#readIdentifier:"case" #continue const_exp ':'
223	|
224		#readIdentifier:"default" #continue ':'
225	;
226
227element_spec ::= type_spec declarator;
228
229enum_type ::= #readIdentifier:"enum" identifier '{' #continue enumerator [',' #continue enumerator]* '}';
230
231enumerator ::= identifier;
232
233sequence_type ::= #readIdentifier:"sequence" #continue '<' simple_type_spec [',' #continue positive_int_const]? '>';
234
235string_type ::= #readIdentifier:"string" ['<' #continue positive_int_const '>']?;
236
237wide_string_type ::= #readIdentifier:"wstring" ['<' #continue positive_int_const '>']?;
238
239array_declarator ::= identifier [fixed_array_size]+;
240
241fixed_array_size ::= '[' #continue positive_int_const ']';
242
243attr_dcl ::= readonly_attr_spec | attr_spec;
244
245except_dcl ::= #readIdentifier:"exception" #continue identifier '{' [member]* '}' ';';
246
247op_dcl ::= [op_attribute]? op_type_spec identifier parameter_dcls [ raises_expr ]? [ context_expr ]?;
248
249op_attribute ::= #readIdentifier:"oneway";
250
251op_type_spec ::= param_type_spec | #readIdentifier:"void";
252
253parameter_dcls ::= '(' [param_dcl #continue [ ',' #continue param_dcl]*]? ')';
254
255param_dcl ::= param_attribute param_type_spec simple_declarator;
256
257param_attribute ::= #readIdentifier:{"in", "out", "inout"};
258
259raises_expr ::= #readIdentifier:"raises" #continue '(' scoped_name [ ',' #continue scoped_name]* ')';
260
261context_expr ::= #readIdentifier:"context" #continue '(' #readCString [ ',' #continue #readCString]* ')';
262
263param_type_spec ::= base_type_spec | string_type | wide_string_type | scoped_name;
264
265fixed_pt_type ::= #readIdentifier:"fixed" '<' #continue positive_int_const ',' positive_int_const '>';
266
267fixed_pt_const_type ::= #readIdentifier:"fixed";
268
269value_base_type ::= #readIdentifier:"ValueBase";
270
271constr_forward_decl ::= #readIdentifier:"struct" identifier | #readIdentifier:"union" identifier;
272
273//July 2002 CORBA, v3.0: OMG IDL Grammar 3-17
274//3
275import ::= #readIdentifier:"import" #continue imported_scope ';';
276
277imported_scope ::= scoped_name | #readCString;
278
279type_id_dcl ::= #readIdentifier:"typeid" #continue scoped_name #readCString;
280
281type_prefix_dcl ::= #readIdentifier:"typeprefix" #continue scoped_name #readCString;
282
283readonly_attr_spec ::= #readIdentifier:"readonly" #continue #readIdentifier:"attribute" param_type_spec readonly_attr_declarator;
284
285readonly_attr_declarator::= simple_declarator [raises_expr | [',' #continue simple_declarator]*];
286
287attr_spec ::= #readIdentifier:"attribute" #continue param_type_spec attr_declarator;
288
289attr_declarator ::= simple_declarator attr_raises_expr | simple_declarator [',' #continue simple_declarator]*;
290
291attr_raises_expr ::= get_excep_expr [ set_excep_expr ]? | set_excep_expr;
292
293get_excep_expr ::= #readIdentifier:"getraises" #continue exception_list;
294
295set_excep_expr ::= #readIdentifier:"setraises" #continue exception_list;
296
297exception_list ::= '(' #continue scoped_name [',' #continue scoped_name]* ')';
298
299
300
301//Note � Grammar rules 1 through 111 with the exception of the last three lines of rule
302//2 constitutes the portion of IDL that is not related to components.
303component ::=
304		#readIdentifier:"component" #continue identifier
305		[
306				// forward declaration
307				';'
308			|
309				[component_inheritance_spec]?
310				[supported_interface_spec]?
311				#continue
312				'{' component_body '}'
313				';'
314		]
315		;
316
317supported_interface_spec ::= #readIdentifier:"supports" #continue scoped_name [',' #continue scoped_name]*;
318
319component_inheritance_spec ::= ':' #continue scoped_name;
320
321component_body ::= [component_export]*;
322
323component_export ::=
324		#readIdentifier:sKeyword
325		#continue
326		component_export<sKeyword>
327		';'
328		;
329
330component_export<"provides"> ::= #continue interface_type identifier;
331interface_type ::= scoped_name | #readIdentifier:"Object";
332
333component_export<"uses"> ::= [#readIdentifier:"multiple"]? #continue interface_type identifier;
334
335//3-18 Common Object Request Broker Architecture (CORBA), v3.0 July 2002
336//3
337component_export<"emits"> ::= #continue scoped_name identifier;
338
339component_export<"publishes"> ::= #continue scoped_name identifier;
340
341component_export<"consumes"> ::= #continue scoped_name identifier;
342
343component_export<"readonly">  ::= #continue #readIdentifier:"attribute" param_type_spec readonly_attr_declarator;
344
345component_export<"attribute"> ::= #continue param_type_spec attr_declarator;
346
347
348
349home_dcl ::= home_header #continue home_body ';';
350
351home_header ::= #readIdentifier:"home" #continue identifier
352[ home_inheritance_spec ]?
353[ supported_interface_spec ]?
354#readIdentifier:"manages" scoped_name
355[ primary_key_spec ]?;
356
357home_inheritance_spec ::= ':' #continue scoped_name;
358
359primary_key_spec ::= #readIdentifier:"primarykey" #continue scoped_name;
360
361home_body ::= '{' #continue [home_export]* '}' ';';
362
363home_export ::= export | factory_dcl ';' | finder_dcl ';';
364
365factory_dcl ::= #readIdentifier:"factory" identifier '(' [ init_param_decls ]? ')' [ raises_expr ]?;
366
367finder_dcl ::= #readIdentifier:"finder" #continue identifier '(' [ init_param_decls ]? ')' [ raises_expr ]?;
368
369
370
371event ::= [ event_dcl | event_abs_dcl | event_forward_dcl];
372
373event_forward_dcl ::= [#readIdentifier:"abstract"]? #readIdentifier:"eventtype" identifier;
374
375event_abs_dcl ::= #readIdentifier:"abstract" #readIdentifier:"eventtype" identifier	[ value_inheritance_spec ]? '{' #continue [export]* '}';
376
377event_dcl ::= event_header '{' #continue [value_element]* '}';
378
379event_header ::= [#readIdentifier:"custom"]? #readIdentifier:"eventtype" identifier [ value_inheritance_spec ]?;
380
381
382
383identifier ::=
384		#readIdentifier:sIdentifier
385		!#check(sIdentifier in {"abstract", "any", "attribute", "boolean", "case", "char", "component", "const", "consults", "context", "custom", "default", "double", "emits", "enum", "eventtype", "exception", "factory", "FALSE", "finder", "fixed", "float", "getraises", "home", "import", "in", "inout", "interface", "local", "long", "manages", "module", "multiple", "native", "Object", "octet", "oneway", "out", "primarykey", "private", "provides", "public", "publishes", "raises", "readonly", "sequence", "setraises", "short", "string", "struct", "supports", "switch", "TRUE", "truncatable", "typedef", "typeid", "typeprefix", "union", "unsigned", "uses", "ValueBase", "valuetype", "wchar", "wstring"})
386		;
387
388
389//***********************************************
390//           P R E P R O C E S S O R
391//***********************************************
392
393directive<"define"> ::=
394		#skipIgnore(blanks)
395		#continue
396		#readIdentifier:sDefinition
397		->(:sValue)['\\' ['\r']? '\n' #nextStep #check(false) | ['\r']? '\n']
398		=> {
399			sValue.trim();
400//			if sValue setProperty(sDefinition, sValue);
401//			else setProperty(sDefinition, true);
402		}
403		;
404
405directive<"include"> ::=
406		#skipIgnore(blanks)
407		#continue
408		[
409				#readCString
410			|
411				'<' ->'>'
412		]
413		;
414
415directive<"ifdef"> ::=
416		#skipIgnore(blanks)
417		#continue
418		#readIdentifier:sDefinition
419		->'\n'
420		[
421				#check(getProperty(sDefinition))
422			|
423				ignore_processor_block:sDirective
424				[
425					#check(sDirective == "elif")
426					directive<"elif">
427				]?
428		]
429		;
430directive<"ifndef"> ::=
431		#skipIgnore(blanks)
432		#continue
433		#readIdentifier:sDefinition
434		->'\n'
435		[
436			#check(getProperty(sDefinition))
437			#continue
438			ignore_processor_block:sDirective
439			[
440				#check(sDirective == "elif")
441				directive<"elif">
442			]?
443		]?
444		;
445
446directive<"elif"> ::= directive<"ifdef">;
447
448directive<"else"> ::=
449		#continue ->'\n'
450		ignore_processor_block
451		;
452
453directive<"endif"> ::= #continue ->'\n';
454
455ignore_processor_block	::= ignore_processor_block_internal(0);
456ignore_processor_block_internal(n : value) : value ::=
457		[
458				#readCString
459			|
460				"'" ['\\']? #readChar "'"
461			|
462				'#'
463				#skipIgnore(blanks)
464				#readIdentifier:sDirective
465				ignore_processor_block_internal<sDirective>(n)
466			|
467				~'#'
468		]*
469		#continue
470		'#'
471		#skipIgnore(blanks)
472		#readIdentifier:{"else", "elif", "endif"}:ignore_processor_block_internal
473		;
474
475ignore_processor_block_internal<sDirective>(n : value) : value  ::= #check(true);
476ignore_processor_block_internal<"if">(n : value) : value  ::= ignore_processor_block_internal(increment(n));
477ignore_processor_block_internal<"ifdef">(n : value) : value  ::= ignore_processor_block_internal(increment(n));
478ignore_processor_block_internal<"ifndef">(n : value) : value  ::= ignore_processor_block_internal(increment(n));
479
480ignore_processor_block_internal<"else">(n : value) : value  ::= #check($n > 0$);
481ignore_processor_block_internal<"elif">(n : value) : value  ::= #check($n > 0$);
482ignore_processor_block_internal<"endif">(n : value) : value  ::= #check(false);
483