<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>BNF for X3DRelaxedParser.jj</TITLE>
</HEAD>
<BODY>
<H1 ALIGN=CENTER>BNF for X3DRelaxedParser.jj</H1>
<H2 ALIGN=CENTER>TOKENS</H2>
<TABLE>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
//---------------------------------------------------------------------------
//  TOKENS declaration
//---------------------------------------------------------------------------
</PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<*> SKIP : {
" "
| "\t"
| "\n"
| "\r"
| "\f"
| ","
}

   </PRE>
  </TD>
 </TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/* COMMENTS */</PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<DEFAULT> SPECIAL : {
<SINGLE_LINE_COMMENT: "#" ~["/"] (~["\n","\r"])* ("\n" | "\r" | "\r\n")> : DEFAULT
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<DEFAULT> MORE : {
"#/*" : IN_MULTI_LINE_COMMENT
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<IN_MULTI_LINE_COMMENT> SPECIAL : {
<MULTI_LINE_COMMENT: "*/#"> : DEFAULT
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<IN_MULTI_LINE_COMMENT> MORE : {
<~[]>
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<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"]))* "\"">
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<DEFAULT> TOKEN : {
<LBRACE: "{">
| <RBRACE: "}">
| <LBRACKET: "[">
| <RBRACKET: "]">
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<DEFAULT> TOKEN : {
<DEF: "DEF">
| <USE: "USE">
| <NULL: "NULL">
| <META: "META">
| <PROTO: "PROTO">
| <INPUT_ONLY: "inputOnly">
| <OUTPUT_ONLY: "outputOnly">
| <INITIALIZE_ONLY: "initializeOnly">
| <INPUT_OUTPUT: "inputOutput">
| <EXTERNPROTO: "EXTERNPROTO">
| <ROUTE: "ROUTE">
| <TO: "TO">
| <IS: "IS">
| <DOT: ".">
| <PROFILE: "PROFILE">
| <COMPONENT: "COMPONENT">
| <EXPORT: "EXPORT">
| <IMPORT: "IMPORT">
| <AS: "AS">
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<DEFAULT> TOKEN : {
<SCRIPT: "Script">
| <TRUE: "TRUE">
| <FALSE: "FALSE">
}

   </PRE>
  </TD>
 </TR>
 <!-- Token -->
 <TR>
  <TD>
   <PRE>
<DEFAULT> TOKEN : {
<ID: <ID_FIRST> (<ID_REST>)*> : DEFAULT
| <#ID_FIRST: ["!","$"-"&","("-"*","/",":"-"Z","^"-"z","\u0080"-"\ufaff"]>
| <#ID_REST: ["!","$"-"&","("-"+","-","/"-"Z","^"-"z","|","~","\u0080"-"\ufaff"]>
}

   </PRE>
  </TD>
 </TR>
</TABLE>
<H2 ALIGN=CENTER>NON-TERMINALS</H2>
<TABLE>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
// Grammar follows the structure in the ISO spec, except that TOKENS are
// at the bottom. Where we have a rule of the form
// statements ::= statement | statement statements
// this is translated to a single (statement())* expression.
// The empty declaration is handled implicitly by JavaCC

//---------------------------------------------------------------------------
//  Grammar from A.2 General
//---------------------------------------------------------------------------

/**
 * Rule 0 - Parse the complete scene.
 * <pre>
 * vrmlScene ::=
 *     header |
 *     header statement *
 * </pre>
 * The scene assumes that the caller will make the startDocument() and
 * endDocument() calls on the ContentHandler before and after this method.
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod1">Scene</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod2">Header</A> ) ( <A HREF="#prod3">Statement</A> )* <EOF></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 1 - parse a header item.
 * <pre>
 *  header ::=
 *    profileDecl componentDecls
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod2">Header</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod4">ProfileDecl</A> ) ( <A HREF="#prod5">ComponentDecl</A> )* ( <A HREF="#prod6">MetaDecl</A> )*</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 2 - Parse a profile name declaration
 * <pre>
 *  profileDecl ::=
 *    PROFILE profileName |
 *    empty;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod4">ProfileDecl</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><PROFILE> <A HREF="#prod7">Id</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 3 - Parse a component name declaration
 * <pre>
 *  componentDecl ::=
 *    COMPONENT componentName |
 *    COMPONENT componentName ":" integer |
 *    empty;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod5">ComponentDecl</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><COMPONENT> <A HREF="#prod7">Id</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 4 - Parse a component name declaration
 * <pre>
 *  componentDecl ::=
 *    META "key string" "value string"
 *    empty;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod6">MetaDecl</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><META> <STRING_LITERAL> <STRING_LITERAL></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 5 - Parse a statement.
 * <pre>
 * statement ::=
 *     nodeStatement |
 *     protoStatement |
 *     routeStatement |
 *     importStatement |
 *     exportStatement ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod3">Statement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod8">NodeStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod9">ProtoStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod10">RouteStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod11">ImportStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod12">ExportStatement</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 6 - Parse a proto body statement.
 * <pre>
 * protoBodyStatement ::=
 *     nodeStatement |
 *     protoStatement |
 *     routeStatement |
 *     importStatement ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod13">ProtoBodyStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod8">NodeStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod9">ProtoStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod10">RouteStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod11">ImportStatement</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><EXPORT></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 7 - Parse a node statement.
 * <pre>
 * nodeStatement ::=
 *     node |
 *     DEF NodeNameId node |
 *     USE NodeNameId ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod8">NodeStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod14">Node</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><DEF> <A HREF="#prod15">NodeNameId</A> <A HREF="#prod14">Node</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><USE> <A HREF="#prod15">NodeNameId</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 8 - Parse a node statement.
 * <pre>
 * rootNodeStatement ::=
 *      node |
 *      DEF NodeNameId node ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod16">RootNodeStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod14">Node</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><DEF> <A HREF="#prod15">NodeNameId</A> <A HREF="#prod14">Node</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 9 - Parse a node statement.
 * <pre>
 * protoStatement ::=
 *      proto |
 *      externproto ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod9">ProtoStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod17">Proto</A></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod18">ExternProto</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 10 - Parse a PROTO declaration.
 * <pre>
 * proto ::=
 *      PROTO NodeTypeId [ interfaceDeclaration* ] { protoBody } ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod17">Proto</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><PROTO> <A HREF="#prod19">NodeTypeId</A> <LBRACKET> ( <A HREF="#prod20">InterfaceDecl</A> )* <RBRACKET> <LBRACE> <A HREF="#prod21">ProtoBody</A> <RBRACE></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 11 - Parse a node statement.
 * <pre>
 * protoBody ::=
 *      protoStatement* rootNodeStatement statement* ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod21">ProtoBody</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod9">ProtoStatement</A> )* <A HREF="#prod16">RootNodeStatement</A> ( <A HREF="#prod13">ProtoBodyStatement</A> )*</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 12 - Parse an interface declaration that allows everything except
 * exposedFields.
 * <pre>
 * restrictedInterfaceDeclaration ::=
 *      eventIn fieldNameId eventId |
 *      eventOut fieldNameId eventId |
 *      field fieldNameId eventId fieldValue ;
 * </pre>
 *  Unfortunately we also need some context information here to know if we are in
 *  A script or a proto to know which handler to call.
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod22">RestrictedInterfaceDecl</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <INPUT_ONLY> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> | <OUTPUT_ONLY> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> | <INITIALIZE_ONLY> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> <A HREF="#prod25">FieldValue</A> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 13 - Parse a single field interface declaration.
 * <pre>
 * interfaceDeclaration ::=
 *      restrictedInterfaceDeclaration |
 *      exposedField fieldNameId eventId fieldValue ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod20">InterfaceDecl</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod22">RestrictedInterfaceDecl</A> | <INPUT_OUTPUT> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> <A HREF="#prod25">FieldValue</A> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 14 - Parse a node statement.
 * <pre>
 * externproto ::=
 *      EXTERNPROTO NodeTypeId [ externInterfaceDeclaration* ] URLList ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod18">ExternProto</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><EXTERNPROTO> <A HREF="#prod19">NodeTypeId</A> <LBRACKET> ( <A HREF="#prod26">ExternInterfaceDecl</A> )* <RBRACKET> <A HREF="#prod27">URIList</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 15 - Parse a node statement.
 * <pre>
 * externInterfaceDeclaration ::=
 *      accessType fieldNameId eventId
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod26">ExternInterfaceDecl</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod28">AccessType</A> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 16 - Parse a node statement.
 * <pre>
 * routeStatement ::=
 *      ROUTE NodeNameId . eventOutId TO NodeNameId . eventInId ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod10">RouteStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><ROUTE> <A HREF="#prod15">NodeNameId</A> <DOT> <A HREF="#prod24">FieldNameId</A> <TO> <A HREF="#prod15">NodeNameId</A> <DOT> <A HREF="#prod24">FieldNameId</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 17 - Parse an IMPORT statement.
 * <pre>
 * ImportStatement ::=
 *    "IMPORT" NodeNameId '.' NodeNameId |
 *    "IMPORT" NodeNameId '.' NodeNameId "AS" NodeNameId
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod11">ImportStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><IMPORT> <A HREF="#prod15">NodeNameId</A> <DOT> <A HREF="#prod15">NodeNameId</A> ( <AS> <A HREF="#prod15">NodeNameId</A> )+</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 18 - Parse an EXPORT statement.
 * <pre>
 * ImportStatement ::=
 *    "EXPORT" NodeNameId |
 *    "EXPORT" NodeNameId "AS" NodeNameId
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod12">ExportStatement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><EXPORT> <A HREF="#prod15">NodeNameId</A> ( <AS> <A HREF="#prod15">NodeNameId</A> )?</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 19 - Parse an MFField statement - principally a URIList on the
 * EXTERNPROTO.
 * <pre>
 * URLList ::=
 *    "[" STRING_LITERAL* "]" |
 *    STRING_LITERAL ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod27">URIList</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><LBRACKET> ( <STRING_LITERAL> )* <RBRACKET></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><STRING_LITERAL></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
//---------------------------------------------------------------------------
//  A.3 Node declarations
//---------------------------------------------------------------------------

/**
 * Rule 20 - Parse a node statement.
 * <pre>
 * node ::=
 *      nodeTypeId { nodeBody } |
 *      "Script" { scriptBody } ;
 *  We also handle the empty cases for both body and script here
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod14">Node</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod7">Id</A> <LBRACE> ( <A HREF="#prod29">NodeBody</A> )? <RBRACE> | <SCRIPT> <LBRACE> ( <A HREF="#prod30">ScriptBody</A> )? <RBRACE> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 21 - Parse a node statement.
 * <pre>
 * nodeBody ::=
 *      nodeBodyElement |
 *      nodeBodyElement nodeBody
 * </pre>
 *  The empty case is handled in the Node declaration
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod29">NodeBody</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod31">NodeBodyElement</A> )+</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 22 - Parse a node statement.
 * <pre>
 * nodeBodyElement ::=
 *      fieldNameId fieldValue |
 *      fieldNameId IS fieldNameId |
 *      routeStatement |
 *      protoStatement ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod31">NodeBodyElement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod24">FieldNameId</A> <A HREF="#prod25">FieldValue</A> | <A HREF="#prod24">FieldNameId</A> <IS> <A HREF="#prod24">FieldNameId</A> | <A HREF="#prod10">RouteStatement</A> | <A HREF="#prod9">ProtoStatement</A> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 23 - Parse a node statement.
 * <pre>
 * scriptBody ::=
 *      scriptBodyElement |
 *      scriptBodyElement scriptBody
 * </pre>
 * The empty case is handled in the Node declaration
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod30">ScriptBody</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod32">ScriptBodyElement</A> )+</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 24 - Parse a node statement.
 * <pre>
 * scriptBodyElement ::=
 *      nodeBodyElement |
 *      interfaceDeclaration |
 *      inputOnly fieldType eventInId IS eventInId |
 *      outputOnly fieldType eventInId IS eventInId |
 *      inputOutput fieldType eventOutId IS eventOutId |
 *      initializeOnly fieldType fieldNameId IS fieldNameId ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod32">ScriptBodyElement</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod31">NodeBodyElement</A> | <INPUT_ONLY> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> ( <IS> <A HREF="#prod24">FieldNameId</A> )? | <OUTPUT_ONLY> <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> ( <IS> <A HREF="#prod24">FieldNameId</A> )? | ( <INITIALIZE_ONLY> | <INPUT_OUTPUT> ) <A HREF="#prod23">FieldId</A> <A HREF="#prod24">FieldNameId</A> ( <IS> <A HREF="#prod24">FieldNameId</A> | <A HREF="#prod25">FieldValue</A> ) )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 24 - Parse a node statement.
 * <pre>
 * nodeNameId ::= Id ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod15">NodeNameId</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod7">Id</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 25 - Parse a NodeType identifier.
 * <pre>
 * nodeTypeId ::= Id ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod19">NodeTypeId</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod7">Id</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 26 - Parse a field name string.
 * <pre>
 * fieldNameId ::= Id ;
 * eventInId ::= Id ;
 * eventOutId ::= Id ;
 * exposedFieldId ::= Id ;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod24">FieldNameId</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod7">Id</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 27 - Turn a string into the {@link org.web3d.vrml.lang.FieldConstants}
 * value.
 * <pre>
 *    "field" = FieldConstants.FIELD;
 *    "eventIn" = FieldConstants.EVENTIN;
 *    "eventOut" = FieldConstants.EVENTOUT;
 *    "exposedField" = FieldConstants.EXPOSEDFIELD;
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod28">AccessType</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><INITIALIZE_ONLY></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><INPUT_ONLY></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><OUTPUT_ONLY></TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>|</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><INPUT_OUTPUT></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 28 - Parse a field identifier.
 * <pre>
 *   Id
 * </pre>
 *  Concatention of fieldType that we really only care about the ID if the
 *  user wants to provided expanded types.
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod23">FieldId</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><A HREF="#prod7">Id</A></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 29 - Parse a field value statement.
 * <pre>
 *  The value of a field. Just a literral string to pass back to the caller
 *  FieldValue :: =
 *     SingleFieldValue |
 *     MultiFieldValue
 * </pre>
 *
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod25">FieldValue</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod33">SingleFieldValue</A> | <A HREF="#prod34">MultiFieldValue</A> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 30 - Parse a single value of a field statement.
 * <pre>
 * SingleFieldValue ::=
 *     NodeStatement |         # SFNode
 *     "NULL" |                # empty SFNode or empty MFNode
 *     LiteralValue
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod33">SingleFieldValue</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod8">NodeStatement</A> | <NULL> | <A HREF="#prod35">LiteralValue</A> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 31 - Parse a multi value field statement.
 * <pre>
 * MultiFieldValue ::=
 *     "["(NodeStatment)+ "]" | # MFNode
 *     "[ (SingleFieldvalue)* ]
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod34">MultiFieldValue</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><LBRACKET> ( ( <A HREF="#prod8">NodeStatement</A> )+ | <A HREF="#prod36">NumberArray</A> | <A HREF="#prod37">BooleanArray</A> | <A HREF="#prod38">StringArray</A> ) <RBRACKET></TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 32 - Parse a literal value for a single field value.
 * <pre>
 * LiteralValue ::=
 *    TRUE |
 *    FALSE |
 *    NumberArray |
 *    STRING_LITERAL
 * </pre>
 * We do allow a full number array here - ie more than the max 4 values that
 * an SFRotation contains. This makes our parsing faster, but less correct.
 * Basically we assume the callback will deal with any extra numbers if they
 * want to by either discarding them or throwing an error.
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod35">LiteralValue</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <TRUE> | <FALSE> | <A HREF="#prod39">FixedNumberArray</A> | <STRING_LITERAL> )</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 33 - Parse an array of string literals.
 * <pre>
 * StringArray ::=
 *   STRING_LITERAL+
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod38">StringArray</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <STRING_LITERAL> )*</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 34 - Parse a number that may contain multiple whitespace values - such
 * as an SFVec3f.
 * <pre>
 * NumberArray ::=
 *    NUMBER_LITERAL+
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod36">NumberArray</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <NUMBER_LITERAL> )+</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 29 - Parse a number that may contain multiple whitespace values - such
 * as an SFVec3f.
 * <pre>
 * NumberArray ::=
 *    NUMBER_LITERAL+
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod39">FixedNumberArray</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <NUMBER_LITERAL> )+</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
/**
 * Rule 35 - Parse a MFBool array
 * <pre>
 * NumberArray ::=
 *    (TRUE | FALSE)+
 * </pre>
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod37">BooleanArray</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE>( <TRUE> | <FALSE> )+</TD>
</TR>
 <!-- Special token -->
 <TR>
  <TD>
<PRE>
//---------------------------------------------------------------------------
//  Miscellaneous methods to use
//---------------------------------------------------------------------------

/**
 * Generate an identifier as a string from the parsed token.
 */</PRE>
  </TD>
 </TR>
<TR>
<TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod7">Id</A></TD>
<TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
<TD ALIGN=LEFT VALIGN=BASELINE><ID></TD>
</TR>
</TABLE>
</BODY>
</HTML>