code: function DynamicDelimiterParser() {
      // invoke super constructor
      Parser.call(this, allTokens, {
          outputCst: false,
          // by default the error recovery / fault tolerance capabilities are disabled
          // use this flag to enable them
          recoveryEnabled: true,
          // IMPORTANT: must be enabled to support dynamically defined Tokens
          dynamicTokensEnabled: true
      })
  
      // not mandatory, using <$> (or any other sign) to reduce verbosity (this. this. this. this. .......)
      const $ = this
  
      this.RULE("array", () => {
          let result = ""
  
          $.CONSUME(LSquare) // This will match any Token Class which extends BaseLeftDelimiter
          $.OPTION(() => {
              result += $.CONSUME(NumberLiteral).image
              $.MANY(() => {
                  $.CONSUME(BaseDelimiter)
                  result += $.CONSUME2(NumberLiteral).image
              })
          })
          $.CONSUME(RSquare) // This will match any Token Class which extends BaseRightDelimiter
  
          return result
      })
  
      // very important to call this after all the rules have been defined.
      // otherwise the parser may not work correctly as it will lack information
      // derived during the self analysis phase.
      this.performSelfAnalysis()
  }
docs: ----------------- parser -----------------