/******************************************************************* * * contents: STEP Part 21 - clear text encoding parser * to be used with JavaCC * * * history : * -------- * 18 Aug 1999: Creation. Singva Ma . * ******************************************************************/ options { LOOKAHEAD = 3; STATIC = false; } PARSER_BEGIN(ClearTextReader) import java.io.*; import java.util.*; public class ClearTextReader{ public static void main(String args[]) { ClearTextReader parser; if (args.length == 0) { System.out.println("ClearTextReader: Reading from standard input . . ."); parser = new ClearTextReader(System.in); } else if (args.length == 1) { System.out.println("ClearTextReader: Reading from file " + args[0] + " . . ."); try { parser = new ClearTextReader(new java.io.FileInputStream(args[0])); } catch (java.io.FileNotFoundException e) { System.out.println("Express Parser: File " + args[0] + " not found."); return; } } else { System.out.println("ClearTextReader: Usage is one of:"); System.out.println(" java ClearTextReader < inputfile"); System.out.println("OR"); System.out.println(" java ClearTextReader inputfile"); return; } try { parser.syntax(); System.out.println("ClearTextReader: source parsed successfully."); } catch (ParseException e) { System.out.println(e.getMessage()); System.out.println("ClearTextReader: Encountered errors during parse."); } } // end main } // end class ClearTextReader PARSER_END(ClearTextReader) /************************************************ ************************************************* ** Tokens ************************************************* ************************************************/ SKIP : /* WHITE SPACE */ { " " | "\t" | "\n" | "\r" | "\f" } SPECIAL_TOKEN : /* COMMENTS */ { } TOKEN : { < LPAREN: "(" > | < RPAREN: ")" > | < LBRACE: "{" > | < RBRACE: "}" > | < LBRACKET: "[" > | < RBRACKET: "]" > | < SEMICOLON: ";" > | < COLON: ":" > | < COMMA: "," > | < DOT: "." > | < EQ: "=" > | < DOLLAR: "$" > | < STAR: "*"> | < SLASH: "/"> } TOKEN : { )? ()*> | | > | ( | )*> | ( | )*> | <#SIGN: ["+", "-"]> | )? ()* ()* ("E" ()? ()* )?> | | | " " | | > | | | | )* "'"> | ()*> | ( | )* > | <#HEX: ["0"-"9", "A"-"F"]> | )* "\""> } TOKEN : { <#DIGIT: ["0"-"9"]> | <#LOWER: ["a"-"z"]> | <#UPPER: ["A"-"Z", "_"]> | | | "%" | "&" | | "#" | "+" | | "-" | | | "?" | | | | "<" | | ">" | "@" | | | | "|" | | "^" | "`"> | | | | | | | | > } TOKEN : { | | | | > | "S" > | "P" > | "X2" ()* > | "X4" ()* > | "X0" > | "X" > | > | > | > } /************************************************ * Grammar ***********************************************/ void exchange_file() : {} { "ISO-10303-21;" header_section() data_section() "END-ISO-10303-21" } void header_section() : {} { "HEADER;" header_entity() header_entity() header_entity() [header_entity_list()] "ENDSEC;" } void header_entity_list() : {} { header_entity() (header_entity())* } void header_entity() : {} { [parameter_list()] } void parameter_list() : {} { parameter() ( parameter())* } void parameter() : {} { typed_parameter() | untyped_parameter() | omitted_parameter() } void typed_parameter() : {} { parameter() } void untyped_parameter() : {} { | | | | | | | list() } void omitted_parameter() : {} { } void list() : {} { parameter() ( parameter())* } void data_section() : {} { "DATA;" entity_instance_list() "ENDSEC;" } void entity_instance_list() : {} { entity_instance() (entity_instance())* } void entity_instance() : {} { simple_entity_instance() | complex_entity_instance() } void simple_entity_instance() : {} { [scope()] simple_record() } void complex_entity_instance() : { Token t; } { [scope()] subsuper_record() } void scope() : {} { "&SCOPE" entity_instance_list() "ENDSCOPE" [export_list()] } void export_list() : {} { ( )* } void simple_record() : {} { [ parameter_list() ] } void subsuper_record() : {} { simple_record_list() } void simple_record_list() : {} { simple_record() (simple_record())* } void syntax() : {} { exchange_file() }