docs: function Lexer(str, options) {
    options = options || {};
    if (typeof str !== 'string') {
      throw new Error('Expected source code to be a string but got "' + (typeof str) + '"')
    }
    if (typeof options !== 'object') {
      throw new Error('Expected "options" to be an object but got "' + (typeof options) + '"')
    }
    //Strip any UTF-8 BOM off of the start of `str`, if it exists.
    str = str.replace(/^\uFEFF/, '');
    this.input = str.replace(/\r\n|\r/g, '\n');
    this.originalInput = this.input;
    this.filename = options.filename;
    this.interpolated = options.interpolated || false;
    this.lineno = options.startingLine || 1;
    this.colno = options.startingColumn || 1;
    this.plugins = options.plugins || [];
    this.indentStack = [0];
    this.indentRe = null;
    // If #{} or !{} syntax is allowed when adding text
    this.interpolationAllowed = true;
  
    this.tokens = [];
    this.ended = false;
  }