The Virtual Reality Modeling Language
Annex A. Grammar Definition
(normative)
ISO/IEC DIS 14772-1
4 April 1997
This annex provides a detailed description of the grammar for each
syntactic element in VRML as described in the following subclauses. The
following table of contents lists the topics in this clause:
A.1 Table of contents and introduction
A.1.1
Table of contents
A.1.2
Introduction
A.2 General
A.3 Nodes
A.4 Fields
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.
Clause "6. 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. Clause "5.
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 clause:
-
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 ("|").
-
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 ::=
-
;
-
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 ;
-
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 ;
http://www.vrml.org/Specifications/VRML97/DIS/part1/grammar.html