PARSER_BEGIN(IDLParser) public class IDLParser { public static void main(String args[]) { IDLParser parser; if (args.length == 0) { System.out.println("IDL Parser Version 0.1: Reading from standard input . . ."); parser = new IDLParser(System.in); } else if (args.length == 1) { System.out.println("IDL Parser Version 0.1: Reading from file " + args[0] + " . . ."); try { parser = new IDLParser(new java.io.FileInputStream(args[0])); } catch (java.io.FileNotFoundException e) { System.out.println("IDL Parser Version 0.1: File " + args[0] + " not found."); return; } } else { System.out.println("IDL Parser Version 0.1: Usage is one of:"); System.out.println(" java IDLParser < inputfile"); System.out.println("OR"); System.out.println(" java IDLParser inputfile"); return; } try { parser.specification(); System.out.println("IDL Parser Version 0.1: Java program parsed successfully."); } catch (ParseError e) { System.out.println("IDL Parser Version 0.1: Encountered errors during parse."); } } } PARSER_END(IDLParser) /* * Tokens to ignore in the BNF follow. */ SKIP : { < " " > | < "\t" > | < "\n" > | < "//" (~["\n"])* "\n" > | <"/*" (~["*"])* "*" (~["/"] (~["*"])* "*")* "/"> | < "#" ([" ","\t"])* (["0"-"9"])+ (([" ","\t"])* "\"" (~["\""])+ "\"" ([" ","\t"])* (["0"-"9"])* ([" ","\t"])* (["0"-"9"])*)? "\n" > } /* Production 1 */ void specification() : {} { ( definition() )+ } /* Production 2 */ void definition() : {} { type_dcl() ";" | const_dcl() ";" | except_dcl() ";" | interfacex() ";" | module() ";" } /* Production 3 */ void module() : {} { "module" identifier() "{" ( definition() )+ "}" } /* Production 4 */ void interfacex() : {} { LOOKAHEAD(3) interface_dcl() | forward_dcl() } /* Production 5 */ void interface_dcl() : {} { interface_header() "{" interface_body() "}" } /* Production 6 */ void forward_dcl() : {} { "interface" identifier() } /* Production 7 */ void interface_header() : {} { "interface" identifier() [ inheritance_spec() ] } /* Production 8 */ void interface_body() : {} { ( export() )* } /* Production 9 */ void export() : {} { type_dcl() ";" | const_dcl() ";" | except_dcl() ";" | attr_dcl() ";" | op_dcl() ";" } /* Production 10 */ void inheritance_spec() : {} { ":" scoped_name() ( "," scoped_name() )* } /* Production 11 */ void scoped_name() : {} { [ "::" ] identifier() ( "::" identifier() )* } /* Production 12 */ void const_dcl() : {} { "const" const_type() identifier() "=" const_exp() } /* Production 13 */ void const_type() : {} { integer_type() | char_type() | boolean_type() | floating_pt_type() | string_type() | scoped_name() } /* Production 14 */ void const_exp() : {} { or_expr() } /* Production 15 */ void or_expr() : {} { xor_expr() ( "|" xor_expr() )* } /* Production 16 */ void xor_expr() : {} { and_expr() ( "^" and_expr() )* } /* Production 17 */ void and_expr() : {} { shift_expr() ( "&" shift_expr() )* } /* Production 18 */ void shift_expr() : {} { add_expr() ( ( ">>" | "<<" ) add_expr() )* } /* Production 19 */ void add_expr() : {} { mult_expr() ( ( "+" | "-" ) mult_expr() )* } /* Production 20 */ void mult_expr() : {} { unary_expr() ( ( "*" | "/" | "%" ) unary_expr() )* } /* Production 21 */ void unary_expr() : {} { [ unary_operator() ] primary_expr() } /* Production 22 */ void unary_operator() : {} { "-" | "+" | "~" } /* Production 23 */ void primary_expr() : {} { scoped_name() | literal() | "(" const_exp() ")" } /* Production 24 */ void literal() : {} { integer_literal() | string_literal() | character_literal() | floating_pt_literal() | boolean_literal() } /* Production 25 */ void boolean_literal() : {} { "TRUE" | "FALSE" } /* Production 26 */ void positive_int_const() : {} { const_exp() } /* Production 27 */ void type_dcl() : {} { "typedef" type_declarator() | struct_type() | union_type() | enum_type() } /* Production 28 */ void type_declarator() : {} { type_spec() declarators() } /* Production 29 */ void type_spec() : {} { simple_type_spec() | constr_type_spec() } /* Production 30 */ void simple_type_spec() : {} { base_type_spec() | template_type_spec() | scoped_name() } /* Production 31 */ void base_type_spec() : {} { floating_pt_type() | integer_type() | char_type() | boolean_type() | octet_type() | any_type() } /* Production 32 */ void template_type_spec() : {} { sequence_type() | string_type() } /* Production 33 */ void constr_type_spec() : {} { struct_type() | union_type() | enum_type() } /* Production 34 */ void declarators() : {} { declarator() ( "," declarator() )* } /* Production 35 */ void declarator() : {} { LOOKAHEAD(2) complex_declarator() | simple_declarator() } /* Production 36 */ void simple_declarator() : {} { identifier() } /* Production 37 */ void complex_declarator() : {} { array_declarator() } /* Production 38 */ void floating_pt_type() : {} { "float" | "double" } /* Production 39 */ void integer_type() : {} { signed_int() | unsigned_int() } /* Production 40 */ void signed_int() : {} { signed_long_int() | signed_short_int() } /* Production 41 */ void signed_long_int() : {} { "long" } /* Production 42 */ void signed_short_int() : {} { "short" } /* Production 43 */ void unsigned_int() : {} { LOOKAHEAD(2) unsigned_long_int() | unsigned_short_int() } /* Production 44 */ void unsigned_long_int() : {} { "unsigned" "long" } /* Production 45 */ void unsigned_short_int() : {} { "unsigned" "short" } /* Production 46 */ void char_type() : {} { "char" } /* Production 47 */ void boolean_type() : {} { "boolean" } /* Production 48 */ void octet_type() : {} { "octet" } /* Production 49 */ void any_type() : {} { "any" } /* Production 50 */ void struct_type() : {} { "struct" identifier() "{" member_list() "}" } /* Production 51 */ void member_list() : {} { ( member() )+ } /* Production 52 */ void member() : {} { type_spec() declarators() ";" } /* Production 53 */ void union_type() : {} { "union" identifier() "switch" "(" switch_type_spec() ")" "{" switch_body() "}" } /* Production 54 */ void switch_type_spec() : {} { integer_type() | char_type() | boolean_type() | enum_type() | scoped_name() } /* Production 55 */ void switch_body() : {} { ( casex() )+ } /* Production 56 */ void casex() : {} { ( case_label() )+ element_spec() ";" } /* Production 57 */ void case_label() : {} { "case" const_exp() ":" | "default" ":" } /* Production 58 */ void element_spec() : {} { type_spec() declarator() } /* Production 59 */ void enum_type() : {} { "enum" identifier() "{" enumerator() ( "," enumerator() )* "}" } /* Production 60 */ void enumerator() : {} { identifier() } /* Production 61 */ void sequence_type() : {} { "sequence" "<" simple_type_spec() [ "," positive_int_const() ] ">" } /* Production 62 */ void string_type() : {} { "string" [ "<" positive_int_const() ">" ] } /* Production 63 */ void array_declarator() : {} { identifier() ( fixed_array_size() )+ } /* Production 64 */ void fixed_array_size() : {} { "[" positive_int_const() "]" } /* Production 65 */ void attr_dcl() : {} { [ "readonly" ] "attribute" param_type_spec() simple_declarator() ( "," simple_declarator() )* } /* Production 66 */ void except_dcl() : {} { "exception" identifier() "{" ( member() )* "}" } /* Production 67 */ void op_dcl() : {} { [ op_attribute() ] op_type_spec() identifier() parameter_dcls() [ raises_expr() ] [ context_expr() ] } /* Production 68 */ void op_attribute() : {} { "oneway" } /* Production 69 */ void op_type_spec() : {} { param_type_spec() | "void" } /* Production 70 */ void parameter_dcls() : {} { "(" [ param_dcl() ( "," param_dcl() )* ] ")" } /* Production 71 */ void param_dcl() : {} { param_attribute() param_type_spec() simple_declarator() } /* Production 72 */ void param_attribute() : {} { "in" | "out" | "inout" } /* Production 73 */ void raises_expr() : {} { "raises" "(" scoped_name() ( "," scoped_name() )* ")" } /* Production 74 */ void context_expr() : {} { "context" "(" string_literal() ( "," string_literal() )* ")" } /* Production 75 */ void param_type_spec() : {} { base_type_spec() | string_type() | scoped_name() } /* Definitions of complex regular expressions follow */ void identifier() : {} { } void integer_literal() : {} { | | } void string_literal() : {} { } void character_literal() : {} { } void floating_pt_literal() : {} { | } TOKEN : { < ID : ["a"-"z","A"-"Z", "_"] (["a"-"z","A"-"Z","0"-"9","_"])* > | < OCTALINT : "0" (["0"-"7"])* (["u","U","l","L"])? > | < DECIMALINT : ["1"-"9"] (["0"-"9"])* (["u","U","l","L"])? > | < HEXADECIMALINT : ("0x"|"0X") (["0"-"9","a"-"f","A"-"F"])+ (["u","U","l","L"])? > | < FLOATONE : ((["0"-"9"])+ "." (["0"-"9"])* | (["0"-"9"])* "." (["0"-"9"])+) (["e","E"] (["-","+"])? (["0"-"9"])+)? (["f","F","l","L"])? > | < FLOATTWO : (["0"-"9"])+ ["e","E"] (["-","+"])? (["0"-"9"])+ (["f","F","l","L"])? > | < CHARACTER : "'" ( (~["'","\\","\n","\r"]) | ("\\" ( ["n","t","v","b","r","f","a","\\","?","'","\""] | "0" (["0"-"7"])* | ["1"-"9"] (["0"-"9"])* | ("0x" | "0X") (["0"-"9","a"-"f","A"-"F"])+ ) ) ) "'" > | < STRING : "\"" ( ( ~["\"","\\","\n","\r"]) | ("\\" ( ["n","t","v","b","r","f","a","\\","?","'","\""] | "0" (["0"-"7"])* | ["1"-"9"] (["0"-"9"])* | ("0x" | "0X") (["0"-"9","a"-"f","A"-"F"])+ ) ) )* "\"" > }