* Register a parse element class based on its static metadata. * Commands need `static keyword`, expressions need `static grammarName`.
(ElementClass)
| 304 | * Commands need `static keyword`, expressions need `static grammarName`. |
| 305 | */ |
| 306 | registerParseElement(ElementClass) { |
| 307 | if (!ElementClass.parse) return; |
| 308 | |
| 309 | const parse = ElementClass.parse.bind(ElementClass); |
| 310 | |
| 311 | // Commands with keyword (supports string or array of strings) |
| 312 | if (ElementClass.keyword && ElementClass.prototype instanceof Command) { |
| 313 | var keywords = Array.isArray(ElementClass.keyword) ? ElementClass.keyword : [ElementClass.keyword]; |
| 314 | for (var kw of keywords) this.addCommand(kw, parse); |
| 315 | return; |
| 316 | } |
| 317 | |
| 318 | // Features with keyword (supports string or array of strings) |
| 319 | if (ElementClass.keyword && ElementClass.prototype instanceof Feature) { |
| 320 | var keywords = Array.isArray(ElementClass.keyword) ? ElementClass.keyword : [ElementClass.keyword]; |
| 321 | for (var kw of keywords) this.addFeature(kw, parse); |
| 322 | return; |
| 323 | } |
| 324 | |
| 325 | // Grammar elements with grammarName |
| 326 | const name = ElementClass.grammarName; |
| 327 | if (!name) return; |
| 328 | |
| 329 | switch (ElementClass.expressionType) { |
| 330 | case 'leaf': this.addLeafExpression(name, parse); break; |
| 331 | case 'indirect': this.addIndirectExpression(name, parse); break; |
| 332 | case 'unary': this.addUnaryExpression(name, parse); break; |
| 333 | case 'top': this.addTopExpression(name, parse); break; |
| 334 | case 'postfix': this.addPostfixExpression(name, parse); break; |
| 335 | default: this.addGrammarElement(name, parse); break; |
| 336 | } |
| 337 | |
| 338 | if (ElementClass.assignable) { |
| 339 | this.#assignableExpressions.push(name); |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | /** |
| 344 | * Register all exported parse element classes from a module. |
no test coverage detected