microsoft/typespec

Public

mirrored from https://github.com/microsoft/typespecAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
65a5918bf468cd7f8685a35735b5dda7f3ec4221

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

docs/spec.html

3038lines · modecode

1<!doctype html>
2<head><meta charset="utf-8"><script>'use strict';
3let sdoBox = {
4 init() {
5 this.$alternativeId = null;
6 this.$outer = document.createElement('div');
7 this.$outer.classList.add('toolbox-container');
8 this.$container = document.createElement('div');
9 this.$container.classList.add('toolbox');
10 this.$displayLink = document.createElement('a');
11 this.$displayLink.setAttribute('href', '#');
12 this.$displayLink.textContent = 'Syntax-Directed Operations';
13 this.$displayLink.addEventListener('click', e => {
14 e.preventDefault();
15 e.stopPropagation();
16 referencePane.showSDOs(sdoMap[this.$alternativeId] || {}, this.$alternativeId);
17 });
18 this.$container.appendChild(this.$displayLink);
19 this.$outer.appendChild(this.$container);
20 document.body.appendChild(this.$outer);
21 },
22
23 activate(el) {
24 clearTimeout(this.deactiveTimeout);
25 Toolbox.deactivate();
26 this.$alternativeId = el.id;
27 let numSdos = Object.keys(sdoMap[this.$alternativeId] || {}).length;
28 this.$displayLink.textContent = 'Syntax-Directed Operations (' + numSdos + ')';
29 this.$outer.classList.add('active');
30 let top = el.offsetTop - this.$outer.offsetHeight;
31 let left = el.offsetLeft + 50 - 10; // 50px = padding-left(=75px) + text-indent(=-25px)
32 this.$outer.setAttribute('style', 'left: ' + left + 'px; top: ' + top + 'px');
33 if (top < document.body.scrollTop) {
34 this.$container.scrollIntoView();
35 }
36 },
37
38 deactivate() {
39 clearTimeout(this.deactiveTimeout);
40 this.$outer.classList.remove('active');
41 },
42};
43
44document.addEventListener('DOMContentLoaded', () => {
45 if (typeof sdoMap == 'undefined') {
46 console.error('could not find sdo map');
47 return;
48 }
49 sdoBox.init();
50
51 let insideTooltip = false;
52 sdoBox.$outer.addEventListener('pointerenter', () => {
53 insideTooltip = true;
54 });
55 sdoBox.$outer.addEventListener('pointerleave', () => {
56 insideTooltip = false;
57 sdoBox.deactivate();
58 });
59
60 sdoBox.deactiveTimeout = null;
61 [].forEach.call(document.querySelectorAll('emu-grammar[type=definition] emu-rhs'), node => {
62 node.addEventListener('pointerenter', function () {
63 sdoBox.activate(this);
64 });
65
66 node.addEventListener('pointerleave', () => {
67 sdoBox.deactiveTimeout = setTimeout(() => {
68 if (!insideTooltip) {
69 sdoBox.deactivate();
70 }
71 }, 500);
72 });
73 });
74
75 document.addEventListener(
76 'keydown',
77 debounce(e => {
78 if (e.code === 'Escape') {
79 sdoBox.deactivate();
80 }
81 })
82 );
83});
84
85'use strict';
86function Search(menu) {
87 this.menu = menu;
88 this.$search = document.getElementById('menu-search');
89 this.$searchBox = document.getElementById('menu-search-box');
90 this.$searchResults = document.getElementById('menu-search-results');
91
92 this.loadBiblio();
93
94 document.addEventListener('keydown', this.documentKeydown.bind(this));
95
96 this.$searchBox.addEventListener(
97 'keydown',
98 debounce(this.searchBoxKeydown.bind(this), { stopPropagation: true })
99 );
100 this.$searchBox.addEventListener(
101 'keyup',
102 debounce(this.searchBoxKeyup.bind(this), { stopPropagation: true })
103 );
104
105 // Perform an initial search if the box is not empty.
106 if (this.$searchBox.value) {
107 this.search(this.$searchBox.value);
108 }
109}
110
111Search.prototype.loadBiblio = function () {
112 if (typeof biblio === 'undefined') {
113 console.error('could not find biblio');
114 this.biblio = { refToClause: {}, entries: [] };
115 } else {
116 this.biblio = biblio;
117 this.biblio.clauses = this.biblio.entries.filter(e => e.type === 'clause');
118 this.biblio.byId = this.biblio.entries.reduce((map, entry) => {
119 map[entry.id] = entry;
120 return map;
121 }, {});
122 let refParentClause = Object.create(null);
123 this.biblio.refParentClause = refParentClause;
124 let refsByClause = this.biblio.refsByClause;
125 Object.keys(refsByClause).forEach(clause => {
126 refsByClause[clause].forEach(ref => {
127 refParentClause[ref] = clause;
128 });
129 });
130 }
131};
132
133Search.prototype.documentKeydown = function (e) {
134 if (e.keyCode === 191) {
135 e.preventDefault();
136 e.stopPropagation();
137 this.triggerSearch();
138 }
139};
140
141Search.prototype.searchBoxKeydown = function (e) {
142 e.stopPropagation();
143 e.preventDefault();
144 if (e.keyCode === 191 && e.target.value.length === 0) {
145 e.preventDefault();
146 } else if (e.keyCode === 13) {
147 e.preventDefault();
148 this.selectResult();
149 }
150};
151
152Search.prototype.searchBoxKeyup = function (e) {
153 if (e.keyCode === 13 || e.keyCode === 9) {
154 return;
155 }
156
157 this.search(e.target.value);
158};
159
160Search.prototype.triggerSearch = function () {
161 if (this.menu.isVisible()) {
162 this._closeAfterSearch = false;
163 } else {
164 this._closeAfterSearch = true;
165 this.menu.show();
166 }
167
168 this.$searchBox.focus();
169 this.$searchBox.select();
170};
171// bit 12 - Set if the result starts with searchString
172// bits 8-11: 8 - number of chunks multiplied by 2 if cases match, otherwise 1.
173// bits 1-7: 127 - length of the entry
174// General scheme: prefer case sensitive matches with fewer chunks, and otherwise
175// prefer shorter matches.
176function relevance(result) {
177 let relevance = 0;
178
179 relevance = Math.max(0, 8 - result.match.chunks) << 7;
180
181 if (result.match.caseMatch) {
182 relevance *= 2;
183 }
184
185 if (result.match.prefix) {
186 relevance += 2048;
187 }
188
189 relevance += Math.max(0, 255 - result.key.length);
190
191 return relevance;
192}
193
194Search.prototype.search = function (searchString) {
195 if (searchString === '') {
196 this.displayResults([]);
197 this.hideSearch();
198 return;
199 } else {
200 this.showSearch();
201 }
202
203 if (searchString.length === 1) {
204 this.displayResults([]);
205 return;
206 }
207
208 let results;
209
210 if (/^[\d.]*$/.test(searchString)) {
211 results = this.biblio.clauses
212 .filter(clause => clause.number.substring(0, searchString.length) === searchString)
213 .map(clause => ({ entry: clause }));
214 } else {
215 results = [];
216
217 for (let i = 0; i < this.biblio.entries.length; i++) {
218 let entry = this.biblio.entries[i];
219 let key = getKey(entry);
220 if (!key) {
221 // biblio entries without a key aren't searchable
222 continue;
223 }
224
225 let match = fuzzysearch(searchString, key);
226 if (match) {
227 results.push({ key, entry, match });
228 }
229 }
230
231 results.forEach(result => {
232 result.relevance = relevance(result, searchString);
233 });
234
235 results = results.sort((a, b) => b.relevance - a.relevance);
236 }
237
238 if (results.length > 50) {
239 results = results.slice(0, 50);
240 }
241
242 this.displayResults(results);
243};
244Search.prototype.hideSearch = function () {
245 this.$search.classList.remove('active');
246};
247
248Search.prototype.showSearch = function () {
249 this.$search.classList.add('active');
250};
251
252Search.prototype.selectResult = function () {
253 let $first = this.$searchResults.querySelector('li:first-child a');
254
255 if ($first) {
256 document.location = $first.getAttribute('href');
257 }
258
259 this.$searchBox.value = '';
260 this.$searchBox.blur();
261 this.displayResults([]);
262 this.hideSearch();
263
264 if (this._closeAfterSearch) {
265 this.menu.hide();
266 }
267};
268
269Search.prototype.displayResults = function (results) {
270 if (results.length > 0) {
271 this.$searchResults.classList.remove('no-results');
272
273 let html = '<ul>';
274
275 results.forEach(result => {
276 let key = result.key;
277 let entry = result.entry;
278 let id = entry.id;
279 let cssClass = '';
280 let text = '';
281
282 if (entry.type === 'clause') {
283 let number = entry.number ? entry.number + ' ' : '';
284 text = number + key;
285 cssClass = 'clause';
286 id = entry.id;
287 } else if (entry.type === 'production') {
288 text = key;
289 cssClass = 'prod';
290 id = entry.id;
291 } else if (entry.type === 'op') {
292 text = key;
293 cssClass = 'op';
294 id = entry.id || entry.refId;
295 } else if (entry.type === 'term') {
296 text = key;
297 cssClass = 'term';
298 id = entry.id || entry.refId;
299 }
300
301 if (text) {
302 // prettier-ignore
303 html += `<li class=menu-search-result-${cssClass}><a href="${makeLinkToId(id)}">${text}</a></li>`;
304 }
305 });
306
307 html += '</ul>';
308
309 this.$searchResults.innerHTML = html;
310 } else {
311 this.$searchResults.innerHTML = '';
312 this.$searchResults.classList.add('no-results');
313 }
314};
315
316function getKey(item) {
317 if (item.key) {
318 return item.key;
319 }
320 switch (item.type) {
321 case 'clause':
322 return item.title || item.titleHTML;
323 case 'production':
324 return item.name;
325 case 'op':
326 return item.aoid;
327 case 'term':
328 return item.term;
329 case 'table':
330 case 'figure':
331 case 'example':
332 case 'note':
333 return item.caption;
334 case 'step':
335 return item.id;
336 default:
337 throw new Error("Can't get key for " + item.type);
338 }
339}
340
341function Menu() {
342 this.$toggle = document.getElementById('menu-toggle');
343 this.$menu = document.getElementById('menu');
344 this.$toc = document.querySelector('menu-toc > ol');
345 this.$pins = document.querySelector('#menu-pins');
346 this.$pinList = document.getElementById('menu-pins-list');
347 this.$toc = document.querySelector('#menu-toc > ol');
348 this.$specContainer = document.getElementById('spec-container');
349 this.search = new Search(this);
350
351 this._pinnedIds = {};
352 this.loadPinEntries();
353
354 // toggle menu
355 this.$toggle.addEventListener('click', this.toggle.bind(this));
356
357 // keydown events for pinned clauses
358 document.addEventListener('keydown', this.documentKeydown.bind(this));
359
360 // toc expansion
361 let tocItems = this.$menu.querySelectorAll('#menu-toc li');
362 for (let i = 0; i < tocItems.length; i++) {
363 let $item = tocItems[i];
364 $item.addEventListener('click', event => {
365 $item.classList.toggle('active');
366 event.stopPropagation();
367 });
368 }
369
370 // close toc on toc item selection
371 let tocLinks = this.$menu.querySelectorAll('#menu-toc li > a');
372 for (let i = 0; i < tocLinks.length; i++) {
373 let $link = tocLinks[i];
374 $link.addEventListener('click', event => {
375 this.toggle();
376 event.stopPropagation();
377 });
378 }
379
380 // update active clause on scroll
381 window.addEventListener('scroll', debounce(this.updateActiveClause.bind(this)));
382 this.updateActiveClause();
383
384 // prevent menu scrolling from scrolling the body
385 this.$toc.addEventListener('wheel', e => {
386 let target = e.currentTarget;
387 let offTop = e.deltaY < 0 && target.scrollTop === 0;
388 if (offTop) {
389 e.preventDefault();
390 }
391 let offBottom = e.deltaY > 0 && target.offsetHeight + target.scrollTop >= target.scrollHeight;
392
393 if (offBottom) {
394 e.preventDefault();
395 }
396 });
397}
398
399Menu.prototype.documentKeydown = function (e) {
400 e.stopPropagation();
401 if (e.keyCode === 80) {
402 this.togglePinEntry();
403 } else if (e.keyCode > 48 && e.keyCode < 58) {
404 this.selectPin(e.keyCode - 49);
405 }
406};
407
408Menu.prototype.updateActiveClause = function () {
409 this.setActiveClause(findActiveClause(this.$specContainer));
410};
411
412Menu.prototype.setActiveClause = function (clause) {
413 this.$activeClause = clause;
414 this.revealInToc(this.$activeClause);
415};
416
417Menu.prototype.revealInToc = function (path) {
418 let current = this.$toc.querySelectorAll('li.revealed');
419 for (let i = 0; i < current.length; i++) {
420 current[i].classList.remove('revealed');
421 current[i].classList.remove('revealed-leaf');
422 }
423
424 current = this.$toc;
425 let index = 0;
426 outer: while (index < path.length) {
427 let children = current.children;
428 for (let i = 0; i < children.length; i++) {
429 if ('#' + path[index].id === children[i].children[1].hash) {
430 children[i].classList.add('revealed');
431 if (index === path.length - 1) {
432 children[i].classList.add('revealed-leaf');
433 let rect = children[i].getBoundingClientRect();
434 // this.$toc.getBoundingClientRect().top;
435 let tocRect = this.$toc.getBoundingClientRect();
436 if (rect.top + 10 > tocRect.bottom) {
437 this.$toc.scrollTop =
438 this.$toc.scrollTop + (rect.top - tocRect.bottom) + (rect.bottom - rect.top);
439 } else if (rect.top < tocRect.top) {
440 this.$toc.scrollTop = this.$toc.scrollTop - (tocRect.top - rect.top);
441 }
442 }
443 current = children[i].querySelector('ol');
444 index++;
445 continue outer;
446 }
447 }
448 console.log('could not find location in table of contents', path);
449 break;
450 }
451};
452
453function findActiveClause(root, path) {
454 let clauses = getChildClauses(root);
455 path = path || [];
456
457 for (let $clause of clauses) {
458 let rect = $clause.getBoundingClientRect();
459 let $header = $clause.querySelector('h1');
460 let marginTop = Math.max(
461 parseInt(getComputedStyle($clause)['margin-top']),
462 parseInt(getComputedStyle($header)['margin-top'])
463 );
464
465 if (rect.top - marginTop <= 1 && rect.bottom > 0) {
466 return findActiveClause($clause, path.concat($clause)) || path;
467 }
468 }
469
470 return path;
471}
472
473function* getChildClauses(root) {
474 for (let el of root.children) {
475 switch (el.nodeName) {
476 // descend into <emu-import>
477 case 'EMU-IMPORT':
478 yield* getChildClauses(el);
479 break;
480
481 // accept <emu-clause>, <emu-intro>, and <emu-annex>
482 case 'EMU-CLAUSE':
483 case 'EMU-INTRO':
484 case 'EMU-ANNEX':
485 yield el;
486 }
487 }
488}
489
490Menu.prototype.toggle = function () {
491 this.$menu.classList.toggle('active');
492};
493
494Menu.prototype.show = function () {
495 this.$menu.classList.add('active');
496};
497
498Menu.prototype.hide = function () {
499 this.$menu.classList.remove('active');
500};
501
502Menu.prototype.isVisible = function () {
503 return this.$menu.classList.contains('active');
504};
505
506Menu.prototype.showPins = function () {
507 this.$pins.classList.add('active');
508};
509
510Menu.prototype.hidePins = function () {
511 this.$pins.classList.remove('active');
512};
513
514Menu.prototype.addPinEntry = function (id) {
515 let entry = this.search.biblio.byId[id];
516 if (!entry) {
517 // id was deleted after pin (or something) so remove it
518 delete this._pinnedIds[id];
519 this.persistPinEntries();
520 return;
521 }
522
523 if (entry.type === 'clause') {
524 let prefix;
525 if (entry.number) {
526 prefix = entry.number + ' ';
527 } else {
528 prefix = '';
529 }
530 // prettier-ignore
531 this.$pinList.innerHTML += `<li><a href="${makeLinkToId(entry.id)}">${prefix}${entry.titleHTML}</a></li>`;
532 } else {
533 this.$pinList.innerHTML += `<li><a href="${makeLinkToId(entry.id)}">${entry.key}</a></li>`;
534 }
535
536 if (Object.keys(this._pinnedIds).length === 0) {
537 this.showPins();
538 }
539 this._pinnedIds[id] = true;
540 this.persistPinEntries();
541};
542
543Menu.prototype.removePinEntry = function (id) {
544 let item = this.$pinList.querySelector(`a[href="${makeLinkToId(id)}"]`).parentNode;
545 this.$pinList.removeChild(item);
546 delete this._pinnedIds[id];
547 if (Object.keys(this._pinnedIds).length === 0) {
548 this.hidePins();
549 }
550
551 this.persistPinEntries();
552};
553
554Menu.prototype.persistPinEntries = function () {
555 try {
556 if (!window.localStorage) return;
557 } catch (e) {
558 return;
559 }
560
561 localStorage.pinEntries = JSON.stringify(Object.keys(this._pinnedIds));
562};
563
564Menu.prototype.loadPinEntries = function () {
565 try {
566 if (!window.localStorage) return;
567 } catch (e) {
568 return;
569 }
570
571 let pinsString = window.localStorage.pinEntries;
572 if (!pinsString) return;
573 let pins = JSON.parse(pinsString);
574 for (let i = 0; i < pins.length; i++) {
575 this.addPinEntry(pins[i]);
576 }
577};
578
579Menu.prototype.togglePinEntry = function (id) {
580 if (!id) {
581 id = this.$activeClause[this.$activeClause.length - 1].id;
582 }
583
584 if (this._pinnedIds[id]) {
585 this.removePinEntry(id);
586 } else {
587 this.addPinEntry(id);
588 }
589};
590
591Menu.prototype.selectPin = function (num) {
592 document.location = this.$pinList.children[num].children[0].href;
593};
594
595let menu;
596
597document.addEventListener('DOMContentLoaded', init);
598
599function debounce(fn, opts) {
600 opts = opts || {};
601 let timeout;
602 return function (e) {
603 if (opts.stopPropagation) {
604 e.stopPropagation();
605 }
606 let args = arguments;
607 if (timeout) {
608 clearTimeout(timeout);
609 }
610 timeout = setTimeout(() => {
611 timeout = null;
612 fn.apply(this, args);
613 }, 150);
614 };
615}
616
617let CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX'];
618function findContainer($elem) {
619 let parentClause = $elem.parentNode;
620 while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) {
621 parentClause = parentClause.parentNode;
622 }
623 return parentClause;
624}
625
626function findLocalReferences(parentClause, name) {
627 let vars = parentClause.querySelectorAll('var');
628 let references = [];
629
630 for (let i = 0; i < vars.length; i++) {
631 let $var = vars[i];
632
633 if ($var.innerHTML === name) {
634 references.push($var);
635 }
636 }
637
638 return references;
639}
640
641let REFERENCED_CLASSES = Array.from({ length: 7 }, (x, i) => `referenced${i}`);
642function chooseHighlightIndex(parentClause) {
643 let counts = REFERENCED_CLASSES.map($class => parentClause.getElementsByClassName($class).length);
644 // Find the earliest index with the lowest count.
645 let minCount = Infinity;
646 let index = null;
647 for (let i = 0; i < counts.length; i++) {
648 if (counts[i] < minCount) {
649 minCount = counts[i];
650 index = i;
651 }
652 }
653 return index;
654}
655
656function toggleFindLocalReferences($elem) {
657 let parentClause = findContainer($elem);
658 let references = findLocalReferences(parentClause, $elem.innerHTML);
659 if ($elem.classList.contains('referenced')) {
660 references.forEach($reference => {
661 $reference.classList.remove('referenced', ...REFERENCED_CLASSES);
662 });
663 } else {
664 let index = chooseHighlightIndex(parentClause);
665 references.forEach($reference => {
666 $reference.classList.add('referenced', `referenced${index}`);
667 });
668 }
669}
670
671function installFindLocalReferences() {
672 document.addEventListener('click', e => {
673 if (e.target.nodeName === 'VAR') {
674 toggleFindLocalReferences(e.target);
675 }
676 });
677}
678
679document.addEventListener('DOMContentLoaded', installFindLocalReferences);
680
681// The following license applies to the fuzzysearch function
682// The MIT License (MIT)
683// Copyright © 2015 Nicolas Bevacqua
684// Copyright © 2016 Brian Terlson
685// Permission is hereby granted, free of charge, to any person obtaining a copy of
686// this software and associated documentation files (the "Software"), to deal in
687// the Software without restriction, including without limitation the rights to
688// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
689// the Software, and to permit persons to whom the Software is furnished to do so,
690// subject to the following conditions:
691
692// The above copyright notice and this permission notice shall be included in all
693// copies or substantial portions of the Software.
694
695// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
696// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
697// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
698// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
699// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
700// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
701function fuzzysearch(searchString, haystack, caseInsensitive) {
702 let tlen = haystack.length;
703 let qlen = searchString.length;
704 let chunks = 1;
705 let finding = false;
706
707 if (qlen > tlen) {
708 return false;
709 }
710
711 if (qlen === tlen) {
712 if (searchString === haystack) {
713 return { caseMatch: true, chunks: 1, prefix: true };
714 } else if (searchString.toLowerCase() === haystack.toLowerCase()) {
715 return { caseMatch: false, chunks: 1, prefix: true };
716 } else {
717 return false;
718 }
719 }
720
721 let j = 0;
722 outer: for (let i = 0; i < qlen; i++) {
723 let nch = searchString[i];
724 while (j < tlen) {
725 let targetChar = haystack[j++];
726 if (targetChar === nch) {
727 finding = true;
728 continue outer;
729 }
730 if (finding) {
731 chunks++;
732 finding = false;
733 }
734 }
735
736 if (caseInsensitive) {
737 return false;
738 }
739
740 return fuzzysearch(searchString.toLowerCase(), haystack.toLowerCase(), true);
741 }
742
743 return { caseMatch: !caseInsensitive, chunks, prefix: j <= qlen };
744}
745
746let referencePane = {
747 init() {
748 this.$container = document.createElement('div');
749 this.$container.setAttribute('id', 'references-pane-container');
750
751 let $spacer = document.createElement('div');
752 $spacer.setAttribute('id', 'references-pane-spacer');
753
754 this.$pane = document.createElement('div');
755 this.$pane.setAttribute('id', 'references-pane');
756
757 this.$container.appendChild($spacer);
758 this.$container.appendChild(this.$pane);
759
760 this.$header = document.createElement('div');
761 this.$header.classList.add('menu-pane-header');
762 this.$headerText = document.createElement('span');
763 this.$header.appendChild(this.$headerText);
764 this.$headerRefId = document.createElement('a');
765 this.$header.appendChild(this.$headerRefId);
766 this.$closeButton = document.createElement('span');
767 this.$closeButton.setAttribute('id', 'references-pane-close');
768 this.$closeButton.addEventListener('click', () => {
769 this.deactivate();
770 });
771 this.$header.appendChild(this.$closeButton);
772
773 this.$pane.appendChild(this.$header);
774 let tableContainer = document.createElement('div');
775 tableContainer.setAttribute('id', 'references-pane-table-container');
776
777 this.$table = document.createElement('table');
778 this.$table.setAttribute('id', 'references-pane-table');
779
780 this.$tableBody = this.$table.createTBody();
781
782 tableContainer.appendChild(this.$table);
783 this.$pane.appendChild(tableContainer);
784
785 menu.$specContainer.appendChild(this.$container);
786 },
787
788 activate() {
789 this.$container.classList.add('active');
790 },
791
792 deactivate() {
793 this.$container.classList.remove('active');
794 this.state = null;
795 },
796
797 showReferencesFor(entry) {
798 this.activate();
799 this.state = { type: 'ref', id: entry.id };
800 this.$headerText.textContent = 'References to ';
801 let newBody = document.createElement('tbody');
802 let previousId;
803 let previousCell;
804 let dupCount = 0;
805 this.$headerRefId.textContent = '#' + entry.id;
806 this.$headerRefId.setAttribute('href', makeLinkToId(entry.id));
807 this.$headerRefId.style.display = 'inline';
808 entry.referencingIds
809 .map(id => {
810 let cid = menu.search.biblio.refParentClause[id];
811 let clause = menu.search.biblio.byId[cid];
812 if (clause == null) {
813 throw new Error('could not find clause for id ' + cid);
814 }
815 return { id, clause };
816 })
817 .sort((a, b) => sortByClauseNumber(a.clause, b.clause))
818 .forEach(record => {
819 if (previousId === record.clause.id) {
820 previousCell.innerHTML += ` (<a href="${makeLinkToId(record.id)}">${dupCount + 2}</a>)`;
821 dupCount++;
822 } else {
823 let row = newBody.insertRow();
824 let cell = row.insertCell();
825 cell.innerHTML = record.clause.number;
826 cell = row.insertCell();
827 cell.innerHTML = `<a href="${makeLinkToId(record.id)}">${record.clause.titleHTML}</a>`;
828 previousCell = cell;
829 previousId = record.clause.id;
830 dupCount = 0;
831 }
832 }, this);
833 this.$table.removeChild(this.$tableBody);
834 this.$tableBody = newBody;
835 this.$table.appendChild(this.$tableBody);
836 },
837
838 showSDOs(sdos, alternativeId) {
839 let rhs = document.getElementById(alternativeId);
840 let parentName = rhs.parentNode.getAttribute('name');
841 let colons = rhs.parentNode.querySelector('emu-geq');
842 rhs = rhs.cloneNode(true);
843 rhs.querySelectorAll('emu-params,emu-constraints').forEach(e => {
844 e.remove();
845 });
846 rhs.querySelectorAll('[id]').forEach(e => {
847 e.removeAttribute('id');
848 });
849 rhs.querySelectorAll('a').forEach(e => {
850 e.parentNode.replaceChild(document.createTextNode(e.textContent), e);
851 });
852
853 // prettier-ignore
854 this.$headerText.innerHTML = `Syntax-Directed Operations for<br><a href="${makeLinkToId(alternativeId)}" class="menu-pane-header-production"><emu-nt>${parentName}</emu-nt> ${colons.outerHTML} </a>`;
855 this.$headerText.querySelector('a').append(rhs);
856 this.showSDOsBody(sdos, alternativeId);
857 },
858
859 showSDOsBody(sdos, alternativeId) {
860 this.activate();
861 this.state = { type: 'sdo', id: alternativeId, html: this.$headerText.innerHTML };
862 this.$headerRefId.style.display = 'none';
863 let newBody = document.createElement('tbody');
864 Object.keys(sdos).forEach(sdoName => {
865 let pair = sdos[sdoName];
866 let clause = pair.clause;
867 let ids = pair.ids;
868 let first = ids[0];
869 let row = newBody.insertRow();
870 let cell = row.insertCell();
871 cell.innerHTML = clause;
872 cell = row.insertCell();
873 let html = '<a href="' + makeLinkToId(first) + '">' + sdoName + '</a>';
874 for (let i = 1; i < ids.length; ++i) {
875 html += ' (<a href="' + makeLinkToId(ids[i]) + '">' + (i + 1) + '</a>)';
876 }
877 cell.innerHTML = html;
878 });
879 this.$table.removeChild(this.$tableBody);
880 this.$tableBody = newBody;
881 this.$table.appendChild(this.$tableBody);
882 },
883};
884
885let Toolbox = {
886 init() {
887 this.$outer = document.createElement('div');
888 this.$outer.classList.add('toolbox-container');
889 this.$container = document.createElement('div');
890 this.$container.classList.add('toolbox');
891 this.$outer.appendChild(this.$container);
892 this.$permalink = document.createElement('a');
893 this.$permalink.textContent = 'Permalink';
894 this.$pinLink = document.createElement('a');
895 this.$pinLink.textContent = 'Pin';
896 this.$pinLink.setAttribute('href', '#');
897 this.$pinLink.addEventListener('click', e => {
898 e.preventDefault();
899 e.stopPropagation();
900 menu.togglePinEntry(this.entry.id);
901 });
902
903 this.$refsLink = document.createElement('a');
904 this.$refsLink.setAttribute('href', '#');
905 this.$refsLink.addEventListener('click', e => {
906 e.preventDefault();
907 e.stopPropagation();
908 referencePane.showReferencesFor(this.entry);
909 });
910 this.$container.appendChild(this.$permalink);
911 this.$container.appendChild(this.$pinLink);
912 this.$container.appendChild(this.$refsLink);
913 document.body.appendChild(this.$outer);
914 },
915
916 activate(el, entry, target) {
917 if (el === this._activeEl) return;
918 sdoBox.deactivate();
919 this.active = true;
920 this.entry = entry;
921 this.$outer.classList.add('active');
922 this.top = el.offsetTop - this.$outer.offsetHeight;
923 this.left = el.offsetLeft - 10;
924 this.$outer.setAttribute('style', 'left: ' + this.left + 'px; top: ' + this.top + 'px');
925 this.updatePermalink();
926 this.updateReferences();
927 this._activeEl = el;
928 if (this.top < document.body.scrollTop && el === target) {
929 // don't scroll unless it's a small thing (< 200px)
930 this.$outer.scrollIntoView();
931 }
932 },
933
934 updatePermalink() {
935 this.$permalink.setAttribute('href', makeLinkToId(this.entry.id));
936 },
937
938 updateReferences() {
939 this.$refsLink.textContent = `References (${this.entry.referencingIds.length})`;
940 },
941
942 activateIfMouseOver(e) {
943 let ref = this.findReferenceUnder(e.target);
944 if (ref && (!this.active || e.pageY > this._activeEl.offsetTop)) {
945 let entry = menu.search.biblio.byId[ref.id];
946 this.activate(ref.element, entry, e.target);
947 } else if (
948 this.active &&
949 (e.pageY < this.top || e.pageY > this._activeEl.offsetTop + this._activeEl.offsetHeight)
950 ) {
951 this.deactivate();
952 }
953 },
954
955 findReferenceUnder(el) {
956 while (el) {
957 let parent = el.parentNode;
958 if (el.nodeName === 'EMU-RHS' || el.nodeName === 'EMU-PRODUCTION') {
959 return null;
960 }
961 if (
962 el.nodeName === 'H1' &&
963 parent.nodeName.match(/EMU-CLAUSE|EMU-ANNEX|EMU-INTRO/) &&
964 parent.id
965 ) {
966 return { element: el, id: parent.id };
967 } else if (el.nodeName === 'EMU-NT') {
968 if (
969 parent.nodeName === 'EMU-PRODUCTION' &&
970 parent.id &&
971 parent.id[0] !== '_' &&
972 parent.firstElementChild === el
973 ) {
974 // return the LHS non-terminal element
975 return { element: el, id: parent.id };
976 }
977 return null;
978 } else if (
979 el.nodeName.match(/EMU-(?!CLAUSE|XREF|ANNEX|INTRO)|DFN/) &&
980 el.id &&
981 el.id[0] !== '_'
982 ) {
983 if (
984 el.nodeName === 'EMU-FIGURE' ||
985 el.nodeName === 'EMU-TABLE' ||
986 el.nodeName === 'EMU-EXAMPLE'
987 ) {
988 // return the figcaption element
989 return { element: el.children[0].children[0], id: el.id };
990 } else {
991 return { element: el, id: el.id };
992 }
993 }
994 el = parent;
995 }
996 },
997
998 deactivate() {
999 this.$outer.classList.remove('active');
1000 this._activeEl = null;
1001 this.active = false;
1002 },
1003};
1004
1005function sortByClauseNumber(clause1, clause2) {
1006 let c1c = clause1.number.split('.');
1007 let c2c = clause2.number.split('.');
1008
1009 for (let i = 0; i < c1c.length; i++) {
1010 if (i >= c2c.length) {
1011 return 1;
1012 }
1013
1014 let c1 = c1c[i];
1015 let c2 = c2c[i];
1016 let c1cn = Number(c1);
1017 let c2cn = Number(c2);
1018
1019 if (Number.isNaN(c1cn) && Number.isNaN(c2cn)) {
1020 if (c1 > c2) {
1021 return 1;
1022 } else if (c1 < c2) {
1023 return -1;
1024 }
1025 } else if (!Number.isNaN(c1cn) && Number.isNaN(c2cn)) {
1026 return -1;
1027 } else if (Number.isNaN(c1cn) && !Number.isNaN(c2cn)) {
1028 return 1;
1029 } else if (c1cn > c2cn) {
1030 return 1;
1031 } else if (c1cn < c2cn) {
1032 return -1;
1033 }
1034 }
1035
1036 if (c1c.length === c2c.length) {
1037 return 0;
1038 }
1039 return -1;
1040}
1041
1042function makeLinkToId(id) {
1043 let hash = '#' + id;
1044 if (typeof idToSection === 'undefined' || !idToSection[id]) {
1045 return hash;
1046 }
1047 let targetSec = idToSection[id];
1048 return (targetSec === 'index' ? './' : targetSec + '.html') + hash;
1049}
1050
1051function doShortcut(e) {
1052 if (!(e.target instanceof HTMLElement)) {
1053 return;
1054 }
1055 let target = e.target;
1056 let name = target.nodeName.toLowerCase();
1057 if (name === 'textarea' || name === 'input' || name === 'select' || target.isContentEditable) {
1058 return;
1059 }
1060 if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
1061 return;
1062 }
1063 if (e.key === 'm' && usesMultipage) {
1064 let pathParts = location.pathname.split('/');
1065 let hash = location.hash;
1066 if (pathParts[pathParts.length - 2] === 'multipage') {
1067 if (hash === '') {
1068 let sectionName = pathParts[pathParts.length - 1];
1069 if (sectionName.endsWith('.html')) {
1070 sectionName = sectionName.slice(0, -5);
1071 }
1072 if (idToSection['sec-' + sectionName] !== undefined) {
1073 hash = '#sec-' + sectionName;
1074 }
1075 }
1076 location = pathParts.slice(0, -2).join('/') + '/' + hash;
1077 } else {
1078 location = 'multipage/' + hash;
1079 }
1080 } else if (e.key === 'u') {
1081 document.documentElement.classList.toggle('show-ao-annotations');
1082 }
1083}
1084
1085function init() {
1086 menu = new Menu();
1087 let $container = document.getElementById('spec-container');
1088 $container.addEventListener(
1089 'mouseover',
1090 debounce(e => {
1091 Toolbox.activateIfMouseOver(e);
1092 })
1093 );
1094 document.addEventListener(
1095 'keydown',
1096 debounce(e => {
1097 if (e.code === 'Escape' && Toolbox.active) {
1098 Toolbox.deactivate();
1099 }
1100 })
1101 );
1102}
1103
1104document.addEventListener('keypress', doShortcut);
1105
1106document.addEventListener('DOMContentLoaded', () => {
1107 Toolbox.init();
1108 referencePane.init();
1109});
1110
1111'use strict';
1112let decimalBullet = Array.from({ length: 100 }, (a, i) => '' + (i + 1));
1113let alphaBullet = Array.from({ length: 26 }, (a, i) => String.fromCharCode('a'.charCodeAt(0) + i));
1114
1115// prettier-ignore
1116let romanBullet = ['i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x', 'xi', 'xii', 'xiii', 'xiv', 'xv', 'xvi', 'xvii', 'xviii', 'xix', 'xx', 'xxi', 'xxii', 'xxiii', 'xxiv', 'xxv'];
1117// prettier-ignore
1118let bullets = [decimalBullet, alphaBullet, romanBullet, decimalBullet, alphaBullet, romanBullet];
1119
1120function addStepNumberText(ol, parentIndex) {
1121 for (let i = 0; i < ol.children.length; ++i) {
1122 let child = ol.children[i];
1123 let index = parentIndex.concat([i]);
1124 let applicable = bullets[Math.min(index.length - 1, 5)];
1125 let span = document.createElement('span');
1126 span.textContent = (applicable[i] || '?') + '. ';
1127 span.style.fontSize = '0';
1128 span.setAttribute('aria-hidden', 'true');
1129 child.prepend(span);
1130 let sublist = child.querySelector('ol');
1131 if (sublist != null) {
1132 addStepNumberText(sublist, index);
1133 }
1134 }
1135}
1136document.addEventListener('DOMContentLoaded', () => {
1137 document.querySelectorAll('emu-alg > ol').forEach(ol => {
1138 addStepNumberText(ol, []);
1139 });
1140});
1141
1142let sdoMap = JSON.parse(`{}`);
1143let biblio = JSON.parse(`{"refsByClause":{"lexical-grammar":["_ref_0","_ref_1","_ref_2","_ref_3","_ref_4","_ref_5","_ref_6","_ref_7","_ref_8","_ref_9","_ref_10","_ref_11","_ref_12","_ref_13","_ref_14","_ref_15","_ref_16","_ref_17","_ref_18","_ref_19","_ref_20","_ref_21","_ref_22","_ref_23","_ref_24","_ref_25","_ref_26","_ref_27","_ref_28","_ref_29","_ref_30","_ref_31","_ref_32","_ref_33","_ref_34","_ref_35","_ref_36","_ref_37","_ref_38","_ref_39","_ref_40","_ref_41","_ref_42","_ref_43","_ref_44","_ref_45","_ref_46","_ref_47","_ref_48","_ref_49","_ref_50","_ref_51","_ref_52","_ref_53","_ref_54","_ref_55","_ref_56","_ref_57","_ref_58","_ref_59","_ref_60","_ref_61","_ref_62","_ref_63","_ref_64","_ref_65","_ref_66","_ref_67","_ref_68","_ref_69"],"syntactic-grammar":["_ref_70","_ref_71","_ref_72","_ref_73","_ref_74","_ref_75","_ref_76","_ref_77","_ref_78","_ref_79","_ref_80","_ref_81","_ref_82","_ref_83","_ref_84","_ref_85","_ref_86","_ref_87","_ref_88","_ref_89","_ref_90","_ref_91","_ref_92","_ref_93","_ref_94","_ref_95","_ref_96","_ref_97","_ref_98","_ref_99","_ref_100","_ref_101","_ref_102","_ref_103","_ref_104","_ref_105","_ref_106","_ref_107","_ref_108","_ref_109","_ref_110","_ref_111","_ref_112","_ref_113","_ref_114","_ref_115","_ref_116","_ref_117","_ref_118","_ref_119","_ref_120","_ref_121","_ref_122","_ref_123","_ref_124","_ref_125","_ref_126","_ref_127","_ref_128","_ref_129","_ref_130","_ref_131","_ref_132","_ref_133","_ref_134","_ref_135","_ref_136","_ref_137","_ref_138","_ref_139","_ref_140","_ref_141","_ref_142","_ref_143","_ref_144","_ref_145","_ref_146","_ref_147","_ref_148","_ref_149","_ref_150","_ref_151","_ref_152","_ref_153","_ref_154","_ref_155","_ref_156","_ref_157","_ref_158","_ref_159","_ref_160","_ref_161","_ref_162","_ref_163","_ref_164","_ref_165","_ref_166","_ref_167","_ref_168","_ref_169","_ref_170","_ref_171","_ref_172","_ref_173","_ref_174","_ref_175","_ref_176","_ref_177","_ref_178","_ref_179","_ref_180","_ref_181","_ref_182","_ref_183","_ref_184","_ref_185","_ref_186","_ref_187","_ref_188","_ref_189","_ref_190","_ref_191","_ref_192","_ref_193","_ref_194","_ref_195","_ref_196","_ref_197","_ref_198","_ref_199"]},"entries":[{"type":"clause","id":"intro","aoid":null,"titleHTML":"Introduction","number":"","referencingIds":[]},{"type":"production","id":"prod-SourceCharacter","name":"SourceCharacter","referencingIds":["_ref_49","_ref_53","_ref_64","_ref_65","_ref_69"]},{"type":"production","id":"prod-InputElement","name":"InputElement","referencingIds":[]},{"type":"production","id":"prod-Token","name":"Token","referencingIds":["_ref_0"]},{"type":"production","id":"prod-Trivia","name":"Trivia","referencingIds":["_ref_1"]},{"type":"production","id":"prod-Keyword","name":"Keyword","referencingIds":["_ref_2","_ref_11"]},{"type":"production","id":"prod-Identifier","name":"Identifier","referencingIds":["_ref_3","_ref_89","_ref_103","_ref_109","_ref_116","_ref_120","_ref_127","_ref_133","_ref_143","_ref_150","_ref_153","_ref_155","_ref_160","_ref_185","_ref_187"]},{"type":"production","id":"prod-IdentifierName","name":"IdentifierName","referencingIds":["_ref_10","_ref_13"]},{"type":"production","id":"prod-IdentifierStart","name":"IdentifierStart","referencingIds":["_ref_12"]},{"type":"production","id":"prod-IdentifierContinue","name":"IdentifierContinue","referencingIds":["_ref_14","_ref_15"]},{"type":"production","id":"prod-AsciiLetter","name":"AsciiLetter","referencingIds":["_ref_17"]},{"type":"production","id":"prod-BooleanLiteral","name":"BooleanLiteral","referencingIds":["_ref_9","_ref_178"]},{"type":"production","id":"prod-NumericLiteral","name":"NumericLiteral","referencingIds":["_ref_4","_ref_149","_ref_179"]},{"type":"production","id":"prod-DecimalLiteral","name":"DecimalLiteral","referencingIds":["_ref_19"]},{"type":"production","id":"prod-DecimalIntegerLiteral","name":"DecimalIntegerLiteral","referencingIds":["_ref_22","_ref_25","_ref_33"]},{"type":"production","id":"prod-DecimalDigits","name":"DecimalDigits","referencingIds":["_ref_23","_ref_27","_ref_28","_ref_29","_ref_31","_ref_34","_ref_35","_ref_36"]},{"type":"production","id":"prod-DecimalDigit","name":"DecimalDigit","referencingIds":["_ref_16","_ref_18","_ref_30","_ref_32"]},{"type":"production","id":"prod-ExponentPart","name":"ExponentPart","referencingIds":["_ref_24","_ref_26"]},{"type":"production","id":"prod-DecimalIntegerInteger","name":"DecimalIntegerInteger","referencingIds":[]},{"type":"production","id":"prod-HexIntegerLiteral","name":"HexIntegerLiteral","referencingIds":["_ref_20"]},{"type":"production","id":"prod-HexDigits","name":"HexDigits","referencingIds":["_ref_37","_ref_39"]},{"type":"production","id":"prod-HexDigit","name":"HexDigit","referencingIds":["_ref_38","_ref_40"]},{"type":"production","id":"prod-BinaryIntegerLiteral","name":"BinaryIntegerLiteral","referencingIds":["_ref_21"]},{"type":"production","id":"prod-BinaryDigits","name":"BinaryDigits","referencingIds":["_ref_41","_ref_43"]},{"type":"production","id":"prod-BinaryDigit","name":"BinaryDigit","referencingIds":["_ref_42","_ref_44"]},{"type":"production","id":"prod-StringLiteral","name":"StringLiteral","referencingIds":["_ref_5","_ref_77","_ref_106","_ref_130","_ref_146","_ref_148","_ref_177"]},{"type":"production","id":"prod-StringCharacters","name":"StringCharacters","referencingIds":["_ref_45","_ref_48"]},{"type":"production","id":"prod-StringCharacter","name":"StringCharacter","referencingIds":["_ref_47"]},{"type":"production","id":"prod-TripleQuotedStringCharacters","name":"TripleQuotedStringCharacters","referencingIds":["_ref_46","_ref_52"]},{"type":"production","id":"prod-TripleQuotedStringCharacter","name":"TripleQuotedStringCharacter","referencingIds":["_ref_51"]},{"type":"production","id":"prod-EscapeCharacter","name":"EscapeCharacter","referencingIds":["_ref_50","_ref_54"]},{"type":"production","id":"prod-Punctuator","name":"Punctuator","referencingIds":["_ref_6"]},{"type":"production","id":"prod-WhiteSpace","name":"WhiteSpace","referencingIds":["_ref_8"]},{"type":"production","id":"prod-Comment","name":"Comment","referencingIds":["_ref_7"]},{"type":"production","id":"prod-MultiLineComment","name":"MultiLineComment","referencingIds":["_ref_55"]},{"type":"production","id":"prod-MultiLineCommentChars","name":"MultiLineCommentChars","referencingIds":["_ref_57","_ref_59","_ref_62"]},{"type":"production","id":"prod-PostAsteriskCommentChars","name":"PostAsteriskCommentChars","referencingIds":["_ref_60","_ref_63"]},{"type":"production","id":"prod-MultiLineNotAsteriskChar","name":"MultiLineNotAsteriskChar","referencingIds":["_ref_58"]},{"type":"production","id":"prod-MultiLineNotForwardSlashOrAsteriskChar","name":"MultiLineNotForwardSlashOrAsteriskChar","referencingIds":["_ref_61"]},{"type":"production","id":"prod-SingleLineComment","name":"SingleLineComment","referencingIds":["_ref_56"]},{"type":"production","id":"prod-SingleLineCommentChars","name":"SingleLineCommentChars","referencingIds":["_ref_66","_ref_68"]},{"type":"production","id":"prod-SingleLineCommentChar","name":"SingleLineCommentChar","referencingIds":["_ref_67"]},{"type":"clause","id":"lexical-grammar","aoid":null,"titleHTML":"Lexical Grammar","number":"1","referencingIds":[]},{"type":"production","id":"prod-CadlScriptItemList","name":"CadlScriptItemList","referencingIds":["_ref_70"]},{"type":"production","id":"prod-CadlScriptItem","name":"CadlScriptItem","referencingIds":["_ref_71"]},{"type":"production","id":"prod-BlocklessNamespaceStatement","name":"BlocklessNamespaceStatement","referencingIds":["_ref_72"]},{"type":"production","id":"prod-ImportStatement","name":"ImportStatement","referencingIds":["_ref_73"]},{"type":"production","id":"prod-StatementList","name":"StatementList","referencingIds":["_ref_78","_ref_158"]},{"type":"production","id":"prod-Statement","name":"Statement","referencingIds":["_ref_74","_ref_79"]},{"type":"production","id":"prod-UsingStatement","name":"UsingStatement","referencingIds":["_ref_84"]},{"type":"production","id":"prod-ModelStatement","name":"ModelStatement","referencingIds":["_ref_80"]},{"type":"production","id":"prod-ModelHeritage","name":"ModelHeritage","referencingIds":["_ref_90"]},{"type":"production","id":"prod-ModelBody","name":"ModelBody","referencingIds":["_ref_91","_ref_190"]},{"type":"production","id":"prod-ModelPropertyList","name":"ModelPropertyList","referencingIds":["_ref_94","_ref_95","_ref_97","_ref_99","_ref_117","_ref_161"]},{"type":"production","id":"prod-ModelProperty","name":"ModelProperty","referencingIds":["_ref_96","_ref_98","_ref_100"]},{"type":"production","id":"prod-ModelSpreadProperty","name":"ModelSpreadProperty","referencingIds":["_ref_101"]},{"type":"production","id":"prod-InterfaceStatement","name":"InterfaceStatement","referencingIds":["_ref_81"]},{"type":"production","id":"prod-InterfaceHeritage","name":"InterfaceHeritage","referencingIds":["_ref_110"]},{"type":"production","id":"prod-InterfaceMemberList","name":"InterfaceMemberList","referencingIds":["_ref_112","_ref_114"]},{"type":"production","id":"prod-InterfaceMember","name":"InterfaceMember","referencingIds":["_ref_113","_ref_115"]},{"type":"production","id":"prod-UnionStatement","name":"UnionStatement","referencingIds":[]},{"type":"production","id":"prod-UnionBody","name":"UnionBody","referencingIds":["_ref_121"]},{"type":"production","id":"prod-UnionVariantList","name":"UnionVariantList","referencingIds":["_ref_122","_ref_124"]},{"type":"production","id":"prod-UnionVariant","name":"UnionVariant","referencingIds":["_ref_123","_ref_125"]},{"type":"production","id":"prod-EnumStatement","name":"EnumStatement","referencingIds":["_ref_85"]},{"type":"production","id":"prod-EnumBody","name":"EnumBody","referencingIds":["_ref_134"]},{"type":"production","id":"prod-EnumMemberList","name":"EnumMemberList","referencingIds":["_ref_135","_ref_136","_ref_138","_ref_140"]},{"type":"production","id":"prod-EnumMember","name":"EnumMember","referencingIds":["_ref_137","_ref_139","_ref_141"]},{"type":"production","id":"prod-EnumMemberValue","name":"EnumMemberValue","referencingIds":["_ref_144","_ref_147"]},{"type":"production","id":"prod-AliasStatement","name":"AliasStatement","referencingIds":["_ref_86"]},{"type":"production","id":"prod-IdentifierList","name":"IdentifierList","referencingIds":["_ref_152","_ref_154"]},{"type":"production","id":"prod-NamespaceStatement","name":"NamespaceStatement","referencingIds":["_ref_82"]},{"type":"production","id":"prod-OperationStatement","name":"OperationStatement","referencingIds":["_ref_83"]},{"type":"production","id":"prod-Expression","name":"Expression","referencingIds":["_ref_104","_ref_107","_ref_118","_ref_128","_ref_131","_ref_151","_ref_162","_ref_189","_ref_192","_ref_194"]},{"type":"production","id":"prod-UnionExpressionOrHigher","name":"UnionExpressionOrHigher","referencingIds":["_ref_163","_ref_165"]},{"type":"production","id":"prod-IntersectionExpressionOrHigher","name":"IntersectionExpressionOrHigher","referencingIds":["_ref_164","_ref_166","_ref_168"]},{"type":"production","id":"prod-ArrayExpressionOrHigher","name":"ArrayExpressionOrHigher","referencingIds":["_ref_167","_ref_169","_ref_171"]},{"type":"production","id":"prod-PrimaryExpression","name":"PrimaryExpression","referencingIds":["_ref_170"]},{"type":"production","id":"prod-Literal","name":"Literal","referencingIds":["_ref_172"]},{"type":"production","id":"prod-ReferenceExpression","name":"ReferenceExpression","referencingIds":["_ref_92","_ref_93","_ref_108","_ref_173","_ref_182","_ref_184"]},{"type":"production","id":"prod-ReferenceExpressionList","name":"ReferenceExpressionList","referencingIds":["_ref_111","_ref_183"]},{"type":"production","id":"prod-IdentifierOrMemberExpression","name":"IdentifierOrMemberExpression","referencingIds":["_ref_76","_ref_87","_ref_157","_ref_180","_ref_186","_ref_197"]},{"type":"production","id":"prod-TemplateArguments","name":"TemplateArguments","referencingIds":["_ref_181"]},{"type":"production","id":"prod-ParenthesizedExpression","name":"ParenthesizedExpression","referencingIds":["_ref_174"]},{"type":"production","id":"prod-ModelExpression","name":"ModelExpression","referencingIds":["_ref_175"]},{"type":"production","id":"prod-TupleExpression","name":"TupleExpression","referencingIds":["_ref_176"]},{"type":"production","id":"prod-ExpressionList","name":"ExpressionList","referencingIds":["_ref_188","_ref_191","_ref_193","_ref_199"]},{"type":"production","id":"prod-DecoratorList","name":"DecoratorList","referencingIds":["_ref_75","_ref_88","_ref_102","_ref_105","_ref_119","_ref_126","_ref_129","_ref_132","_ref_142","_ref_145","_ref_156","_ref_159","_ref_195"]},{"type":"production","id":"prod-Decorator","name":"Decorator","referencingIds":["_ref_196"]},{"type":"production","id":"prod-DecoratorArguments","name":"DecoratorArguments","referencingIds":["_ref_198"]},{"type":"clause","id":"syntactic-grammar","aoid":null,"titleHTML":"Syntactic Grammar","number":"2","referencingIds":[]}]}`);
1144;let usesMultipage = false</script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.0.1/styles/base16/solarized-light.min.css"><style>body {
1145 display: flex;
1146 font-size: 18px;
1147 line-height: 1.5;
1148 font-family: Cambria, Palatino Linotype, Palatino, Liberation Serif, serif;
1149 padding: 0;
1150 margin: 0;
1151 color: #111;
1152}
1153
1154#spec-container {
1155 padding: 0 20px;
1156 flex-grow: 1;
1157 flex-basis: 66%;
1158 box-sizing: border-box;
1159 overflow: hidden;
1160 padding-bottom: 1em;
1161}
1162
1163body.oldtoc {
1164 margin: 0 auto;
1165}
1166
1167a {
1168 text-decoration: none;
1169 color: #206ca7;
1170}
1171
1172a:visited {
1173 color: #206ca7;
1174}
1175
1176a:hover {
1177 text-decoration: underline;
1178 color: #239dee;
1179}
1180
1181a.e-user-code {
1182 white-space: nowrap;
1183}
1184
1185a.e-user-code::before {
1186 display: none;
1187 color: brown;
1188 background-color: white;
1189 border: 2pt solid brown;
1190 padding: 0.3ex;
1191 margin: 0 0.25em 0 0;
1192 line-height: 1;
1193 vertical-align: text-top;
1194 text-transform: uppercase;
1195 font-family: "Comic Code", sans-serif;
1196 font-weight: 900;
1197 font-size: x-small;
1198}
1199
1200a.e-user-code:hover::before {
1201 background-color: brown;
1202 color: white;
1203}
1204
1205html.show-ao-annotations a.e-user-code::before {
1206 display: inline-block;
1207}
1208
1209a.e-user-code::before {
1210 content: 'UC';
1211}
1212
1213code {
1214 font-weight: bold;
1215 font-family: Consolas, Monaco, monospace;
1216 white-space: pre;
1217}
1218
1219pre code {
1220 font-weight: inherit;
1221}
1222
1223pre code.hljs {
1224 background-color: #fff;
1225 margin: 0;
1226 padding: 0;
1227}
1228
1229ol.toc {
1230 list-style: none;
1231 padding-left: 0;
1232}
1233
1234ol.toc ol.toc {
1235 padding-left: 2ex;
1236 list-style: none;
1237}
1238
1239var {
1240 color: #2aa198;
1241 transition: background-color 0.25s ease;
1242 cursor: pointer;
1243}
1244
1245var.referenced0 {
1246 color: inherit;
1247 background-color: #ffff33;
1248 box-shadow: 0 0 0 2px #ffff33;
1249}
1250var.referenced1 {
1251 color: inherit;
1252 background-color: #ff87a2;
1253 box-shadow: 0 0 0 2px #ff87a2;
1254}
1255var.referenced2 {
1256 color: inherit;
1257 background-color: #96e885;
1258 box-shadow: 0 0 0 2px #96e885;
1259}
1260var.referenced3 {
1261 color: inherit;
1262 background-color: #3eeed2;
1263 box-shadow: 0 0 0 2px #3eeed2;
1264}
1265var.referenced4 {
1266 color: inherit;
1267 background-color: #eacfb6;
1268 box-shadow: 0 0 0 2px #eacfb6;
1269}
1270var.referenced5 {
1271 color: inherit;
1272 background-color: #82ddff;
1273 box-shadow: 0 0 0 2px #82ddff;
1274}
1275var.referenced6 {
1276 color: inherit;
1277 background-color: #ffbcf2;
1278 box-shadow: 0 0 0 2px #ffbcf2;
1279}
1280
1281emu-const {
1282 font-family: sans-serif;
1283}
1284
1285emu-val {
1286 font-weight: bold;
1287}
1288
1289/* depth 1 */
1290emu-alg ol,
1291/* depth 4 */
1292emu-alg ol ol ol ol,
1293emu-alg ol.nested-thrice,
1294emu-alg ol.nested-twice ol,
1295emu-alg ol.nested-once ol ol {
1296 list-style-type: decimal;
1297}
1298
1299/* depth 2 */
1300emu-alg ol ol,
1301emu-alg ol.nested-once,
1302/* depth 5 */
1303emu-alg ol ol ol ol ol,
1304emu-alg ol.nested-four-times,
1305emu-alg ol.nested-thrice ol,
1306emu-alg ol.nested-twice ol ol,
1307emu-alg ol.nested-once ol ol ol {
1308 list-style-type: lower-alpha;
1309}
1310
1311/* depth 3 */
1312emu-alg ol ol ol,
1313emu-alg ol.nested-twice,
1314emu-alg ol.nested-once ol,
1315/* depth 6 */
1316emu-alg ol ol ol ol ol ol,
1317emu-alg ol.nested-lots,
1318emu-alg ol.nested-four-times ol,
1319emu-alg ol.nested-thrice ol ol,
1320emu-alg ol.nested-twice ol ol ol,
1321emu-alg ol.nested-once ol ol ol ol,
1322/* depth 7+ */
1323emu-alg ol.nested-lots ol {
1324 list-style-type: lower-roman;
1325}
1326
1327emu-eqn {
1328 display: block;
1329 margin-left: 4em;
1330}
1331
1332emu-eqn.inline {
1333 display: inline;
1334 margin: 0;
1335}
1336
1337emu-eqn div:first-child {
1338 margin-left: -2em;
1339}
1340
1341emu-note {
1342 margin: 1em 0;
1343 display: flex;
1344 flex-direction: row;
1345 color: inherit;
1346 border-left: 5px solid #52e052;
1347 background: #e9fbe9;
1348 padding: 10px 10px 10px 0;
1349}
1350
1351emu-note > span.note {
1352 flex-basis: 100px;
1353 min-width: 100px;
1354 flex-grow: 0;
1355 flex-shrink: 1;
1356 text-transform: uppercase;
1357 padding-left: 5px;
1358}
1359
1360emu-note[type='editor'] {
1361 border-left-color: #faa;
1362}
1363
1364emu-note > div.note-contents {
1365 flex-grow: 1;
1366 flex-shrink: 1;
1367 overflow: auto;
1368}
1369
1370emu-note > div.note-contents > p:first-of-type {
1371 margin-top: 0;
1372}
1373
1374emu-note > div.note-contents > p:last-of-type {
1375 margin-bottom: 0;
1376}
1377
1378emu-table td code {
1379 white-space: normal;
1380}
1381
1382emu-figure {
1383 display: block;
1384}
1385
1386emu-example {
1387 display: block;
1388 margin: 1em 3em;
1389}
1390
1391emu-example figure figcaption {
1392 margin-top: 0.5em;
1393 text-align: left;
1394}
1395
1396emu-figure figure,
1397emu-example figure,
1398emu-table figure {
1399 display: flex;
1400 flex-direction: column;
1401 align-items: center;
1402}
1403
1404emu-production {
1405 display: block;
1406}
1407
1408emu-grammar[type='example'] emu-production,
1409emu-grammar[type='definition'] emu-production {
1410 margin-top: 1em;
1411 margin-bottom: 1em;
1412 margin-left: 5ex;
1413}
1414
1415emu-grammar.inline,
1416emu-production.inline,
1417emu-grammar.inline emu-production emu-rhs,
1418emu-production.inline emu-rhs,
1419emu-grammar[collapsed] emu-production emu-rhs {
1420 display: inline;
1421 padding-left: 1ex;
1422 margin-left: 0;
1423}
1424
1425emu-production[collapsed] emu-rhs {
1426 display: inline;
1427 padding-left: 0.5ex;
1428 margin-left: 0;
1429}
1430
1431emu-grammar[collapsed] emu-production,
1432emu-production[collapsed] {
1433 margin: 0;
1434}
1435
1436emu-constraints {
1437 font-size: 0.75em;
1438 margin-right: 0.5ex;
1439}
1440
1441emu-gann {
1442 margin-right: 0.5ex;
1443}
1444
1445emu-gann emu-t:last-child,
1446emu-gann emu-gprose:last-child,
1447emu-gann emu-nt:last-child {
1448 margin-right: 0;
1449}
1450
1451emu-geq {
1452 margin-left: 0.5ex;
1453 font-weight: bold;
1454}
1455
1456emu-oneof {
1457 font-weight: bold;
1458 margin-left: 0.5ex;
1459}
1460
1461emu-nt {
1462 display: inline-block;
1463 font-style: italic;
1464 white-space: nowrap;
1465 text-indent: 0;
1466}
1467
1468emu-nt a,
1469emu-nt a:visited {
1470 color: #333;
1471}
1472
1473emu-rhs emu-nt {
1474 margin-right: 0.5ex;
1475}
1476
1477emu-t {
1478 display: inline-block;
1479 font-family: monospace;
1480 font-weight: bold;
1481 white-space: nowrap;
1482 text-indent: 0;
1483}
1484
1485emu-production emu-t {
1486 margin-right: 0.5ex;
1487}
1488
1489emu-rhs {
1490 display: block;
1491 padding-left: 75px;
1492 text-indent: -25px;
1493}
1494
1495emu-production:not([collapsed]) emu-rhs {
1496 border: 0.2ex dashed transparent;
1497}
1498
1499emu-production:not([collapsed]) emu-rhs:hover {
1500 border-color: #888;
1501 background-color: #f0f0f0;
1502}
1503
1504emu-mods {
1505 font-size: 0.85em;
1506 vertical-align: sub;
1507 font-style: normal;
1508 font-weight: normal;
1509}
1510
1511emu-params,
1512emu-opt {
1513 margin-right: 1ex;
1514 font-family: monospace;
1515}
1516
1517emu-params,
1518emu-constraints {
1519 color: #2aa198;
1520}
1521
1522emu-opt {
1523 color: #b58900;
1524}
1525
1526emu-gprose {
1527 font-size: 0.9em;
1528 font-family: Helvetica, Arial, sans-serif;
1529}
1530
1531emu-production emu-gprose {
1532 margin-right: 1ex;
1533}
1534
1535h1.shortname {
1536 color: #f60;
1537 font-size: 1.5em;
1538 margin: 0;
1539}
1540
1541h1.version {
1542 color: #f60;
1543 font-size: 1.5em;
1544}
1545
1546h1.title {
1547 color: #f60;
1548}
1549
1550h1,
1551h2,
1552h3,
1553h4,
1554h5,
1555h6 {
1556 position: relative;
1557}
1558
1559h1 .secnum {
1560 text-decoration: none;
1561 margin-right: 5px;
1562}
1563
1564h1 span.title {
1565 order: 2;
1566}
1567
1568h1 {
1569 font-size: 2.67em;
1570 margin-bottom: 0;
1571 line-height: 1em;
1572}
1573h2 {
1574 font-size: 2em;
1575}
1576h3 {
1577 font-size: 1.56em;
1578}
1579h4 {
1580 font-size: 1.25em;
1581}
1582h5 {
1583 font-size: 1.11em;
1584}
1585h6 {
1586 font-size: 1em;
1587}
1588
1589pre code.hljs {
1590 background: transparent;
1591}
1592
1593emu-clause[id],
1594emu-annex[id],
1595emu-intro[id] {
1596 scroll-margin-top: 2ex;
1597}
1598
1599emu-intro h1,
1600emu-clause h1,
1601emu-annex h1 {
1602 font-size: 2em;
1603}
1604emu-intro h2,
1605emu-clause h2,
1606emu-annex h2 {
1607 font-size: 1.56em;
1608}
1609emu-intro h3,
1610emu-clause h3,
1611emu-annex h3 {
1612 font-size: 1.25em;
1613}
1614emu-intro h4,
1615emu-clause h4,
1616emu-annex h4 {
1617 font-size: 1.11em;
1618}
1619emu-intro h5,
1620emu-clause h5,
1621emu-annex h5 {
1622 font-size: 1em;
1623}
1624emu-intro h6,
1625emu-clause h6,
1626emu-annex h6 {
1627 font-size: 0.9em;
1628}
1629emu-intro emu-intro h1,
1630emu-clause emu-clause h1,
1631emu-annex emu-annex h1 {
1632 font-size: 1.56em;
1633}
1634emu-intro emu-intro h2,
1635emu-clause emu-clause h2,
1636emu-annex emu-annex h2 {
1637 font-size: 1.25em;
1638}
1639emu-intro emu-intro h3,
1640emu-clause emu-clause h3,
1641emu-annex emu-annex h3 {
1642 font-size: 1.11em;
1643}
1644emu-intro emu-intro h4,
1645emu-clause emu-clause h4,
1646emu-annex emu-annex h4 {
1647 font-size: 1em;
1648}
1649emu-intro emu-intro h5,
1650emu-clause emu-clause h5,
1651emu-annex emu-annex h5 {
1652 font-size: 0.9em;
1653}
1654emu-intro emu-intro emu-intro h1,
1655emu-clause emu-clause emu-clause h1,
1656emu-annex emu-annex emu-annex h1 {
1657 font-size: 1.25em;
1658}
1659emu-intro emu-intro emu-intro h2,
1660emu-clause emu-clause emu-clause h2,
1661emu-annex emu-annex emu-annex h2 {
1662 font-size: 1.11em;
1663}
1664emu-intro emu-intro emu-intro h3,
1665emu-clause emu-clause emu-clause h3,
1666emu-annex emu-annex emu-annex h3 {
1667 font-size: 1em;
1668}
1669emu-intro emu-intro emu-intro h4,
1670emu-clause emu-clause emu-clause h4,
1671emu-annex emu-annex emu-annex h4 {
1672 font-size: 0.9em;
1673}
1674emu-intro emu-intro emu-intro emu-intro h1,
1675emu-clause emu-clause emu-clause emu-clause h1,
1676emu-annex emu-annex emu-annex emu-annex h1 {
1677 font-size: 1.11em;
1678}
1679emu-intro emu-intro emu-intro emu-intro h2,
1680emu-clause emu-clause emu-clause emu-clause h2,
1681emu-annex emu-annex emu-annex emu-annex h2 {
1682 font-size: 1em;
1683}
1684emu-intro emu-intro emu-intro emu-intro h3,
1685emu-clause emu-clause emu-clause emu-clause h3,
1686emu-annex emu-annex emu-annex emu-annex h3 {
1687 font-size: 0.9em;
1688}
1689emu-intro emu-intro emu-intro emu-intro emu-intro h1,
1690emu-clause emu-clause emu-clause emu-clause emu-clause h1,
1691emu-annex emu-annex emu-annex emu-annex emu-annex h1 {
1692 font-size: 1em;
1693}
1694emu-intro emu-intro emu-intro emu-intro emu-intro h2,
1695emu-clause emu-clause emu-clause emu-clause emu-clause h2,
1696emu-annex emu-annex emu-annex emu-annex emu-annex h2 {
1697 font-size: 0.9em;
1698}
1699emu-intro emu-intro emu-intro emu-intro emu-intro emu-intro h1,
1700emu-clause emu-clause emu-clause emu-clause emu-clause emu-clause h1,
1701emu-annex emu-annex emu-annex emu-annex emu-annex emu-annex h1 {
1702 font-size: 0.9em;
1703}
1704
1705emu-clause,
1706emu-intro,
1707emu-annex {
1708 display: block;
1709}
1710
1711/* these values are twice the font-size for the <h1> titles for clauses */
1712emu-intro,
1713emu-clause,
1714emu-annex {
1715 margin-top: 4em;
1716}
1717emu-intro emu-intro,
1718emu-clause emu-clause,
1719emu-annex emu-annex {
1720 margin-top: 3.12em;
1721}
1722emu-intro emu-intro emu-intro,
1723emu-clause emu-clause emu-clause,
1724emu-annex emu-annex emu-annex {
1725 margin-top: 2.5em;
1726}
1727emu-intro emu-intro emu-intro emu-intro,
1728emu-clause emu-clause emu-clause emu-clause,
1729emu-annex emu-annex emu-annex emu-annex {
1730 margin-top: 2.22em;
1731}
1732emu-intro emu-intro emu-intro emu-intro emu-intro,
1733emu-clause emu-clause emu-clause emu-clause emu-clause,
1734emu-annex emu-annex emu-annex emu-annex emu-annex {
1735 margin-top: 2em;
1736}
1737emu-intro emu-intro emu-intro emu-intro emu-intro emu-intro,
1738emu-clause emu-clause emu-clause emu-clause emu-clause emu-clause,
1739emu-annex emu-annex emu-annex emu-annex emu-annex emu-annex {
1740 margin-top: 1.8em;
1741}
1742
1743#spec-container > emu-intro:first-of-type,
1744#spec-container > emu-clause:first-of-type,
1745#spec-container > emu-annex:first-of-type {
1746 margin-top: 0;
1747}
1748
1749/* Figures and tables */
1750figure {
1751 display: block;
1752 margin: 1em 0 3em 0;
1753}
1754figure object {
1755 display: block;
1756 margin: 0 auto;
1757}
1758figure table.real-table {
1759 margin: 0 auto;
1760}
1761figure figcaption {
1762 display: block;
1763 color: #555555;
1764 font-weight: bold;
1765 text-align: center;
1766}
1767
1768emu-table table {
1769 margin: 0 auto;
1770}
1771
1772emu-table table,
1773table.real-table {
1774 border-collapse: collapse;
1775}
1776
1777emu-table td,
1778emu-table th,
1779table.real-table td,
1780table.real-table th {
1781 border: 1px solid black;
1782 padding: 0.4em;
1783 vertical-align: baseline;
1784}
1785emu-table th,
1786emu-table thead td,
1787table.real-table th {
1788 background-color: #eeeeee;
1789}
1790
1791emu-table td {
1792 background: #fff;
1793}
1794
1795/* Note: the left content edges of table.lightweight-table >tbody >tr >td
1796 and div.display line up. */
1797table.lightweight-table {
1798 border-collapse: collapse;
1799 margin: 0 0 0 1.5em;
1800}
1801table.lightweight-table td,
1802table.lightweight-table th {
1803 border: none;
1804 padding: 0 0.5em;
1805 vertical-align: baseline;
1806}
1807
1808/* diff styles */
1809ins {
1810 background-color: #e0f8e0;
1811 text-decoration: none;
1812 border-bottom: 1px solid #396;
1813}
1814
1815del {
1816 background-color: #fee;
1817}
1818
1819ins.block,
1820del.block,
1821emu-production > ins,
1822emu-production > del,
1823emu-grammar > ins,
1824emu-grammar > del {
1825 display: block;
1826}
1827emu-rhs > ins,
1828emu-rhs > del {
1829 display: inline;
1830}
1831
1832tr.ins > td > ins {
1833 border-bottom: none;
1834}
1835
1836tr.ins > td {
1837 background-color: #e0f8e0;
1838}
1839
1840tr.del > td {
1841 background-color: #fee;
1842}
1843
1844/* Menu Styles */
1845#menu-toggle {
1846 font-size: 2em;
1847
1848 position: fixed;
1849 top: 0;
1850 left: 0;
1851 width: 1.5em;
1852 height: 1.5em;
1853 z-index: 3;
1854 visibility: hidden;
1855 color: #1567a2;
1856 background-color: #fff;
1857
1858 line-height: 1.5em;
1859 text-align: center;
1860 -webkit-touch-callout: none;
1861 -webkit-user-select: none;
1862 -khtml-user-select: none;
1863 -moz-user-select: none;
1864 -ms-user-select: none;
1865 user-select: none;
1866
1867 cursor: pointer;
1868}
1869
1870#menu {
1871 display: flex;
1872 flex-direction: column;
1873 width: 33%;
1874 height: 100vh;
1875 max-width: 500px;
1876 box-sizing: border-box;
1877 background-color: #ddd;
1878 overflow: hidden;
1879 transition: opacity 0.1s linear;
1880 padding: 0 5px;
1881 position: fixed;
1882 left: 0;
1883 top: 0;
1884 border-right: 2px solid #bbb;
1885
1886 z-index: 2;
1887}
1888
1889#menu-spacer {
1890 flex-basis: 33%;
1891 max-width: 500px;
1892 flex-grow: 0;
1893 flex-shrink: 0;
1894}
1895
1896#menu a {
1897 color: #1567a2;
1898}
1899
1900#menu.active {
1901 display: flex;
1902 opacity: 1;
1903 z-index: 2;
1904}
1905
1906#menu-pins {
1907 flex-grow: 1;
1908 display: none;
1909}
1910
1911#menu-pins.active {
1912 display: block;
1913}
1914
1915#menu-pins-list {
1916 margin: 0;
1917 padding: 0;
1918 counter-reset: pins-counter;
1919}
1920
1921#menu-pins-list > li:before {
1922 content: counter(pins-counter);
1923 counter-increment: pins-counter;
1924 display: inline-block;
1925 width: 25px;
1926 text-align: center;
1927 border: 1px solid #bbb;
1928 padding: 2px;
1929 margin: 4px;
1930 box-sizing: border-box;
1931 line-height: 1em;
1932 background-color: #ccc;
1933 border-radius: 4px;
1934}
1935#menu-toc > ol {
1936 padding: 0;
1937 flex-grow: 1;
1938}
1939
1940#menu-toc > ol li {
1941 padding: 0;
1942}
1943
1944#menu-toc > ol,
1945#menu-toc > ol ol {
1946 list-style-type: none;
1947 margin: 0;
1948 padding: 0;
1949}
1950
1951#menu-toc > ol ol {
1952 padding-left: 0.75em;
1953}
1954
1955#menu-toc li {
1956 text-overflow: ellipsis;
1957 overflow: hidden;
1958 white-space: nowrap;
1959}
1960
1961#menu-toc .item-toggle {
1962 display: inline-block;
1963 transform: rotate(-45deg) translate(-5px, -5px);
1964 transition: transform 0.1s ease;
1965 text-align: center;
1966 width: 20px;
1967
1968 color: #aab;
1969
1970 -webkit-touch-callout: none;
1971 -webkit-user-select: none;
1972 -khtml-user-select: none;
1973 -moz-user-select: none;
1974 -ms-user-select: none;
1975 user-select: none;
1976
1977 cursor: pointer;
1978}
1979
1980#menu-toc .item-toggle-none {
1981 display: inline-block;
1982 width: 20px;
1983}
1984
1985#menu-toc li.active > .item-toggle {
1986 transform: rotate(45deg) translate(-5px, -5px);
1987}
1988
1989#menu-toc li > ol {
1990 display: none;
1991}
1992
1993#menu-toc li.active > ol {
1994 display: block;
1995}
1996
1997#menu-toc li.revealed > a {
1998 background-color: #bbb;
1999 font-weight: bold;
2000 /*
2001 background-color: #222;
2002 color: #c6d8e4;
2003 */
2004}
2005
2006#menu-toc li.revealed-leaf > a {
2007 color: #206ca7;
2008 /*
2009 background-color: #222;
2010 color: #c6d8e4;
2011 */
2012}
2013
2014#menu-toc li.revealed > .item-toggle {
2015 transform: rotate(45deg) translate(-5px, -5px);
2016}
2017
2018#menu-toc li.revealed > ol {
2019 display: block;
2020}
2021
2022#menu-toc li > a {
2023 padding: 2px 5px;
2024}
2025
2026#menu > * {
2027 margin-bottom: 5px;
2028}
2029
2030.menu-pane-header {
2031 padding: 0 5px;
2032 text-transform: uppercase;
2033 background-color: #aaa;
2034 color: #335;
2035 font-weight: bold;
2036 letter-spacing: 2px;
2037 flex-grow: 0;
2038 flex-shrink: 0;
2039 font-size: 0.8em;
2040}
2041
2042.menu-pane-header emu-opt,
2043.menu-pane-header emu-t,
2044.menu-pane-header emu-nt {
2045 margin-right: 0px;
2046 display: inline;
2047 color: inherit;
2048}
2049
2050.menu-pane-header emu-rhs {
2051 display: inline;
2052 padding-left: 0px;
2053 text-indent: 0px;
2054}
2055
2056.menu-pane-header emu-geq {
2057 margin-left: 0px;
2058}
2059
2060a.menu-pane-header-production {
2061 color: inherit;
2062}
2063
2064.menu-pane-header-production {
2065 text-transform: none;
2066 letter-spacing: 1.5px;
2067 padding-left: 0.5em;
2068}
2069
2070#menu-toc {
2071 display: flex;
2072 flex-direction: column;
2073 width: 100%;
2074 overflow: hidden;
2075 flex-grow: 1;
2076}
2077
2078#menu-toc ol.toc {
2079 overflow-x: hidden;
2080 overflow-y: auto;
2081}
2082
2083#menu-search {
2084 position: relative;
2085 flex-grow: 0;
2086 flex-shrink: 0;
2087 width: 100%;
2088
2089 display: flex;
2090 flex-direction: column;
2091
2092 max-height: 300px;
2093}
2094
2095#menu-trace-list {
2096 display: none;
2097}
2098
2099#menu-search-box {
2100 box-sizing: border-box;
2101 display: block;
2102 width: 100%;
2103 margin: 5px 0 0 0;
2104 font-size: 1em;
2105 padding: 2px;
2106 background-color: #bbb;
2107 border: 1px solid #999;
2108}
2109
2110#menu-search-results {
2111 overflow-x: hidden;
2112 overflow-y: auto;
2113}
2114
2115li.menu-search-result-clause:before {
2116 content: 'clause';
2117 width: 40px;
2118 display: inline-block;
2119 text-align: right;
2120 padding-right: 1ex;
2121 color: #666;
2122 font-size: 75%;
2123}
2124li.menu-search-result-op:before {
2125 content: 'op';
2126 width: 40px;
2127 display: inline-block;
2128 text-align: right;
2129 padding-right: 1ex;
2130 color: #666;
2131 font-size: 75%;
2132}
2133
2134li.menu-search-result-prod:before {
2135 content: 'prod';
2136 width: 40px;
2137 display: inline-block;
2138 text-align: right;
2139 padding-right: 1ex;
2140 color: #666;
2141 font-size: 75%;
2142}
2143
2144li.menu-search-result-term:before {
2145 content: 'term';
2146 width: 40px;
2147 display: inline-block;
2148 text-align: right;
2149 padding-right: 1ex;
2150 color: #666;
2151 font-size: 75%;
2152}
2153
2154#menu-search-results ul {
2155 padding: 0 5px;
2156 margin: 0;
2157}
2158
2159#menu-search-results li {
2160 white-space: nowrap;
2161 text-overflow: ellipsis;
2162}
2163
2164#menu-trace-list {
2165 counter-reset: item;
2166 margin: 0 0 0 20px;
2167 padding: 0;
2168}
2169#menu-trace-list li {
2170 display: block;
2171 white-space: nowrap;
2172}
2173
2174#menu-trace-list li .secnum:after {
2175 content: ' ';
2176}
2177#menu-trace-list li:before {
2178 content: counter(item) ' ';
2179 background-color: #222;
2180 counter-increment: item;
2181 color: #999;
2182 width: 20px;
2183 height: 20px;
2184 line-height: 20px;
2185 display: inline-block;
2186 text-align: center;
2187 margin: 2px 4px 2px 0;
2188}
2189
2190@media (max-width: 1000px) {
2191 body {
2192 margin: 0;
2193 display: block;
2194 }
2195
2196 #menu {
2197 display: none;
2198 padding-top: 3em;
2199 width: 450px;
2200 }
2201
2202 #menu.active {
2203 position: fixed;
2204 height: 100%;
2205 left: 0;
2206 top: 0;
2207 right: 300px;
2208 }
2209
2210 #menu-toggle {
2211 visibility: visible;
2212 }
2213
2214 #spec-container {
2215 padding: 0 5px;
2216 }
2217
2218 #references-pane-spacer {
2219 display: none;
2220 }
2221}
2222
2223@media only screen and (max-width: 800px) {
2224 #menu {
2225 width: 100%;
2226 }
2227
2228 h1 .secnum:empty {
2229 margin: 0;
2230 padding: 0;
2231 }
2232}
2233
2234/* Toolbox */
2235.toolbox-container {
2236 position: absolute;
2237 display: none;
2238 padding-bottom: 7px;
2239}
2240
2241.toolbox-container.active {
2242 display: inline-block;
2243}
2244
2245.toolbox {
2246 position: relative;
2247 background: #ddd;
2248 border: 1px solid #aaa;
2249 color: #eee;
2250 padding: 5px;
2251 border-radius: 3px;
2252}
2253
2254.toolbox a {
2255 text-decoration: none;
2256 padding: 0 5px;
2257}
2258
2259.toolbox a:hover {
2260 text-decoration: underline;
2261}
2262
2263.toolbox:after,
2264.toolbox:before {
2265 top: 100%;
2266 left: 15px;
2267 border: solid transparent;
2268 content: ' ';
2269 height: 0;
2270 width: 0;
2271 position: absolute;
2272 pointer-events: none;
2273}
2274
2275.toolbox:after {
2276 border-color: rgba(0, 0, 0, 0);
2277 border-top-color: #ddd;
2278 border-width: 10px;
2279 margin-left: -10px;
2280}
2281.toolbox:before {
2282 border-color: rgba(204, 204, 204, 0);
2283 border-top-color: #aaa;
2284 border-width: 12px;
2285 margin-left: -12px;
2286}
2287
2288#references-pane-container {
2289 position: fixed;
2290 bottom: 0;
2291 left: 0;
2292 right: 0;
2293 height: 250px;
2294 display: none;
2295 background-color: #ddd;
2296 z-index: 1;
2297}
2298
2299#references-pane-table-container {
2300 overflow-x: hidden;
2301 overflow-y: auto;
2302}
2303
2304#references-pane-spacer {
2305 flex-basis: 33%;
2306 max-width: 500px;
2307}
2308
2309#references-pane {
2310 flex-grow: 1;
2311 overflow: hidden;
2312 display: flex;
2313 flex-direction: column;
2314}
2315
2316#references-pane-container.active {
2317 display: flex;
2318}
2319
2320#references-pane-close:after {
2321 content: '✖';
2322 float: right;
2323 cursor: pointer;
2324}
2325
2326#references-pane table tr td:first-child {
2327 text-align: right;
2328 padding-right: 5px;
2329}
2330
2331@media print {
2332 #menu-toggle {
2333 display: none;
2334 }
2335}
2336
2337[normative-optional],
2338[legacy] {
2339 border-left: 5px solid #ff6600;
2340 padding: 0.5em;
2341 display: block;
2342 background: #ffeedd;
2343}
2344
2345.clause-attributes-tag {
2346 text-transform: uppercase;
2347 color: #884400;
2348}
2349
2350.clause-attributes-tag a {
2351 color: #884400;
2352}
2353</style></head><body><div id="menu-toggle"><svg xmlns="http://www.w3.org/2000/svg" style="width:100%; height:100%; stroke:currentColor" viewBox="0 0 120 120">
2354 <title>Menu</title>
2355 <path stroke-width="10" stroke-linecap="round" d="M30,60 h60 M30,30 m0,5 h60 M30,90 m0,-5 h60"></path>
2356 </svg></div><div id="menu-spacer"></div><div id="menu"><div id="menu-search"><input type="text" id="menu-search-box" placeholder="Search..."><div id="menu-search-results" class="inactive"></div></div><div id="menu-pins"><div class="menu-pane-header">Pins</div><ul id="menu-pins-list"></ul></div><div class="menu-pane-header">Table of Contents</div><div id="menu-toc"><ol class="toc"><li><span class="item-toggle-none"></span><a href="#intro" title="Introduction">Introduction</a></li><li><span class="item-toggle-none"></span><a href="#lexical-grammar" title="Lexical Grammar"><span class="secnum">1</span> Lexical Grammar</a></li><li><span class="item-toggle-none"></span><a href="#syntactic-grammar" title="Syntactic Grammar"><span class="secnum">2</span> Syntactic Grammar</a></li></ol></div></div><div id="spec-container">
2357
2358<emu-intro id="intro">
2359<h1>Introduction</h1>
2360<p>This document will eventually have a full specification for Cadl. For now, it just has the grammar below.</p>
2361</emu-intro>
2362
2363<emu-clause id="lexical-grammar">
2364<h1><span class="secnum">1</span> Lexical Grammar</h1>
2365<emu-grammar type="definition"><emu-production name="SourceCharacter" id="prod-SourceCharacter">
2366 <emu-nt><a href="#prod-SourceCharacter">SourceCharacter</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="xks4vqzw"><emu-gprose>any Unicode code point</emu-gprose></emu-rhs>
2367</emu-production>
2368<emu-production name="InputElement" id="prod-InputElement">
2369 <emu-nt><a href="#prod-InputElement">InputElement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="orqeuwg2"><emu-nt id="_ref_0"><a href="#prod-Token">Token</a></emu-nt></emu-rhs>
2370 <emu-rhs a="kg5yghiq"><emu-nt id="_ref_1"><a href="#prod-Trivia">Trivia</a></emu-nt></emu-rhs>
2371</emu-production>
2372<emu-production name="Token" id="prod-Token">
2373 <emu-nt><a href="#prod-Token">Token</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="o5jua5_x"><emu-nt id="_ref_2"><a href="#prod-Keyword">Keyword</a></emu-nt></emu-rhs>
2374 <emu-rhs a="bras6mo_"><emu-nt id="_ref_3"><a href="#prod-Identifier">Identifier</a></emu-nt></emu-rhs>
2375 <emu-rhs a="pui0b1rt"><emu-nt id="_ref_4"><a href="#prod-NumericLiteral">NumericLiteral</a></emu-nt></emu-rhs>
2376 <emu-rhs a="xhtltz00"><emu-nt id="_ref_5"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt></emu-rhs>
2377 <emu-rhs a="7hjz1m8p"><emu-nt id="_ref_6"><a href="#prod-Punctuator">Punctuator</a></emu-nt></emu-rhs>
2378</emu-production>
2379<emu-production name="Trivia" id="prod-Trivia">
2380 <emu-nt><a href="#prod-Trivia">Trivia</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ft16wloj"><emu-nt id="_ref_7"><a href="#prod-Comment">Comment</a></emu-nt></emu-rhs>
2381 <emu-rhs a="fctcswat"><emu-nt id="_ref_8"><a href="#prod-WhiteSpace">WhiteSpace</a></emu-nt></emu-rhs>
2382</emu-production>
2383<emu-production name="Keyword" id="prod-Keyword">
2384 <emu-nt><a href="#prod-Keyword">Keyword</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="nqjh_sxl"><emu-nt id="_ref_9"><a href="#prod-BooleanLiteral">BooleanLiteral</a></emu-nt></emu-rhs>
2385 <emu-rhs a="azcs9apw"><emu-t>import</emu-t></emu-rhs>
2386 <emu-rhs a="-mdwbm0b"><emu-t>model</emu-t></emu-rhs>
2387 <emu-rhs a="lpev-y-g"><emu-t>namespace</emu-t></emu-rhs>
2388 <emu-rhs a="ytodrzn0"><emu-t>op</emu-t></emu-rhs>
2389 <emu-rhs a="rmwjtwx9"><emu-t>extends</emu-t></emu-rhs>
2390 <emu-rhs a="8d2nu2lj"><emu-t>using</emu-t></emu-rhs>
2391</emu-production>
2392<emu-production name="Identifier" id="prod-Identifier">
2393 <emu-nt><a href="#prod-Identifier">Identifier</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="exwdmcdi"><emu-nt id="_ref_10"><a href="#prod-IdentifierName">IdentifierName</a></emu-nt> <emu-gmod>but not <emu-nt id="_ref_11"><a href="#prod-Keyword">Keyword</a></emu-nt></emu-gmod></emu-rhs>
2394</emu-production>
2395<emu-production name="IdentifierName" id="prod-IdentifierName">
2396 <emu-nt><a href="#prod-IdentifierName">IdentifierName</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="q0afq8g8"><emu-nt id="_ref_12"><a href="#prod-IdentifierStart">IdentifierStart</a></emu-nt></emu-rhs>
2397 <emu-rhs a="amguopqs">
2398 <emu-nt id="_ref_13"><a href="#prod-IdentifierName">IdentifierName</a></emu-nt>
2399 <emu-nt id="_ref_14"><a href="#prod-IdentifierContinue">IdentifierContinue</a></emu-nt>
2400 </emu-rhs>
2401</emu-production>
2402<emu-production name="IdentifierStart" id="prod-IdentifierStart">
2403 <emu-nt><a href="#prod-IdentifierStart">IdentifierStart</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="exubo7yu"><emu-nt id="_ref_15"><a href="#prod-IdentifierContinue">IdentifierContinue</a></emu-nt> <emu-gmod>but not <emu-nt id="_ref_16"><a href="#prod-DecimalDigit">DecimalDigit</a></emu-nt></emu-gmod></emu-rhs>
2404</emu-production>
2405<emu-production name="IdentifierContinue" id="prod-IdentifierContinue">
2406 <emu-nt><a href="#prod-IdentifierContinue">IdentifierContinue</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="7q8tumk4"><emu-nt id="_ref_17"><a href="#prod-AsciiLetter">AsciiLetter</a></emu-nt></emu-rhs>
2407 <emu-rhs a="s4me4hlz"><emu-nt id="_ref_18"><a href="#prod-DecimalDigit">DecimalDigit</a></emu-nt></emu-rhs>
2408 <emu-rhs a="emlmkqfm"><emu-t>$</emu-t></emu-rhs>
2409 <emu-rhs a="b1zllonv"><emu-t>_</emu-t></emu-rhs>
2410 <emu-rhs a="bpnwye-j"><emu-gprose>any assigned Unicode code point greater than U+007F that does not have any of the following property values: General_Category=Surrogate, Control or Private_Use, Noncharacter_Code_Point=True, or Pattern_White_Space=True</emu-gprose></emu-rhs>
2411</emu-production>
2412<emu-production name="AsciiLetter" oneof="" id="prod-AsciiLetter">
2413 <emu-nt><a href="#prod-AsciiLetter">AsciiLetter</a></emu-nt> <emu-geq>:</emu-geq> <emu-oneof>one of</emu-oneof> <emu-rhs><emu-t>A</emu-t> <emu-t>B</emu-t> <emu-t>C</emu-t> <emu-t>D</emu-t> <emu-t>E</emu-t> <emu-t>F</emu-t> <emu-t>G</emu-t> <emu-t>H</emu-t> <emu-t>I</emu-t> <emu-t>J</emu-t> <emu-t>K</emu-t> <emu-t>L</emu-t> <emu-t>M</emu-t> <emu-t>N</emu-t> <emu-t>O</emu-t> <emu-t>P</emu-t> <emu-t>Q</emu-t> <emu-t>R</emu-t> <emu-t>S</emu-t> <emu-t>T</emu-t> <emu-t>U</emu-t> <emu-t>V</emu-t> <emu-t>W</emu-t> <emu-t>X</emu-t> <emu-t>Y</emu-t> <emu-t>Z</emu-t> <emu-t>a</emu-t> <emu-t>b</emu-t> <emu-t>c</emu-t> <emu-t>d</emu-t> <emu-t>e</emu-t> <emu-t>f</emu-t> <emu-t>g</emu-t> <emu-t>h</emu-t> <emu-t>i</emu-t> <emu-t>j</emu-t> <emu-t>k</emu-t> <emu-t>l</emu-t> <emu-t>m</emu-t> <emu-t>n</emu-t> <emu-t>o</emu-t> <emu-t>p</emu-t> <emu-t>q</emu-t> <emu-t>r</emu-t> <emu-t>s</emu-t> <emu-t>t</emu-t> <emu-t>u</emu-t> <emu-t>v</emu-t> <emu-t>w</emu-t> <emu-t>x</emu-t> <emu-t>y</emu-t> <emu-t>z</emu-t></emu-rhs>
2414</emu-production>
2415<emu-production name="BooleanLiteral" id="prod-BooleanLiteral">
2416 <emu-nt><a href="#prod-BooleanLiteral">BooleanLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="-jc4xg27"><emu-t>true</emu-t></emu-rhs>
2417 <emu-rhs a="i9lgnxtt"><emu-t>false</emu-t></emu-rhs>
2418</emu-production>
2419<emu-production name="NumericLiteral" id="prod-NumericLiteral">
2420 <emu-nt><a href="#prod-NumericLiteral">NumericLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="gma1bw5s"><emu-nt id="_ref_19"><a href="#prod-DecimalLiteral">DecimalLiteral</a></emu-nt></emu-rhs>
2421 <emu-rhs a="hqxkzjla"><emu-nt id="_ref_20"><a href="#prod-HexIntegerLiteral">HexIntegerLiteral</a></emu-nt></emu-rhs>
2422 <emu-rhs a="09cd3aiw"><emu-nt id="_ref_21"><a href="#prod-BinaryIntegerLiteral">BinaryIntegerLiteral</a></emu-nt></emu-rhs>
2423</emu-production>
2424<emu-production name="DecimalLiteral" id="prod-DecimalLiteral">
2425 <emu-nt><a href="#prod-DecimalLiteral">DecimalLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="3xiaxvcb">
2426 <emu-nt id="_ref_22"><a href="#prod-DecimalIntegerLiteral">DecimalIntegerLiteral</a></emu-nt>
2427 <emu-t>.</emu-t>
2428 <emu-nt id="_ref_23"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt>
2429 <emu-nt optional="" id="_ref_24"><a href="#prod-ExponentPart">ExponentPart</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2430 </emu-rhs>
2431 <emu-rhs a="e9uvir9w">
2432 <emu-nt id="_ref_25"><a href="#prod-DecimalIntegerLiteral">DecimalIntegerLiteral</a></emu-nt>
2433 <emu-nt optional="" id="_ref_26"><a href="#prod-ExponentPart">ExponentPart</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2434 </emu-rhs>
2435</emu-production>
2436<emu-production name="DecimalIntegerLiteral" id="prod-DecimalIntegerLiteral">
2437 <emu-nt><a href="#prod-DecimalIntegerLiteral">DecimalIntegerLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="bxtox5eb"><emu-nt id="_ref_27"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt></emu-rhs>
2438 <emu-rhs a="o9f-v3mh">
2439 <emu-t>+</emu-t>
2440 <emu-nt id="_ref_28"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt>
2441 </emu-rhs>
2442 <emu-rhs a="waadsnwo">
2443 <emu-t>-</emu-t>
2444 <emu-nt id="_ref_29"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt>
2445 </emu-rhs>
2446</emu-production>
2447<emu-production name="DecimalDigits" id="prod-DecimalDigits">
2448 <emu-nt><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="s4me4hlz"><emu-nt id="_ref_30"><a href="#prod-DecimalDigit">DecimalDigit</a></emu-nt></emu-rhs>
2449 <emu-rhs a="nyugv7lw">
2450 <emu-nt id="_ref_31"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt>
2451 <emu-nt id="_ref_32"><a href="#prod-DecimalDigit">DecimalDigit</a></emu-nt>
2452 </emu-rhs>
2453</emu-production>
2454<emu-production name="DecimalDigit" oneof="" id="prod-DecimalDigit">
2455 <emu-nt><a href="#prod-DecimalDigit">DecimalDigit</a></emu-nt> <emu-geq>:</emu-geq> <emu-oneof>one of</emu-oneof> <emu-rhs><emu-t>0</emu-t> <emu-t>1</emu-t> <emu-t>2</emu-t> <emu-t>3</emu-t> <emu-t>4</emu-t> <emu-t>5</emu-t> <emu-t>6</emu-t> <emu-t>7</emu-t> <emu-t>8</emu-t> <emu-t>9</emu-t></emu-rhs>
2456</emu-production>
2457<emu-production name="ExponentPart" id="prod-ExponentPart">
2458 <emu-nt><a href="#prod-ExponentPart">ExponentPart</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="7jb-iaug">
2459 <emu-t>e</emu-t>
2460 <emu-nt id="_ref_33"><a href="#prod-DecimalIntegerLiteral">DecimalIntegerLiteral</a></emu-nt>
2461 </emu-rhs>
2462</emu-production>
2463<emu-production name="DecimalIntegerInteger" id="prod-DecimalIntegerInteger">
2464 <emu-nt><a href="#prod-DecimalIntegerInteger">DecimalIntegerInteger</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="bxtox5eb"><emu-nt id="_ref_34"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt></emu-rhs>
2465 <emu-rhs a="o9f-v3mh">
2466 <emu-t>+</emu-t>
2467 <emu-nt id="_ref_35"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt>
2468 </emu-rhs>
2469 <emu-rhs a="waadsnwo">
2470 <emu-t>-</emu-t>
2471 <emu-nt id="_ref_36"><a href="#prod-DecimalDigits">DecimalDigits</a></emu-nt>
2472 </emu-rhs>
2473</emu-production>
2474<emu-production name="HexIntegerLiteral" id="prod-HexIntegerLiteral">
2475 <emu-nt><a href="#prod-HexIntegerLiteral">HexIntegerLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="zxvbgn4l">
2476 <emu-t>0x</emu-t>
2477 <emu-nt id="_ref_37"><a href="#prod-HexDigits">HexDigits</a></emu-nt>
2478 </emu-rhs>
2479</emu-production>
2480<emu-production name="HexDigits" id="prod-HexDigits">
2481 <emu-nt><a href="#prod-HexDigits">HexDigits</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="omskcs0d"><emu-nt id="_ref_38"><a href="#prod-HexDigit">HexDigit</a></emu-nt></emu-rhs>
2482 <emu-rhs a="yciymy2l">
2483 <emu-nt id="_ref_39"><a href="#prod-HexDigits">HexDigits</a></emu-nt>
2484 <emu-nt id="_ref_40"><a href="#prod-HexDigit">HexDigit</a></emu-nt>
2485 </emu-rhs>
2486</emu-production>
2487<emu-production name="HexDigit" oneof="" id="prod-HexDigit">
2488 <emu-nt><a href="#prod-HexDigit">HexDigit</a></emu-nt> <emu-geq>:</emu-geq> <emu-oneof>one of</emu-oneof> <emu-rhs><emu-t>0</emu-t> <emu-t>1</emu-t> <emu-t>2</emu-t> <emu-t>3</emu-t> <emu-t>4</emu-t> <emu-t>5</emu-t> <emu-t>6</emu-t> <emu-t>7</emu-t> <emu-t>8</emu-t> <emu-t>9</emu-t> <emu-t>A</emu-t> <emu-t>B</emu-t> <emu-t>C</emu-t> <emu-t>D</emu-t> <emu-t>E</emu-t> <emu-t>F</emu-t> <emu-t>a</emu-t> <emu-t>b</emu-t> <emu-t>c</emu-t> <emu-t>d</emu-t> <emu-t>e</emu-t> <emu-t>f</emu-t></emu-rhs>
2489</emu-production>
2490<emu-production name="BinaryIntegerLiteral" id="prod-BinaryIntegerLiteral">
2491 <emu-nt><a href="#prod-BinaryIntegerLiteral">BinaryIntegerLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ya14f57w">
2492 <emu-t>0b</emu-t>
2493 <emu-nt id="_ref_41"><a href="#prod-BinaryDigits">BinaryDigits</a></emu-nt>
2494 </emu-rhs>
2495</emu-production>
2496<emu-production name="BinaryDigits" id="prod-BinaryDigits">
2497 <emu-nt><a href="#prod-BinaryDigits">BinaryDigits</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="5fhui2lc"><emu-nt id="_ref_42"><a href="#prod-BinaryDigit">BinaryDigit</a></emu-nt></emu-rhs>
2498 <emu-rhs a="gqp0qw4u">
2499 <emu-nt id="_ref_43"><a href="#prod-BinaryDigits">BinaryDigits</a></emu-nt>
2500 <emu-nt id="_ref_44"><a href="#prod-BinaryDigit">BinaryDigit</a></emu-nt>
2501 </emu-rhs>
2502</emu-production>
2503<emu-production name="BinaryDigit" oneof="" id="prod-BinaryDigit">
2504 <emu-nt><a href="#prod-BinaryDigit">BinaryDigit</a></emu-nt> <emu-geq>:</emu-geq> <emu-oneof>one of</emu-oneof> <emu-rhs><emu-t>0</emu-t> <emu-t>1</emu-t></emu-rhs>
2505</emu-production>
2506<emu-production name="StringLiteral" id="prod-StringLiteral">
2507 <emu-nt><a href="#prod-StringLiteral">StringLiteral</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="vxwiv5cv">
2508 <emu-t>"</emu-t>
2509 <emu-nt optional="" id="_ref_45"><a href="#prod-StringCharacters">StringCharacters</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2510 <emu-t>"</emu-t>
2511 </emu-rhs>
2512 <emu-rhs a="rvjavihc">
2513 <emu-t>"""</emu-t>
2514 <emu-nt optional="" id="_ref_46"><a href="#prod-TripleQuotedStringCharacters">TripleQuotedStringCharacters</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2515 <emu-t>"""</emu-t>
2516 </emu-rhs>
2517</emu-production>
2518<emu-production name="StringCharacters" id="prod-StringCharacters">
2519 <emu-nt><a href="#prod-StringCharacters">StringCharacters</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="dwizkn7f">
2520 <emu-nt id="_ref_47"><a href="#prod-StringCharacter">StringCharacter</a></emu-nt>
2521 <emu-nt optional="" id="_ref_48"><a href="#prod-StringCharacters">StringCharacters</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2522 </emu-rhs>
2523</emu-production>
2524<emu-production name="StringCharacter" id="prod-StringCharacter">
2525 <emu-nt><a href="#prod-StringCharacter">StringCharacter</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="qh-v7bpd"><emu-nt id="_ref_49"><a href="#prod-SourceCharacter">SourceCharacter</a></emu-nt> <emu-gmod>but not one of <emu-t>"</emu-t> or <emu-t>\</emu-t> or <emu-nt><a href="https://tc39.es/ecma262/#prod-LineTerminator">LineTerminator</a></emu-nt></emu-gmod></emu-rhs>
2526 <emu-rhs a="o0wqskax">
2527 <emu-t>\</emu-t>
2528 <emu-nt id="_ref_50"><a href="#prod-EscapeCharacter">EscapeCharacter</a></emu-nt>
2529 </emu-rhs>
2530</emu-production>
2531<emu-production name="TripleQuotedStringCharacters" id="prod-TripleQuotedStringCharacters">
2532 <emu-nt><a href="#prod-TripleQuotedStringCharacters">TripleQuotedStringCharacters</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="w2enq7kq">
2533 <emu-nt id="_ref_51"><a href="#prod-TripleQuotedStringCharacter">TripleQuotedStringCharacter</a></emu-nt>
2534 <emu-nt optional="" id="_ref_52"><a href="#prod-TripleQuotedStringCharacters">TripleQuotedStringCharacters</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2535 </emu-rhs>
2536</emu-production>
2537<emu-production name="TripleQuotedStringCharacter" id="prod-TripleQuotedStringCharacter">
2538 <emu-nt><a href="#prod-TripleQuotedStringCharacter">TripleQuotedStringCharacter</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ulzuti3k"><emu-nt id="_ref_53"><a href="#prod-SourceCharacter">SourceCharacter</a></emu-nt> <emu-gmod>but not one of <emu-t>"</emu-t> or <emu-t>\</emu-t></emu-gmod></emu-rhs>
2539 <emu-rhs a="o0wqskax">
2540 <emu-t>\</emu-t>
2541 <emu-nt id="_ref_54"><a href="#prod-EscapeCharacter">EscapeCharacter</a></emu-nt>
2542 </emu-rhs>
2543</emu-production>
2544<emu-production name="EscapeCharacter" oneof="" id="prod-EscapeCharacter">
2545 <emu-nt><a href="#prod-EscapeCharacter">EscapeCharacter</a></emu-nt> <emu-geq>:</emu-geq> <emu-oneof>one of</emu-oneof> <emu-rhs><emu-t>"</emu-t> <emu-t>r</emu-t> <emu-t>n</emu-t> <emu-t>t</emu-t> <emu-t>\</emu-t></emu-rhs>
2546</emu-production>
2547<emu-production name="Punctuator" oneof="" id="prod-Punctuator">
2548 <emu-nt><a href="#prod-Punctuator">Punctuator</a></emu-nt> <emu-geq>:</emu-geq> <emu-oneof>one of</emu-oneof> <emu-rhs><emu-t>|</emu-t> <emu-t>?</emu-t> <emu-t>=</emu-t> <emu-t>&amp;</emu-t> <emu-t>:</emu-t> <emu-t>,</emu-t> <emu-t>;</emu-t> <emu-t>.</emu-t> <emu-t>&lt;</emu-t> <emu-t>&gt;</emu-t> <emu-t>(</emu-t> <emu-t>)</emu-t> <emu-t>{</emu-t> <emu-t>}</emu-t> <emu-t>[</emu-t> <emu-t>]</emu-t> <emu-t>@</emu-t> <emu-t>...</emu-t></emu-rhs>
2549</emu-production>
2550<emu-production name="WhiteSpace" id="prod-WhiteSpace">
2551 <emu-nt><a href="#prod-WhiteSpace">WhiteSpace</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="k4soaizl"><emu-gprose>&lt;TAB&gt;</emu-gprose></emu-rhs>
2552 <emu-rhs a="eznvjwhz"><emu-gprose>&lt;LF&gt;</emu-gprose></emu-rhs>
2553 <emu-rhs a="w_cit1lu"><emu-gprose>&lt;VT&gt;</emu-gprose></emu-rhs>
2554 <emu-rhs a="dvfflmsr"><emu-gprose>&lt;FF&gt;</emu-gprose></emu-rhs>
2555 <emu-rhs a="q1yr1eki"><emu-gprose>&lt;CR&gt;</emu-gprose></emu-rhs>
2556 <emu-rhs a="01dfufyk"><emu-gprose>&lt;SP&gt;</emu-gprose></emu-rhs>
2557 <emu-rhs a="_fwb4uzc"><emu-gprose>&lt;NEL&gt;</emu-gprose></emu-rhs>
2558 <emu-rhs a="rdfm2xfx"><emu-gprose>&lt;LRM&gt;</emu-gprose></emu-rhs>
2559 <emu-rhs a="t_zqlt0-"><emu-gprose>&lt;RLM&gt;</emu-gprose></emu-rhs>
2560 <emu-rhs a="eaiqsw9w"><emu-gprose>&lt;LS&gt;</emu-gprose></emu-rhs>
2561 <emu-rhs a="z8h10fxn"><emu-gprose>&lt;PS&gt;</emu-gprose></emu-rhs>
2562</emu-production>
2563<emu-production name="Comment" id="prod-Comment">
2564 <emu-nt><a href="#prod-Comment">Comment</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="sieyeref"><emu-nt id="_ref_55"><a href="#prod-MultiLineComment">MultiLineComment</a></emu-nt></emu-rhs>
2565 <emu-rhs a="sscrkqcd"><emu-nt id="_ref_56"><a href="#prod-SingleLineComment">SingleLineComment</a></emu-nt></emu-rhs>
2566</emu-production>
2567<emu-production name="MultiLineComment" id="prod-MultiLineComment">
2568 <emu-nt><a href="#prod-MultiLineComment">MultiLineComment</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="hhzm60cr">
2569 <emu-t>/*</emu-t>
2570 <emu-nt optional="" id="_ref_57"><a href="#prod-MultiLineCommentChars">MultiLineCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2571 <emu-t>*/</emu-t>
2572 </emu-rhs>
2573</emu-production>
2574<emu-production name="MultiLineCommentChars" id="prod-MultiLineCommentChars">
2575 <emu-nt><a href="#prod-MultiLineCommentChars">MultiLineCommentChars</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="jkbv-8n6">
2576 <emu-nt id="_ref_58"><a href="#prod-MultiLineNotAsteriskChar">MultiLineNotAsteriskChar</a></emu-nt>
2577 <emu-nt optional="" id="_ref_59"><a href="#prod-MultiLineCommentChars">MultiLineCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2578 </emu-rhs>
2579 <emu-rhs a="b8trwjej">
2580 <emu-t>*</emu-t>
2581 <emu-nt optional="" id="_ref_60"><a href="#prod-PostAsteriskCommentChars">PostAsteriskCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2582 </emu-rhs>
2583</emu-production>
2584<emu-production name="PostAsteriskCommentChars" id="prod-PostAsteriskCommentChars">
2585 <emu-nt><a href="#prod-PostAsteriskCommentChars">PostAsteriskCommentChars</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="jwfqbwpm">
2586 <emu-nt id="_ref_61"><a href="#prod-MultiLineNotForwardSlashOrAsteriskChar">MultiLineNotForwardSlashOrAsteriskChar</a></emu-nt>
2587 <emu-nt optional="" id="_ref_62"><a href="#prod-MultiLineCommentChars">MultiLineCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2588 </emu-rhs>
2589 <emu-rhs a="b8trwjej">
2590 <emu-t>*</emu-t>
2591 <emu-nt optional="" id="_ref_63"><a href="#prod-PostAsteriskCommentChars">PostAsteriskCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2592 </emu-rhs>
2593</emu-production>
2594<emu-production name="MultiLineNotAsteriskChar" id="prod-MultiLineNotAsteriskChar">
2595 <emu-nt><a href="#prod-MultiLineNotAsteriskChar">MultiLineNotAsteriskChar</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="lflef8ko"><emu-nt id="_ref_64"><a href="#prod-SourceCharacter">SourceCharacter</a></emu-nt> <emu-gmod>but not <emu-t>*</emu-t></emu-gmod></emu-rhs>
2596</emu-production>
2597<emu-production name="MultiLineNotForwardSlashOrAsteriskChar" id="prod-MultiLineNotForwardSlashOrAsteriskChar">
2598 <emu-nt><a href="#prod-MultiLineNotForwardSlashOrAsteriskChar">MultiLineNotForwardSlashOrAsteriskChar</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="hdfnrv5z"><emu-nt id="_ref_65"><a href="#prod-SourceCharacter">SourceCharacter</a></emu-nt> <emu-gmod>but not one of <emu-t>/</emu-t> or <emu-t>*</emu-t></emu-gmod></emu-rhs>
2599</emu-production>
2600<emu-production name="SingleLineComment" id="prod-SingleLineComment">
2601 <emu-nt><a href="#prod-SingleLineComment">SingleLineComment</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="u-3whel6">
2602 <emu-t>//</emu-t>
2603 <emu-nt optional="" id="_ref_66"><a href="#prod-SingleLineCommentChars">SingleLineCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2604 </emu-rhs>
2605</emu-production>
2606<emu-production name="SingleLineCommentChars" id="prod-SingleLineCommentChars">
2607 <emu-nt><a href="#prod-SingleLineCommentChars">SingleLineCommentChars</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="rshuryvh">
2608 <emu-nt id="_ref_67"><a href="#prod-SingleLineCommentChar">SingleLineCommentChar</a></emu-nt>
2609 <emu-nt optional="" id="_ref_68"><a href="#prod-SingleLineCommentChars">SingleLineCommentChars</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2610 </emu-rhs>
2611</emu-production>
2612<emu-production name="SingleLineCommentChar" id="prod-SingleLineCommentChar">
2613 <emu-nt><a href="#prod-SingleLineCommentChar">SingleLineCommentChar</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="lvvfp8iw"><emu-nt id="_ref_69"><a href="#prod-SourceCharacter">SourceCharacter</a></emu-nt> <emu-gmod>but not <emu-nt><a href="https://tc39.es/ecma262/#prod-LineTerminator">LineTerminator</a></emu-nt></emu-gmod></emu-rhs>
2614</emu-production>
2615</emu-grammar>
2616</emu-clause>
2617
2618<emu-clause id="syntactic-grammar">
2619<h1><span class="secnum">2</span> Syntactic Grammar</h1>
2620<emu-grammar type="definition"><emu-production name="CadlScriptItemList" id="prod-CadlScriptItemList">
2621 <emu-nt><a href="#prod-CadlScriptItemList">CadlScriptItemList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="fihs1zye">
2622 <emu-nt optional="" id="_ref_70"><a href="#prod-CadlScriptItemList">CadlScriptItemList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2623 <emu-nt id="_ref_71"><a href="#prod-CadlScriptItem">CadlScriptItem</a></emu-nt>
2624 </emu-rhs>
2625</emu-production>
2626<emu-production name="CadlScriptItem" id="prod-CadlScriptItem">
2627 <emu-nt><a href="#prod-CadlScriptItem">CadlScriptItem</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="sgwx93oj"><emu-nt id="_ref_72"><a href="#prod-BlocklessNamespaceStatement">BlocklessNamespaceStatement</a></emu-nt></emu-rhs>
2628 <emu-rhs a="zi_5hwi0"><emu-nt id="_ref_73"><a href="#prod-ImportStatement">ImportStatement</a></emu-nt></emu-rhs>
2629 <emu-rhs a="pyyivtxj"><emu-nt id="_ref_74"><a href="#prod-Statement">Statement</a></emu-nt></emu-rhs>
2630</emu-production>
2631<emu-production name="BlocklessNamespaceStatement" id="prod-BlocklessNamespaceStatement">
2632 <emu-nt><a href="#prod-BlocklessNamespaceStatement">BlocklessNamespaceStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="woshe1r5">
2633 <emu-nt optional="" id="_ref_75"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2634 <emu-t>namespace</emu-t>
2635 <emu-nt id="_ref_76"><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt>
2636 <emu-t>;</emu-t>
2637 </emu-rhs>
2638</emu-production>
2639<emu-production name="ImportStatement" id="prod-ImportStatement">
2640 <emu-nt><a href="#prod-ImportStatement">ImportStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="fhkncxvv">
2641 <emu-t>import</emu-t>
2642 <emu-nt id="_ref_77"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt>
2643 <emu-t>;</emu-t>
2644 </emu-rhs>
2645</emu-production>
2646<emu-production name="StatementList" id="prod-StatementList">
2647 <emu-nt><a href="#prod-StatementList">StatementList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ssyorrl_">
2648 <emu-nt optional="" id="_ref_78"><a href="#prod-StatementList">StatementList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2649 <emu-nt id="_ref_79"><a href="#prod-Statement">Statement</a></emu-nt>
2650 </emu-rhs>
2651</emu-production>
2652<emu-production name="Statement" id="prod-Statement">
2653 <emu-nt><a href="#prod-Statement">Statement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ngbc4m7o"><emu-nt id="_ref_80"><a href="#prod-ModelStatement">ModelStatement</a></emu-nt></emu-rhs>
2654 <emu-rhs a="qhwhhau7"><emu-nt id="_ref_81"><a href="#prod-InterfaceStatement">InterfaceStatement</a></emu-nt></emu-rhs>
2655 <emu-rhs a="_ljtj5og"><emu-nt id="_ref_82"><a href="#prod-NamespaceStatement">NamespaceStatement</a></emu-nt></emu-rhs>
2656 <emu-rhs a="qlyu8ssa"><emu-nt id="_ref_83"><a href="#prod-OperationStatement">OperationStatement</a></emu-nt></emu-rhs>
2657 <emu-rhs a="rmuscggd"><emu-nt id="_ref_84"><a href="#prod-UsingStatement">UsingStatement</a></emu-nt></emu-rhs>
2658 <emu-rhs a="fwtcv5di"><emu-nt id="_ref_85"><a href="#prod-EnumStatement">EnumStatement</a></emu-nt></emu-rhs>
2659 <emu-rhs a="dzlcgyrg"><emu-nt id="_ref_86"><a href="#prod-AliasStatement">AliasStatement</a></emu-nt></emu-rhs>
2660 <emu-rhs a="sg2sawim"><emu-t>;</emu-t></emu-rhs>
2661</emu-production>
2662<emu-production name="UsingStatement" id="prod-UsingStatement">
2663 <emu-nt><a href="#prod-UsingStatement">UsingStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="nfxtjnnc">
2664 <emu-t>using</emu-t>
2665 <emu-nt id="_ref_87"><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt>
2666 <emu-t>;</emu-t>
2667 </emu-rhs>
2668</emu-production>
2669<emu-production name="ModelStatement" id="prod-ModelStatement">
2670 <emu-nt><a href="#prod-ModelStatement">ModelStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="w3a1y-ib">
2671 <emu-nt optional="" id="_ref_88"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2672 <emu-t>model</emu-t>
2673 <emu-nt id="_ref_89"><a href="#prod-Identifier">Identifier</a></emu-nt>
2674 <emu-nt optional="">TemplateParameters<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2675 <emu-nt optional="" id="_ref_90"><a href="#prod-ModelHeritage">ModelHeritage</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2676 <emu-t>{</emu-t>
2677 <emu-nt optional="" id="_ref_91"><a href="#prod-ModelBody">ModelBody</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2678 <emu-t>}</emu-t>
2679 </emu-rhs>
2680</emu-production>
2681<emu-production name="ModelHeritage" id="prod-ModelHeritage">
2682 <emu-nt><a href="#prod-ModelHeritage">ModelHeritage</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="baknrbyl">
2683 <emu-t>extends</emu-t>
2684 <emu-nt id="_ref_92"><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt>
2685 </emu-rhs>
2686 <emu-rhs a="jm_bzxxi">
2687 <emu-t>is</emu-t>
2688 <emu-nt id="_ref_93"><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt>
2689 </emu-rhs>
2690</emu-production>
2691<emu-production name="ModelBody" id="prod-ModelBody">
2692 <emu-nt><a href="#prod-ModelBody">ModelBody</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="nd7shwc0">
2693 <emu-nt id="_ref_94"><a href="#prod-ModelPropertyList">ModelPropertyList</a></emu-nt>
2694 <emu-t optional="">,<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2695 </emu-rhs>
2696 <emu-rhs a="-duy8rb1">
2697 <emu-nt id="_ref_95"><a href="#prod-ModelPropertyList">ModelPropertyList</a></emu-nt>
2698 <emu-t optional="">;<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2699 </emu-rhs>
2700</emu-production>
2701<emu-production name="ModelPropertyList" id="prod-ModelPropertyList">
2702 <emu-nt><a href="#prod-ModelPropertyList">ModelPropertyList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ghoz7lyz"><emu-nt id="_ref_96"><a href="#prod-ModelProperty">ModelProperty</a></emu-nt></emu-rhs>
2703 <emu-rhs a="vf9tzeyl">
2704 <emu-nt id="_ref_97"><a href="#prod-ModelPropertyList">ModelPropertyList</a></emu-nt>
2705 <emu-t>,</emu-t>
2706 <emu-nt id="_ref_98"><a href="#prod-ModelProperty">ModelProperty</a></emu-nt>
2707 </emu-rhs>
2708 <emu-rhs a="lzgybwma">
2709 <emu-nt id="_ref_99"><a href="#prod-ModelPropertyList">ModelPropertyList</a></emu-nt>
2710 <emu-t>;</emu-t>
2711 <emu-nt id="_ref_100"><a href="#prod-ModelProperty">ModelProperty</a></emu-nt>
2712 </emu-rhs>
2713</emu-production>
2714<emu-production name="ModelProperty" id="prod-ModelProperty">
2715 <emu-nt><a href="#prod-ModelProperty">ModelProperty</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="gibki9cu"><emu-nt id="_ref_101"><a href="#prod-ModelSpreadProperty">ModelSpreadProperty</a></emu-nt></emu-rhs>
2716 <emu-rhs a="77nrmgnp">
2717 <emu-nt optional="" id="_ref_102"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2718 <emu-nt id="_ref_103"><a href="#prod-Identifier">Identifier</a></emu-nt>
2719 <emu-t optional="">?<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2720 <emu-t>:</emu-t>
2721 <emu-nt id="_ref_104"><a href="#prod-Expression">Expression</a></emu-nt>
2722 </emu-rhs>
2723 <emu-rhs a="vmgvgt2o">
2724 <emu-nt optional="" id="_ref_105"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2725 <emu-nt id="_ref_106"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt>
2726 <emu-t optional="">?<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2727 <emu-t>:</emu-t>
2728 <emu-nt id="_ref_107"><a href="#prod-Expression">Expression</a></emu-nt>
2729 </emu-rhs>
2730</emu-production>
2731<emu-production name="ModelSpreadProperty" id="prod-ModelSpreadProperty">
2732 <emu-nt><a href="#prod-ModelSpreadProperty">ModelSpreadProperty</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="r9kkoml-">
2733 <emu-t>...</emu-t>
2734 <emu-nt id="_ref_108"><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt>
2735 </emu-rhs>
2736</emu-production>
2737<emu-production name="InterfaceStatement" id="prod-InterfaceStatement">
2738 <emu-nt><a href="#prod-InterfaceStatement">InterfaceStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="exjnkaev">
2739 <emu-t>interface</emu-t>
2740 <emu-nt id="_ref_109"><a href="#prod-Identifier">Identifier</a></emu-nt>
2741 <emu-nt optional="">TemplateParameters<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2742 <emu-nt optional="" id="_ref_110"><a href="#prod-InterfaceHeritage">InterfaceHeritage</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2743 <emu-t>{</emu-t>
2744 <emu-nt optional="">InterfaceBody<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2745 <emu-t>}</emu-t>
2746 </emu-rhs>
2747</emu-production>
2748<emu-production name="InterfaceHeritage" id="prod-InterfaceHeritage">
2749 <emu-nt><a href="#prod-InterfaceHeritage">InterfaceHeritage</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="fy0l4eik">
2750 <emu-t>mixes</emu-t>
2751 <emu-nt id="_ref_111"><a href="#prod-ReferenceExpressionList">ReferenceExpressionList</a></emu-nt>
2752 </emu-rhs>
2753 <emu-rhs a="s2k4ex-k"><emu-nt>InterfaceBody</emu-nt></emu-rhs>
2754 <emu-rhs a="w_aa5rjr">
2755 <emu-nt id="_ref_112"><a href="#prod-InterfaceMemberList">InterfaceMemberList</a></emu-nt>
2756 <emu-t optional="">;<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2757 </emu-rhs>
2758</emu-production>
2759<emu-production name="InterfaceMemberList" id="prod-InterfaceMemberList">
2760 <emu-nt><a href="#prod-InterfaceMemberList">InterfaceMemberList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="xakzxkez"><emu-nt id="_ref_113"><a href="#prod-InterfaceMember">InterfaceMember</a></emu-nt></emu-rhs>
2761 <emu-rhs a="erjllshi">
2762 <emu-nt id="_ref_114"><a href="#prod-InterfaceMemberList">InterfaceMemberList</a></emu-nt>
2763 <emu-t>;</emu-t>
2764 <emu-nt id="_ref_115"><a href="#prod-InterfaceMember">InterfaceMember</a></emu-nt>
2765 </emu-rhs>
2766</emu-production>
2767<emu-production name="InterfaceMember" id="prod-InterfaceMember">
2768 <emu-nt><a href="#prod-InterfaceMember">InterfaceMember</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ubdoipqb">
2769 <emu-nt id="_ref_116"><a href="#prod-Identifier">Identifier</a></emu-nt>
2770 <emu-t>(</emu-t>
2771 <emu-nt optional="" id="_ref_117"><a href="#prod-ModelPropertyList">ModelPropertyList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2772 <emu-t>)</emu-t>
2773 <emu-t>:</emu-t>
2774 <emu-nt id="_ref_118"><a href="#prod-Expression">Expression</a></emu-nt>
2775 </emu-rhs>
2776</emu-production>
2777<emu-production name="UnionStatement" id="prod-UnionStatement">
2778 <emu-nt><a href="#prod-UnionStatement">UnionStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="jqsx6v8u">
2779 <emu-nt optional="" id="_ref_119"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2780 <emu-t>union</emu-t>
2781 <emu-nt id="_ref_120"><a href="#prod-Identifier">Identifier</a></emu-nt>
2782 <emu-nt optional="">TemplateParameters<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2783 <emu-t>{</emu-t>
2784 <emu-nt optional="" id="_ref_121"><a href="#prod-UnionBody">UnionBody</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2785 <emu-t>}</emu-t>
2786 </emu-rhs>
2787</emu-production>
2788<emu-production name="UnionBody" id="prod-UnionBody">
2789 <emu-nt><a href="#prod-UnionBody">UnionBody</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="lauvayzn">
2790 <emu-nt id="_ref_122"><a href="#prod-UnionVariantList">UnionVariantList</a></emu-nt>
2791 <emu-t optional="">;<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2792 </emu-rhs>
2793</emu-production>
2794<emu-production name="UnionVariantList" id="prod-UnionVariantList">
2795 <emu-nt><a href="#prod-UnionVariantList">UnionVariantList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="cfhz-n9b"><emu-nt id="_ref_123"><a href="#prod-UnionVariant">UnionVariant</a></emu-nt></emu-rhs>
2796 <emu-rhs a="b_wjyurc">
2797 <emu-nt id="_ref_124"><a href="#prod-UnionVariantList">UnionVariantList</a></emu-nt>
2798 <emu-t>;</emu-t>
2799 <emu-nt id="_ref_125"><a href="#prod-UnionVariant">UnionVariant</a></emu-nt>
2800 </emu-rhs>
2801</emu-production>
2802<emu-production name="UnionVariant" id="prod-UnionVariant">
2803 <emu-nt><a href="#prod-UnionVariant">UnionVariant</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="h9gqpl1v">
2804 <emu-nt optional="" id="_ref_126"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2805 <emu-nt id="_ref_127"><a href="#prod-Identifier">Identifier</a></emu-nt>
2806 <emu-t>:</emu-t>
2807 <emu-nt id="_ref_128"><a href="#prod-Expression">Expression</a></emu-nt>
2808 </emu-rhs>
2809 <emu-rhs a="2mhcutnm">
2810 <emu-nt optional="" id="_ref_129"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2811 <emu-nt id="_ref_130"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt>
2812 <emu-t>:</emu-t>
2813 <emu-nt id="_ref_131"><a href="#prod-Expression">Expression</a></emu-nt>
2814 </emu-rhs>
2815</emu-production>
2816<emu-production name="EnumStatement" id="prod-EnumStatement">
2817 <emu-nt><a href="#prod-EnumStatement">EnumStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="i7ob7wbq">
2818 <emu-nt optional="" id="_ref_132"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2819 <emu-t>enum</emu-t>
2820 <emu-nt id="_ref_133"><a href="#prod-Identifier">Identifier</a></emu-nt>
2821 <emu-t>{</emu-t>
2822 <emu-nt optional="" id="_ref_134"><a href="#prod-EnumBody">EnumBody</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2823 <emu-t>}</emu-t>
2824 </emu-rhs>
2825</emu-production>
2826<emu-production name="EnumBody" id="prod-EnumBody">
2827 <emu-nt><a href="#prod-EnumBody">EnumBody</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="ag--srfg">
2828 <emu-nt id="_ref_135"><a href="#prod-EnumMemberList">EnumMemberList</a></emu-nt>
2829 <emu-t optional="">,<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2830 </emu-rhs>
2831 <emu-rhs a="vfvqnt4z">
2832 <emu-nt id="_ref_136"><a href="#prod-EnumMemberList">EnumMemberList</a></emu-nt>
2833 <emu-t optional="">;<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2834 </emu-rhs>
2835</emu-production>
2836<emu-production name="EnumMemberList" id="prod-EnumMemberList">
2837 <emu-nt><a href="#prod-EnumMemberList">EnumMemberList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="vflanevg"><emu-nt id="_ref_137"><a href="#prod-EnumMember">EnumMember</a></emu-nt></emu-rhs>
2838 <emu-rhs a="7dn-cbj2">
2839 <emu-nt id="_ref_138"><a href="#prod-EnumMemberList">EnumMemberList</a></emu-nt>
2840 <emu-t>,</emu-t>
2841 <emu-nt id="_ref_139"><a href="#prod-EnumMember">EnumMember</a></emu-nt>
2842 </emu-rhs>
2843 <emu-rhs a="qjf2au36">
2844 <emu-nt id="_ref_140"><a href="#prod-EnumMemberList">EnumMemberList</a></emu-nt>
2845 <emu-t>;</emu-t>
2846 <emu-nt id="_ref_141"><a href="#prod-EnumMember">EnumMember</a></emu-nt>
2847 </emu-rhs>
2848</emu-production>
2849<emu-production name="EnumMember" id="prod-EnumMember">
2850 <emu-nt><a href="#prod-EnumMember">EnumMember</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="htyyapxs">
2851 <emu-nt optional="" id="_ref_142"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2852 <emu-nt id="_ref_143"><a href="#prod-Identifier">Identifier</a></emu-nt>
2853 <emu-nt optional="" id="_ref_144"><a href="#prod-EnumMemberValue">EnumMemberValue</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2854 </emu-rhs>
2855 <emu-rhs a="d-ggnl4a">
2856 <emu-nt optional="" id="_ref_145"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2857 <emu-nt id="_ref_146"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt>
2858 <emu-nt optional="" id="_ref_147"><a href="#prod-EnumMemberValue">EnumMemberValue</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2859 </emu-rhs>
2860</emu-production>
2861<emu-production name="EnumMemberValue" id="prod-EnumMemberValue">
2862 <emu-nt><a href="#prod-EnumMemberValue">EnumMemberValue</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="qbuxgevr">
2863 <emu-t>:</emu-t>
2864 <emu-nt id="_ref_148"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt>
2865 </emu-rhs>
2866 <emu-rhs a="ib128nab">
2867 <emu-t>:</emu-t>
2868 <emu-nt id="_ref_149"><a href="#prod-NumericLiteral">NumericLiteral</a></emu-nt>
2869 </emu-rhs>
2870</emu-production>
2871<emu-production name="AliasStatement" id="prod-AliasStatement">
2872 <emu-nt><a href="#prod-AliasStatement">AliasStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="vcp2vkl0">
2873 <emu-t>alias</emu-t>
2874 <emu-nt id="_ref_150"><a href="#prod-Identifier">Identifier</a></emu-nt>
2875 <emu-nt optional="">TemplateParameters<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2876 <emu-t>=</emu-t>
2877 <emu-nt id="_ref_151"><a href="#prod-Expression">Expression</a></emu-nt>
2878 </emu-rhs>
2879 <emu-rhs a="n0rgsga2"><emu-nt>TemplateParameters</emu-nt></emu-rhs>
2880 <emu-rhs a="m5tcjdl1">
2881 <emu-t>&lt;</emu-t>
2882 <emu-nt id="_ref_152"><a href="#prod-IdentifierList">IdentifierList</a></emu-nt>
2883 <emu-t>&gt;</emu-t>
2884 </emu-rhs>
2885</emu-production>
2886<emu-production name="IdentifierList" id="prod-IdentifierList">
2887 <emu-nt><a href="#prod-IdentifierList">IdentifierList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="bras6mo_"><emu-nt id="_ref_153"><a href="#prod-Identifier">Identifier</a></emu-nt></emu-rhs>
2888 <emu-rhs a="btxjxlll">
2889 <emu-nt id="_ref_154"><a href="#prod-IdentifierList">IdentifierList</a></emu-nt>
2890 <emu-t>,</emu-t>
2891 <emu-nt id="_ref_155"><a href="#prod-Identifier">Identifier</a></emu-nt>
2892 </emu-rhs>
2893</emu-production>
2894<emu-production name="NamespaceStatement" id="prod-NamespaceStatement">
2895 <emu-nt><a href="#prod-NamespaceStatement">NamespaceStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="lrsdvje0">
2896 <emu-nt optional="" id="_ref_156"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2897 <emu-t>namespace</emu-t>
2898 <emu-nt id="_ref_157"><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt>
2899 <emu-t>{</emu-t>
2900 <emu-nt optional="" id="_ref_158"><a href="#prod-StatementList">StatementList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2901 <emu-t>}</emu-t>
2902 </emu-rhs>
2903</emu-production>
2904<emu-production name="OperationStatement" id="prod-OperationStatement">
2905 <emu-nt><a href="#prod-OperationStatement">OperationStatement</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="fic4qgph">
2906 <emu-nt optional="" id="_ref_159"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2907 <emu-t>op</emu-t>
2908 <emu-nt id="_ref_160"><a href="#prod-Identifier">Identifier</a></emu-nt>
2909 <emu-t>(</emu-t>
2910 <emu-nt optional="" id="_ref_161"><a href="#prod-ModelPropertyList">ModelPropertyList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2911 <emu-t>)</emu-t>
2912 <emu-t>:</emu-t>
2913 <emu-nt id="_ref_162"><a href="#prod-Expression">Expression</a></emu-nt>
2914 <emu-t>;</emu-t>
2915 </emu-rhs>
2916</emu-production>
2917<emu-production name="Expression" id="prod-Expression">
2918 <emu-nt><a href="#prod-Expression">Expression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="otzlm2nv"><emu-nt id="_ref_163"><a href="#prod-UnionExpressionOrHigher">UnionExpressionOrHigher</a></emu-nt></emu-rhs>
2919</emu-production>
2920<emu-production name="UnionExpressionOrHigher" id="prod-UnionExpressionOrHigher">
2921 <emu-nt><a href="#prod-UnionExpressionOrHigher">UnionExpressionOrHigher</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="l4bpz882"><emu-nt id="_ref_164"><a href="#prod-IntersectionExpressionOrHigher">IntersectionExpressionOrHigher</a></emu-nt></emu-rhs>
2922 <emu-rhs a="oiwllrbb">
2923 <emu-t optional="">|<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2924 <emu-nt id="_ref_165"><a href="#prod-UnionExpressionOrHigher">UnionExpressionOrHigher</a></emu-nt>
2925 <emu-t>|</emu-t>
2926 <emu-nt id="_ref_166"><a href="#prod-IntersectionExpressionOrHigher">IntersectionExpressionOrHigher</a></emu-nt>
2927 </emu-rhs>
2928</emu-production>
2929<emu-production name="IntersectionExpressionOrHigher" id="prod-IntersectionExpressionOrHigher">
2930 <emu-nt><a href="#prod-IntersectionExpressionOrHigher">IntersectionExpressionOrHigher</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="fxst_igc"><emu-nt id="_ref_167"><a href="#prod-ArrayExpressionOrHigher">ArrayExpressionOrHigher</a></emu-nt></emu-rhs>
2931 <emu-rhs a="cgkcj8yb">
2932 <emu-t optional="">&amp;<emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-t>
2933 <emu-nt id="_ref_168"><a href="#prod-IntersectionExpressionOrHigher">IntersectionExpressionOrHigher</a></emu-nt>
2934 <emu-t>&amp;</emu-t>
2935 <emu-nt id="_ref_169"><a href="#prod-ArrayExpressionOrHigher">ArrayExpressionOrHigher</a></emu-nt>
2936 </emu-rhs>
2937</emu-production>
2938<emu-production name="ArrayExpressionOrHigher" id="prod-ArrayExpressionOrHigher">
2939 <emu-nt><a href="#prod-ArrayExpressionOrHigher">ArrayExpressionOrHigher</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="jvcvemtw"><emu-nt id="_ref_170"><a href="#prod-PrimaryExpression">PrimaryExpression</a></emu-nt></emu-rhs>
2940 <emu-rhs a="8k-eixnj">
2941 <emu-nt id="_ref_171"><a href="#prod-ArrayExpressionOrHigher">ArrayExpressionOrHigher</a></emu-nt>
2942 <emu-t>[</emu-t>
2943 <emu-t>]</emu-t>
2944 </emu-rhs>
2945</emu-production>
2946<emu-production name="PrimaryExpression" id="prod-PrimaryExpression">
2947 <emu-nt><a href="#prod-PrimaryExpression">PrimaryExpression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="kul-a19e"><emu-nt id="_ref_172"><a href="#prod-Literal">Literal</a></emu-nt></emu-rhs>
2948 <emu-rhs a="mpejatd_"><emu-nt id="_ref_173"><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt></emu-rhs>
2949 <emu-rhs a="k5j7cutc"><emu-nt id="_ref_174"><a href="#prod-ParenthesizedExpression">ParenthesizedExpression</a></emu-nt></emu-rhs>
2950 <emu-rhs a="d007fnkw"><emu-nt id="_ref_175"><a href="#prod-ModelExpression">ModelExpression</a></emu-nt></emu-rhs>
2951 <emu-rhs a="rmcinm4a"><emu-nt id="_ref_176"><a href="#prod-TupleExpression">TupleExpression</a></emu-nt></emu-rhs>
2952</emu-production>
2953<emu-production name="Literal" id="prod-Literal">
2954 <emu-nt><a href="#prod-Literal">Literal</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="xhtltz00"><emu-nt id="_ref_177"><a href="#prod-StringLiteral">StringLiteral</a></emu-nt></emu-rhs>
2955 <emu-rhs a="nqjh_sxl"><emu-nt id="_ref_178"><a href="#prod-BooleanLiteral">BooleanLiteral</a></emu-nt></emu-rhs>
2956 <emu-rhs a="pui0b1rt"><emu-nt id="_ref_179"><a href="#prod-NumericLiteral">NumericLiteral</a></emu-nt></emu-rhs>
2957</emu-production>
2958<emu-production name="ReferenceExpression" id="prod-ReferenceExpression">
2959 <emu-nt><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="mzr2yu9j">
2960 <emu-nt id="_ref_180"><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt>
2961 <emu-nt optional="" id="_ref_181"><a href="#prod-TemplateArguments">TemplateArguments</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2962 </emu-rhs>
2963</emu-production>
2964<emu-production name="ReferenceExpressionList" id="prod-ReferenceExpressionList">
2965 <emu-nt><a href="#prod-ReferenceExpressionList">ReferenceExpressionList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="mpejatd_"><emu-nt id="_ref_182"><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt></emu-rhs>
2966 <emu-rhs a="ry70nwgl">
2967 <emu-nt id="_ref_183"><a href="#prod-ReferenceExpressionList">ReferenceExpressionList</a></emu-nt>
2968 <emu-t>,</emu-t>
2969 <emu-nt id="_ref_184"><a href="#prod-ReferenceExpression">ReferenceExpression</a></emu-nt>
2970 </emu-rhs>
2971</emu-production>
2972<emu-production name="IdentifierOrMemberExpression" id="prod-IdentifierOrMemberExpression">
2973 <emu-nt><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="bras6mo_"><emu-nt id="_ref_185"><a href="#prod-Identifier">Identifier</a></emu-nt></emu-rhs>
2974 <emu-rhs a="fagplbkz">
2975 <emu-nt id="_ref_186"><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt>
2976 <emu-t>.</emu-t>
2977 <emu-nt id="_ref_187"><a href="#prod-Identifier">Identifier</a></emu-nt>
2978 </emu-rhs>
2979</emu-production>
2980<emu-production name="TemplateArguments" id="prod-TemplateArguments">
2981 <emu-nt><a href="#prod-TemplateArguments">TemplateArguments</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="erulm7dq">
2982 <emu-t>&lt;</emu-t>
2983 <emu-nt id="_ref_188"><a href="#prod-ExpressionList">ExpressionList</a></emu-nt>
2984 <emu-t>&gt;</emu-t>
2985 </emu-rhs>
2986</emu-production>
2987<emu-production name="ParenthesizedExpression" id="prod-ParenthesizedExpression">
2988 <emu-nt><a href="#prod-ParenthesizedExpression">ParenthesizedExpression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="s6bvnd5v">
2989 <emu-t>(</emu-t>
2990 <emu-nt id="_ref_189"><a href="#prod-Expression">Expression</a></emu-nt>
2991 <emu-t>)</emu-t>
2992 </emu-rhs>
2993</emu-production>
2994<emu-production name="ModelExpression" id="prod-ModelExpression">
2995 <emu-nt><a href="#prod-ModelExpression">ModelExpression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="p9stvizw">
2996 <emu-t>{</emu-t>
2997 <emu-nt optional="" id="_ref_190"><a href="#prod-ModelBody">ModelBody</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
2998 <emu-t>}</emu-t>
2999 </emu-rhs>
3000</emu-production>
3001<emu-production name="TupleExpression" id="prod-TupleExpression">
3002 <emu-nt><a href="#prod-TupleExpression">TupleExpression</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="mct6eje8">
3003 <emu-t>[</emu-t>
3004 <emu-nt id="_ref_191"><a href="#prod-ExpressionList">ExpressionList</a></emu-nt>
3005 <emu-t>]</emu-t>
3006 </emu-rhs>
3007</emu-production>
3008<emu-production name="ExpressionList" id="prod-ExpressionList">
3009 <emu-nt><a href="#prod-ExpressionList">ExpressionList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="l7avubnp"><emu-nt id="_ref_192"><a href="#prod-Expression">Expression</a></emu-nt></emu-rhs>
3010 <emu-rhs a="8cbmyyhk">
3011 <emu-nt id="_ref_193"><a href="#prod-ExpressionList">ExpressionList</a></emu-nt>
3012 <emu-t>,</emu-t>
3013 <emu-nt id="_ref_194"><a href="#prod-Expression">Expression</a></emu-nt>
3014 </emu-rhs>
3015</emu-production>
3016<emu-production name="DecoratorList" id="prod-DecoratorList">
3017 <emu-nt><a href="#prod-DecoratorList">DecoratorList</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="a6fvhq_2">
3018 <emu-nt optional="" id="_ref_195"><a href="#prod-DecoratorList">DecoratorList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
3019 <emu-nt id="_ref_196"><a href="#prod-Decorator">Decorator</a></emu-nt>
3020 </emu-rhs>
3021</emu-production>
3022<emu-production name="Decorator" id="prod-Decorator">
3023 <emu-nt><a href="#prod-Decorator">Decorator</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="p1dbtqtg">
3024 <emu-t>@</emu-t>
3025 <emu-nt id="_ref_197"><a href="#prod-IdentifierOrMemberExpression">IdentifierOrMemberExpression</a></emu-nt>
3026 <emu-nt optional="" id="_ref_198"><a href="#prod-DecoratorArguments">DecoratorArguments</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
3027 </emu-rhs>
3028</emu-production>
3029<emu-production name="DecoratorArguments" id="prod-DecoratorArguments">
3030 <emu-nt><a href="#prod-DecoratorArguments">DecoratorArguments</a></emu-nt> <emu-geq>:</emu-geq> <emu-rhs a="gq6jlu5e">
3031 <emu-t>(</emu-t>
3032 <emu-nt optional="" id="_ref_199"><a href="#prod-ExpressionList">ExpressionList</a><emu-mods><emu-opt>opt</emu-opt></emu-mods></emu-nt>
3033 <emu-t>)</emu-t>
3034 </emu-rhs>
3035</emu-production>
3036</emu-grammar>
3037</emu-clause>
3038</div></body>