The Virtual Reality Modeling Language

Annex A. Grammar Definition

(normative)

ISO/IEC DIS 14772-1

4 April 1997

A.1 Table of contents and introduction

A.1.1 Table of contents

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

A.1.2 Introduction

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:

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 ::=
;

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 ;

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 ;

http://www.vrml.org/Specifications/VRML97/DIS/part1/grammar.html