The Annotated VRML 97 Reference

1 Intro     Concepts     3 Nodes     4 Fields/Events    Conformance
A Grammar     B Java     C JavaScript     D Examples     E Related Info    References
Quick Java         Quick JavaScript         Quick Nodes   
 

  About the Book
  
Help
  Copyright © 1997-99
  Purchase the book from Amazon.com


Appendix A:
Grammar
Definition

A.1 Intro

A.2 General

A.3 Nodes

A.4 Fields

Appendix A VRML Grammar Definition

This appendix provides a detailed definition of grammar rules for VRML syntax. It begins with a brief introduction and follows with specific grammar rules for general syntax, nodes, and field and events.

---------- separator bar ------------
A.1 Introduction

This appendix provides a detailed description of the grammar for each syntactic element in VRML as described in the following sections.It is not possible to parse VRML files using a context-free grammar. Semantic knowledge of the names and types of fields, eventIns, and eventOuts for each node type (either built-in or user-defined using PROTO or EXTERNPROTO) shall be used during parsing so that the parser knows which field type is being parsed.

The '#' (0x23) character begins a comment wherever it appears outside of quoted SFString or MFString fields. The '#' character and all characters until the next line terminator comprise the comment and are treated as whitespace.

The carriage return (0x0d), linefeed (0x0a), space (0x20), tab (0x09), and comma (0x2c) characters are whitespace characters wherever they appear outside of quoted SFString or MFString fields. Any number of whitespace characters and comments may be used to separate the syntactic entities of a VRML file. All reserved keywords are displayed in boldface type.

Chapter 3 "Nodes Reference" contains a description of the allowed fields, eventIns and eventOuts for all pre-defined node types. Some of the basic types that will typically be handled by a lexical analyzer (sffloatValue, sftimeValue, sfint32Value, and sfstringValue) have not been formally specified. Chapter 4 "Fields and Events Reference" contains a more complete description of their syntax.

The following conventions are used in the context-free grammar specified in this appendix:

  • Terminal symbols, which appear literally in the VRML file, are specified in bold.
  • Nonterminal symbols used in the grammar are specified in italic.
  • Production rules begin with a nonterminal symbol and the sequence of characters "::=", and end with a semi-colon (";").
  • Alternation for production rules is specified using the vertical-bar symbol ("|").

---------- separator bar ------------
A.2 General

vrmlScene ::=
statements ;
statements ::=
statement |
statement statements |
empty ;
statement ::=
nodeStatement |
protoStatement |
routeStatement ;
nodeStatement ::=
node |
DEF nodeNameId node |
USE nodeNameId ;
protoStatement ::=
proto |
externproto ;
protoStatements ::=
protoStatement |
protoStatement protoStatements |
empty ;
proto ::=
PROTO nodeTypeId [ interfaceDeclarations ] { protoBody } ;
protoBody ::=
protoStatements node statements ;
interfaceDeclarations ::=
interfaceDeclaration |
interfaceDeclaration interfaceDeclarations |
empty ;
restrictedInterfaceDeclaration ::=
eventIn fieldType eventInId |
eventOut fieldType eventOutId |
field fieldType fieldId fieldValue ;
interfaceDeclaration ::=
restrictedInterfaceDeclaration |
exposedField fieldType fieldId fieldValue ;
externproto ::=
EXTERNPROTO nodeTypeId [ externInterfaceDeclarations ] URLList ;
externInterfaceDeclarations ::=
externInterfaceDeclaration |
externInterfaceDeclaration externInterfaceDeclarations |
empty ;
externInterfaceDeclaration ::=
eventIn fieldType eventInId |
eventOut fieldType eventOutId |
field fieldType fieldId |
exposedField fieldType fieldId ;
routeStatement ::=
ROUTE nodeNameId . eventOutId TO nodeNameId . eventInId ;
URLList ::=
mfstringValue ;
empty ::=
;

---------- separator bar ------------
A.3 Nodes

