BNF for VRML97FieldParser.jj

TOKENS

//---------------------------------------------------------------------------
//  TOKENS declaration
//---------------------------------------------------------------------------
<DEFAULT> TOKEN : {
<NUMBER_LITERAL: ("-")? (".")? ["0"-"9"] (["0"-"9","a"-"f","A"-"F","x",".","+","-"])*>
| <STRING_LITERAL: "\"" (~["\"","\\"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\"">
}

   
<DEFAULT> TOKEN : {
<LBRACKET: "[">
| <RBRACKET: "]">
}

   
<DEFAULT> TOKEN : {
<TRUE: "TRUE">
| <FALSE: "FALSE">
}

   
<*> SKIP : {
" "
| "\t"
| "\n"
| "\r"
| "\f"
| ","
}

   
<*> SPECIAL : {
<COMMENT: "#" (~["\n","\r"])* ("\n" | "\r" | "\r\n")>
}

   

NON-TERMINALS

/**
 * This does not use the other methods to do the field parsing. Instead, it
 * goes on the raw values that are presented and returns objects to represent
 * that. We look for either single values or multiple values. For any of these
 * we return a representative object. The return value could be one of these:
 * 
    *
  • Boolean *
  • Integer *
  • Float *
  • String *
  • boolean[] *
  • int[] *
  • float[] *
  • String[] *
* * @param useInt A hint to use if this is a number field we are parsing to * decide whether to parse number strings as an int or float for type * checking. If expecting any other sort of field, has no effect. */
parseUnknownField ::= ( <TRUE> | <FALSE> | <NUMBER_LITERAL> | <STRING_LITERAL> | ( <LBRACKET> )? ( ( <TRUE> | <FALSE> )+ | ( <NUMBER_LITERAL> )+ | ( <STRING_LITERAL> )+ ) ( <RBRACKET> )? ( <EOF> )? )
/**
 * Parse an SFInt value. If there is more than one int value in the string it
 * will be ignored.
 */
SFInt32 ::= <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFInt32 value.
 * 
 * MFInt32 ::=
 *   "[" NUMBER_LITERAL* "]" |
 *   NUMBER_LITERAL*
 * 
*/
MFInt32 ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> )* ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFFloat value. If there is more than one float value in the string
 * it will be ignored.
 */
SFFloat ::= <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFFloat value.
 * 
 * MFInt32 ::=
 *   "[" NUMBER_LITERAL* "]" |
 *   NUMBER_LITERAL*
 * 
*/
MFFloat ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> )* ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFBool value. If there is more than one boolean value in the string
 * it will be ignored.
 */
SFBool ::= ( <TRUE> | <FALSE> ) ( <EOF> )?
/**
 * Parse an MFBool value.
 * 
 * MFBool ::=
 *   "[" ("TRUE" | "FALSE")* "]" |
 *   ("TRUE" | "FALSE")*
 * 
*/
MFBool ::= ( <LBRACKET> )? ( <TRUE> | <FALSE> )* ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFString value. We really shouldn't need this, but it is here for
 * completeness.
 */
SFString ::= <STRING_LITERAL> ( <EOF> )?
/**
 * Parse an MFString value.
 * 
 * MFString ::=
 *   "[" ( STRING_LITERAL)* "]" |
 *   (STRING_LITERAL)*
 * 
*/
MFString ::= ( <LBRACKET> )? ( <STRING_LITERAL> )* ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFVec2f value. If there is more than one float value in the string
 * it will be ignored.
 */
SFVec2f ::= <NUMBER_LITERAL> <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFVec2f value.
 * 
 * MFVec2f ::=
 *   "[" (NUMBER_LITERAL NUMBER_LITERAL)* "]" |
 *   (NUMBER_LITERAL NUMBER_LITERAL)*
 * 
*/
MFVec2f ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> <NUMBER_LITERAL> )+ ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFVec3f value. If there is more than one float value in the string
 * it will be ignored.
 */
SFVec3f ::= <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFVec3f value.
 * 
 * MFVec3f ::=
 *   "[" (NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL)* "]" |
 *   (NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL)*
 * 
*/
MFVec3f ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> )+ ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFRotation value. If there is more than one float value in the string
 * it will be ignored.
 */
SFRotation ::= <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFRotation value.
 * 
 * MFRotation ::=
 *   "[" (NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL)* "]" |
 *   (NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL)*
 * 
*/
MFRotation ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> )+ ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFTime value. If there is more than one float value in the string
 * it will be ignored.
 */
SFTime ::= <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFTime value. In VRML97 MFTime are not legal field types. However,
 * we provide it here for completeness and that it might be used by VRML 3.0.
 * 
 * MFTime ::=
 *   "[" NUMBER_LITERAL* "]" |
 *   NUMBER_LITERAL*
 * 
*/
MFTime ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> )* ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFColor value. If there is more than one float value in the string
 * it will be ignored.
 */
SFColor ::= <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> ( <EOF> )?
/**
 * Parse an MFColor value. The color differs from the float value by being
 * clamped between 0 and 1.
 * 
 * MFColor ::=
 *   "[" (NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL)* "]" |
 *   (NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL)*
 * 
*/
MFColor ::= ( <LBRACKET> )? ( <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> )+ ( <RBRACKET> )? ( <EOF> )?
/**
 * Parse an SFImage value.
 * 
 * SFImage ::=
 *   NUMBER_LITERAL NUMBER_LITERAL NUMBER_LITERAL (NUMBER_LITERAL)*
 * 
*/
SFImage ::= <NUMBER_LITERAL> <NUMBER_LITERAL> <NUMBER_LITERAL> ( <NUMBER_LITERAL> )* ( <EOF> )?