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
}