<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=iso-8859-1"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:786774776;
        mso-list-type:hybrid;
        mso-list-template-ids:64383556 1177614818 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:5;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1
        {mso-list-id:875778460;
        mso-list-type:hybrid;
        mso-list-template-ids:1216096498 1013894688 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
        {mso-level-start-at:5;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l2
        {mso-list-id:1107391115;
        mso-list-type:hybrid;
        mso-list-template-ids:231758818 67698713 -1 -1 -1 -1 -1 -1 -1 -1;}
@list l2:level1
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l2:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l2:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l2:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l2:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l2:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l2:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l2:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l3
        {mso-list-id:1179001029;
        mso-list-type:hybrid;
        mso-list-template-ids:-1244779816 67698703 -1 -1 -1 -1 -1 -1 -1 -1;}
@list l3:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l3:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l3:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l3:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l3:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l3:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l3:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l3:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l4
        {mso-list-id:1346901627;
        mso-list-type:hybrid;
        mso-list-template-ids:812680068 1097618794 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l4:level1
        {mso-level-start-at:7;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l4:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l4:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l4:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l4:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l4:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l4:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l4:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l4:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l5
        {mso-list-id:1460146848;
        mso-list-type:hybrid;
        mso-list-template-ids:-1272382480 67698713 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l5:level1
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l5:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l5:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l5:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l5:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l5:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l5:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l5:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l5:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l6
        {mso-list-id:1997759205;
        mso-list-type:hybrid;
        mso-list-template-ids:1202516054 -1505335562 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l6:level1
        {mso-level-start-at:7;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l6:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l6:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l6:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l6:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l6:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l6:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l6:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l6:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoPlainText>Patrick, thanks for these important insights.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Am looking closely and tracing the grammar.  As you know, such grammars are very important because they formally and unambiguously describe what is allowed.  Also pretty tricky to follow!<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='mso-list:l1 level1 lfo7'>Extensible 3D (X3D) encodings, Part 2: Classic VRML encoding Annex A (normative), Grammar<o:p></o:p></li><li class=MsoPlainText style='mso-list:l1 level1 lfo7'>https://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/grammar.html<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Am finding following excerpts of interest.  Hopefully addition of color-coding helps:<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'><o:p> </o:p></p><ol style='margin-top:0in' start=1 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><b><span style='color:#548235;mso-style-textfill-fill-color:#548235;mso-style-textfill-fill-alpha:100.0%'>node </span></b>::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  nodeTypeId { <b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'>nodeBody</span></b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'> </span>} |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  Script { scriptBody } |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  ComposedShader {composedShaderBody} |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  PackagedShader {packagedShaderBody} |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  ShaderProgram {shaderProgramBody} ;<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'> <o:p></o:p></p><ol style='margin-top:0in' start=2 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'>nodeBody </span></b>::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:red'>nodeBodyElement</span></b> |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:red'>nodeBodyElement</span></b> <b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'>nodeBody</span></b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'> </span>|<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  empty ;<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'><o:p> </o:p></p><ol style='margin-top:0in' start=3 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><span style='background:aqua;mso-highlight:aqua'>mfnodeValue</span> ::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>   <b><span style='color:#FF33CC'>nodeStatement </span></b>|<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>   [ ] |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>   [ <span style='background:fuchsia;mso-highlight:fuchsia'>nodeStatements</span> ] ;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=4 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><span style='background:fuchsia;mso-highlight:fuchsia'>nodeStatements</span> ::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:#FF33CC'>nodeStatement</span></b> |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:#FF33CC'>nodeStatement</span></b> <span style='background:fuchsia;mso-highlight:fuchsia'>nodeStatements</span> ;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=5 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><b><span style='color:#FF33CC'>nodeStatement</span></b>::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:#548235;mso-style-textfill-fill-color:#548235;mso-style-textfill-fill-alpha:100.0%'>node</span></b><span style='color:#548235;mso-style-textfill-fill-color:#548235;mso-style-textfill-fill-alpha:100.0%'> </span>|<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  DEF nodeNameId <b><span style='color:#548235;mso-style-textfill-fill-color:#548235;mso-style-textfill-fill-alpha:100.0%'>node</span></b><span style='color:#548235;mso-style-textfill-fill-color:#548235;mso-style-textfill-fill-alpha:100.0%'> </span>|<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  USE nodeNameId ;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=6 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><b><span style='color:red'>nodeBodyElement </span></b>::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  initializeOnlyId fieldValue |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  inputOutputId fieldValue |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  initializeOnlyId IS initializeOnlyId |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  inputOnlyId IS inputOnlyId |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  outputOnlyId IS outputOnlyId |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  inputOutputId IS inputOutputId |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  <span style='background:yellow;mso-highlight:yellow'>routeStatement</span> |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  protoStatement ;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=7 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><span style='background:yellow;mso-highlight:yellow'>routeStatement</span> ::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  <b>ROUTE</b> nodeNameId . outputOnlyId TO nodeNameId . inputOnlyId ;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=8 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'><i>statement</i> ::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:#FF33CC'>nodeStatement</span></b> |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  importStatement |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  exportStatement |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  protoStatement |<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  <span style='background:yellow;mso-highlight:yellow'>routeStatement</span> ;<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=9 type=a><li class=MsoPlainText style='mso-list:l5 level1 lfo1'>sfnodeValue ::=<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'>  <b><span style='color:#FF33CC'>nodeStatement </span></b>|<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'>  NULL ;<o:p></o:p></p><p class=MsoPlainText style='margin-left:.5in'><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>So it looks like there are several chains of interest as follows:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=1 type=1><li class=MsoPlainText style='mso-list:l3 level1 lfo5'><span style='background:aqua;mso-highlight:aqua'>mfnodeValue</span> > <span style='background:fuchsia;mso-highlight:fuchsia'>nodeStatements</span> > <b><span style='color:#FF33CC'>nodeStatement</span></b> > <b><span style='color:#548235;mso-style-textfill-fill-color:#548235;mso-style-textfill-fill-alpha:100.0%'>node </span></b>> nodeTypeId {<b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'> nodeBody</span></b><span style='color:#C55A11;mso-style-textfill-fill-color:#C55A11;mso-style-textfill-fill-alpha:100.0%'> </span>} > <b><span style='color:red'>nodeBodyElement</span></b> > <span style='background:yellow;mso-highlight:yellow'>routeStatement</span> > <b>ROUTE</b><o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.5in'><o:p> </o:p></p><ol style='margin-top:0in' start=2 type=1><li class=MsoPlainText style='mso-list:l3 level1 lfo5'>sfnodeValue > <b><span style='color:#FF33CC'>nodeStatement </span>> </b>(etc. as shown immediately above in chain 1)<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.25in'><o:p> </o:p></p><ol style='margin-top:0in' start=3 type=1><li class=MsoPlainText style='mso-list:l3 level1 lfo5'><i>statement</i> > <span style='background:yellow;mso-highlight:yellow'>routeStatement</span> > <b>ROUTE</b><o:p></o:p></li></ol><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>From these three chains in ClassicVRML grammar, it appears logical to conclude that <b>ROUTE</b> is allowed to appear wherever an MFNode, SFNode or statement is allowed to appear.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>That would be a consistent match with the parent-child relationships defined in X3D XML Schema and DTD.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Hopefully I have the chain of logic correct here.  All scrutiny and review is welcome, we definitely need to get this right.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>If there is any unintended omission in the Backus-Naur logic here, then great!  We can agree now on corrections, and fix any issues in this year’s expected update of the ClassicVRML encoding from X3D3 to X3D4.  Correction of converters can also proceed immediately upon achieving consensus.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='mso-list:l0 level1 lfo6'>Wikipedia:  Backus-Naur form<o:p></o:p></li><li class=MsoPlainText style='mso-list:l0 level1 lfo6'>https://en.wikipedia.org/wiki/Backus-Naur_form<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Again thanks for careful strictness, careful checking of model content is one of our greatest strengths.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Have fun with ClassicVRML X3D!  8)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>all the best, Don<o:p></o:p></p><p class=MsoPlainText>-- <o:p></o:p></p><p class=MsoPlainText>Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman@nps.edu<o:p></o:p></p><p class=MsoPlainText>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149<o:p></o:p></p><p class=MsoPlainText>X3D graphics, virtual worlds, Navy robotics https:// faculty.nps.edu/brutzman<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>-----Original Message-----<br>From: x3d-public <x3d-public-bounces@web3d.org> On Behalf Of Patrick Dähne<br>Sent: Thursday, January 5, 2023 3:05 AM<br>To: Joseph D Williams <joedwil@earthlink.net><br>Cc: X3D Public Mailing List (x3d-public@web3d.org) <x3d-public@web3d.org><br>Subject: Re: [x3d-public] [...] HAnim2 X3D4 BoxMan update</p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>> Am 05.01.2023 um 03:33 schrieb Joseph D Williams <<a href="mailto:joedwil@earthlink.net"><span style='color:windowtext;text-decoration:none'>joedwil@earthlink.net</span></a>>:<o:p></o:p></p><p class=MsoPlainText>> <o:p></o:p></p><p class=MsoPlainText>>             • Classic VRML does not allow to declare ROUTEs inside MFNode fields. Move them outside.<o:p></o:p></p><p class=MsoPlainText>>  <o:p></o:p></p><p class=MsoPlainText>> There may be other x3d Statements and some rules, but I don’t see any spec language for what you describe regarding ROUTE.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The (only) relevant part of the „Classic VRML encoding“ spec is „Annex A: Grammar“:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><a href="https://www.web3d.org/documents/specifications/19776-2/V3.3/index.html"><span style='color:windowtext;text-decoration:none'>https://www.web3d.org/documents/specifications/19776-2/V3.3/index.html</span></a><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The grammar is written in Backus-Naur form. It is the „Scheme“ of classic encoding. Have a look at the rule „mfnodeValue“. You won’t find the symbol „routeStatement“ on the right hand side of that rule.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>ROUTEs are only allowed:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>1. At the top level of the scene<o:p></o:p></p><p class=MsoPlainText>2. Inside the node body (between fields)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>In my opinion it does not make much sense to forbid ROUTEs inside MFNode fields, and I am actually surprised that someone implemented it such strictly.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Bye,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Patrick<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>_______________________________________________<o:p></o:p></p><p class=MsoPlainText>x3d-public mailing list<o:p></o:p></p><p class=MsoPlainText><a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText><a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org"><span style='color:windowtext;text-decoration:none'>http://web3d.org/mailman/listinfo/x3d-public_web3d.org</span></a><o:p></o:p></p></div></body></html>