node ::=
nodeTypeId { nodeBody } |
Script { scriptBody } ;
nodeBody ::=
nodeBodyElement |
nodeBodyElement nodeBody |
empty ;
scriptBody ::=
scriptBodyElement |
scriptBodyElement scriptBody |
empty ;
scriptBodyElement ::=
nodeBodyElement |
restrictedInterfaceDeclaration |
eventIn fieldType eventInId IS eventInId |
eventOut fieldType eventOutId IS eventOutId |
field fieldType fieldId IS fieldId ;
nodeBodyElement ::=
fieldId fieldValue |
fieldId IS fieldId |
eventInId IS eventInId |
eventOutId IS eventOutId |
routeStatement |
protoStatement ;
nodeNameId ::=
Id ;
nodeTypeId ::=
Id ;
fieldId ::=
Id ;
eventInId ::=
Id ;
eventOutId ::=
Id ;
Id ::=
IdFirstChar |
IdFirstChar IdRestChars ;
IdFirstChar ::=
Any ISO-10646 character encoded using UTF-8 except: 0x30-0x39, 0x0-0x20, 0x22, 0x23, 0x27, 0x2b, 0x2c, 0x2d, 0x2e, 0x5b, 0x5c, 0x5d, 0x7b, 0x7d, 0x7f ;
IdRestChars ::=
Any number of ISO-10646 characters except: 0x0-0x20, 0x22, 0x23, 0x27, 0x2c, 0x2e, 0x5b, 0x5c, 0x5d, 0x7b, 0x7d, 0x7f ;

---------- separator bar ------------
A.4 Fields

fieldType ::=
MFColor |
MFFloat |
MFInt32 |
MFNode |
MFRotation |
MFString |
MFTime |
MFVec2f |
MFVec3f |
SFBool |
SFColor |
SFFloat |
SFImage |
SFInt32 |
SFNode |
SFRotation |
SFString |
SFTime |
SFVec2f |
SFVec3f ;
fieldValue ::=
sfboolValue |
sfcolorValue |
sffloatValue |
sfimageValue |
sfint32Value |
sfnodeValue |
sfrotationValue |
sfstringValue |
sftimeValue |
sfvec2fValue |
sfvec3fValue |
mfcolorValue |
mffloatValue |
mfint32Value |
mfnodeValue |
mfrotationValue |
mfstringValue |
mftimeValue |
mfvec2fValue |
mfvec3fValue ;
sfboolValue ::=
TRUE |
FALSE ;
sfcolorValue ::=
float float float ;
sffloatValue ::=
... floating point number in ANSI C floating point format...
sfimageValue ::=
int32 int32 int32 int32 ...
sfint32Value ::=
[[+]|-]{[0-9]+|0x[0-9a-fA-F]+};
sfnodeValue ::=
nodeStatement |
NULL ;
sfrotationValue ::=
float float float float ;
sfstringValue ::=
".*" ... double-quotes must be \", backslashes must be \\...
sftimeValue ::=
... double-precision number in ANSI C floating point format...
mftimeValue ::=
sftimeValue |
[ ] |
[ sftimeValues ] ;
sftimeValues ::=
sftimeValue |
sftimeValue sftimeValues ;
sfvec2fValue ::=
float float ;
sfvec3fValue ::=
float float float ;
mfcolorValue ::=
sfcolorValue |
[ ] |
[ sfcolorValues ] ;
sfcolorValues ::=
sfcolorValue |
sfcolorValue sfcolorValues ;
mffloatValue ::=
sffloatValue |
[ ] |
[ sffloatValues ] ;
sffloatValues ::=
sffloatValue |
sffloatValue sffloatValues ;
mfint32Value ::=
sfint32Value |
[ ] |
[ sfint32Values ] ;
sfint32Values ::=
sfint32Value |
sfint32Value sfint32Values ;
mfnodeValue ::=
nodeStatement |
[ ] |
[ nodeStatements ] ;
nodeStatements ::=
nodeStatement |
nodeStatement nodeStatements ;
mfrotationValue ::=
sfrotationValue |
[ ] |
[ sfrotationValues ] ;
sfrotationValues ::=
sfrotationValue |
sfrotationValue sfrotationValues ;
mfstringValue ::=
sfstringValue |
[ ] |
[ sfstringValues ] ;
sfstringValues ::=
sfstringValue |
sfstringValue sfstringValues ;
mfvec2fValue ::=
sfvec2fValue |
[ ] |
[ sfvec2fValues] ;
sfvec2fValues ::=
sfvec2fValue |
sfvec2fValue sfvec2fValues ;
mfvec3fValue ::=
sfvec3fValue |
[ ] |
[ sfvec3fValues ] ;
sfvec3fValues ::=
sfvec3fValue |
sfvec3fValue sfvec3fValues ;