polserver/pol-core/bscript/compiler/codegen/CodeGenerator.cpp
Eric Swanson 3a8ab09a56
Add Expression, Statement, Value AST base classes, and TopLevelStatements (#229)
* Add ast/ Expression, Statement, Value

* Add ast/TopLevelStatements
2020-08-17 22:53:03 -07:00

54 lines
1.7 KiB
C++

#include "CodeGenerator.h"
#include <memory>
#include "StoredToken.h"
#include "compiler/ast/TopLevelStatements.h"
#include "compiler/codegen/InstructionEmitter.h"
#include "compiler/codegen/InstructionGenerator.h"
#include "compiler/file/SourceFileIdentifier.h"
#include "compiler/model/CompilerWorkspace.h"
#include "compiler/representation/CompiledScript.h"
#include "compiler/representation/ExportedFunction.h"
#include "compiler/representation/ModuleDescriptor.h"
#include "compiler/representation/ModuleFunctionDescriptor.h"
namespace Pol::Bscript::Compiler
{
std::unique_ptr<CompiledScript> CodeGenerator::generate(
std::unique_ptr<CompilerWorkspace> workspace, const LegacyFunctionOrder* )
{
auto program_info = std::unique_ptr<CompiledScript::ProgramInfo>();
CodeSection code;
DataSection data;
ExportedFunctions exported_functions;
std::vector<ModuleDescriptor> module_descriptors;
InstructionEmitter instruction_emitter( code, data );
CodeGenerator generator( instruction_emitter );
generator.generate_instructions( *workspace );
return std::make_unique<CompiledScript>(
std::move( code ), std::move( data ), std::move( exported_functions ),
std::move( workspace->global_variable_names ), std::move( module_descriptors ),
std::move( program_info ), std::move( workspace->referenced_source_file_identifiers ) );
}
CodeGenerator::CodeGenerator( InstructionEmitter& emitter )
: emitter( emitter ),
emit( emitter )
{
}
void CodeGenerator::generate_instructions( CompilerWorkspace& workspace )
{
InstructionGenerator top_level_instruction_generator( emitter );
workspace.top_level_statements->accept( top_level_instruction_generator );
emit.progend();
}
} // namespace Pol::Bscript::Compiler