+visualization :=
+ extension?
+ userSource
+ (sourceVariable | derivedVariable)+
+ graph
+ labelFrame+
+ container?
+ style+
+ layerController?
+
+extension :=
+
+userSource :=
+
+ sourceVariable := extension* (format | stringFormat)?
+derivedVariable := extension* (format | stringFormat valueMapEntry*)?
+
+format := (affix+ | relabel)?
+dateTimeFormat :=
+numberFormat := affix?
+stringFormat := (affix | relabel+)?
+affix :=
+relabel :=
+
+valueMapEntry :=
+
+graph := location+ coordinates faceting facetLayout interval
+
+location :=
+
+coordinates :=
+faceting := cross layer*
+interval := labeling footnotes?
+labeling := (format | formatting | footnotes)*
+formatting := formatMapping*
+formatMapping := format
+footnotes := footnoteMapping+
+footnoteMapping :=
+
+cross := nest+
+nest := variableReference+
+variableReference :=
+
+facetLayout := tableLayout facetLevel+ setCellProperties*
+tableLayout :=
+facetLevel := axis
+
+axis := label? majorTicks
+label := descriptionGroup | text+
+majorTicks := gridline?
+gridline :=
+
+descriptionGroup := description+ text
+description :=
+text := <text>
+paragraph :=
+
+setCellProperties := setMetadata setStyle* setFormat+ union?
+setMetadata :=
+setStyle :=
+setFormat := dateTimeFormat | format | numberFormat | stringFormat+
+
+labelFrame := location+ label paragraph?
+container := extension? location+ labelFrame+
+
+style :=
+
+layer :=
+layerController :=
+
+union := intersect+
+intersect := intersectWhere | where+
+intersectWhere :=
+where :=