<!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>