grammerThrows()

in src/langs/cpp/combinator.js [1728:1771]


  grammerThrows(emitter, gram) {
    this.pushInclude('throw_exception');
    emitter.emit('BOOST_THROW_EXCEPTION(');
    // emit exception_begin
    if (gram.exception) {
      let isException = is.object(gram.exception) && gram.exception.objectName === '$Exception';
      if (isException) {
        emitter.emit('std::runtime_error(');
      } else {
        emitter.emit(`${this.emitType(gram.exception)}(`);
      }
    }

    // emit exception_body
    if (!gram.params.length) {
      let msg = gram.message ? `"${gram.message}"` : '';
      emitter.emit(msg);
    } else if (gram.params.length === 1) {
      let isError = is.object(gram.exception) && gram.exception.objectName === '$Error';
      if (isError) {
        let dataType = this.resolveDataType(gram.params[0]);
        emitter.emit(`${dataType}(`);
        this.grammerValue(emitter, gram.params[0]);
        emitter.emit(')');
      } else {
        this.grammerValue(emitter, gram.params[0]);
      }
    } else {
      let tmp = [];
      gram.params.forEach(p => {
        let emit = new Emitter(this.config);
        this.grammerValue(emit, p);
        tmp.push(emit.output);
      });
      emitter.emit(tmp.join(', '));
    }

    // emit exception_end
    if (gram.exception) {
      emitter.emit(')');
    }

    emitter.emit(')'); // close BOOST_THROW_EXCEPTION
  }