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