|  | @@ -74,36 +74,7 @@ int Driver::run(void)
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  |      logger.debug() << "starting parser" << std::endl;
 |  |      logger.debug() << "starting parser" << std::endl;
 | 
											
												
													
														|  |      //logger.logError("driver not yet implemented", {options.emitAssembly ? "asm" : "noasm", 10, 11, 12, 13});
 |  |      //logger.logError("driver not yet implemented", {options.emitAssembly ? "asm" : "noasm", 10, 11, 12, 13});
 | 
											
												
													
														|  | -    
 |  | 
 | 
											
												
													
														|  | -    std::vector<std::unique_ptr<qlow::ast::AstObject>> objects;
 |  | 
 | 
											
												
													
														|  | -    bool errorOccurred = false;
 |  | 
 | 
											
												
													
														|  | -    
 |  | 
 | 
											
												
													
														|  | -    for (auto& filename : options.infiles) {
 |  | 
 | 
											
												
													
														|  | -        std::FILE* file = std::fopen(filename.c_str(), "r");
 |  | 
 | 
											
												
													
														|  | -        ::qlow_parser_filename = filename.c_str();
 |  | 
 | 
											
												
													
														|  | -        
 |  | 
 | 
											
												
													
														|  | -        try {
 |  | 
 | 
											
												
													
														|  | -            auto newObjects = parseFile(file);
 |  | 
 | 
											
												
													
														|  | -            objects.insert(objects.end(),
 |  | 
 | 
											
												
													
														|  | -                           std::make_move_iterator(newObjects.begin()),
 |  | 
 | 
											
												
													
														|  | -                           std::make_move_iterator(newObjects.end()));
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        catch (const CompileError& ce) {
 |  | 
 | 
											
												
													
														|  | -            ce.print(logger);
 |  | 
 | 
											
												
													
														|  | -            errorOccurred = true;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        catch (const char* errMsg) {
 |  | 
 | 
											
												
													
														|  | -            reportError(errMsg);
 |  | 
 | 
											
												
													
														|  | -            errorOccurred = true;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        catch (...) {
 |  | 
 | 
											
												
													
														|  | -            reportError("an unknown error occurred.");
 |  | 
 | 
											
												
													
														|  | -            errorOccurred = true;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        
 |  | 
 | 
											
												
													
														|  | -        if (file)
 |  | 
 | 
											
												
													
														|  | -            std::fclose(file);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    bool errorOccurred = parseStage();
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  |      if (errorOccurred) {
 |  |      if (errorOccurred) {
 | 
											
												
													
														|  |          logger << "Aborting due to syntax errors." << std::endl;
 |  |          logger << "Aborting due to syntax errors." << std::endl;
 | 
											
										
											
												
													
														|  | @@ -113,7 +84,7 @@ int Driver::run(void)
 | 
											
												
													
														|  |      std::unique_ptr<qlow::sem::GlobalScope> semClasses = nullptr;
 |  |      std::unique_ptr<qlow::sem::GlobalScope> semClasses = nullptr;
 | 
											
												
													
														|  |      try {
 |  |      try {
 | 
											
												
													
														|  |          semClasses =
 |  |          semClasses =
 | 
											
												
													
														|  | -            qlow::sem::createFromAst(objects);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            qlow::sem::createFromAst(this->ast);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      catch(SemanticError& se) {
 |  |      catch(SemanticError& se) {
 | 
											
												
													
														|  |          se.print(logger);
 |  |          se.print(logger);
 | 
											
										
											
												
													
														|  | @@ -196,17 +167,49 @@ int Driver::run(void)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -std::vector<std::unique_ptr<qlow::ast::AstObject>> Driver::parseFile(FILE* file)
 |  | 
 | 
											
												
													
														|  | 
 |  | +bool Driver::parseStage(void)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -    ::qlow_parser_in = file;
 |  | 
 | 
											
												
													
														|  | -    if (!::qlow_parser_in)
 |  | 
 | 
											
												
													
														|  | -        throw "Could not run parser: Invalid file";
 |  | 
 | 
											
												
													
														|  | -    
 |  | 
 | 
											
												
													
														|  | -    ::qlow_parser_parse();
 |  | 
 | 
											
												
													
														|  | -    
 |  | 
 | 
											
												
													
														|  | -    auto retval = std::move(*parsedClasses);
 |  | 
 | 
											
												
													
														|  | -    parsedClasses.reset();
 |  | 
 | 
											
												
													
														|  | -    return retval;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    using std::literals;
 | 
											
												
													
														|  | 
 |  | +    this->ast = std::make_unique<ast::Ast>();
 | 
											
												
													
														|  | 
 |  | +    bool errorOccurred = false;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    for (auto& filename : options.infiles) {
 | 
											
												
													
														|  | 
 |  | +        std::FILE* file = std::fopen(filename.c_str(), "r");
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (!file) {
 | 
											
												
													
														|  | 
 |  | +            reportError("could not open file "s + filename + ".");
 | 
											
												
													
														|  | 
 |  | +            continue;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        try {
 | 
											
												
													
														|  | 
 |  | +            // parse file content and add parsed objects to global ast
 | 
											
												
													
														|  | 
 |  | +            this->ast->merge(parseFile(file, filename));
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        catch (const CompileError& ce) {
 | 
											
												
													
														|  | 
 |  | +            ce.print(logger);
 | 
											
												
													
														|  | 
 |  | +            errorOccurred = true;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        catch (const char* errMsg) {
 | 
											
												
													
														|  | 
 |  | +            reportError(errMsg);
 | 
											
												
													
														|  | 
 |  | +            errorOccurred = true;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        catch (...) {
 | 
											
												
													
														|  | 
 |  | +            reportError("an unknown error occurred.");
 | 
											
												
													
														|  | 
 |  | +            errorOccurred = true;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        
 | 
											
												
													
														|  | 
 |  | +        if (file)
 | 
											
												
													
														|  | 
 |  | +            std::fclose(file);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return errorOccurred;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +qlow::ast::Ast Driver::parseFile(FILE* file,
 | 
											
												
													
														|  | 
 |  | +        const std::string& filename)
 | 
											
												
													
														|  | 
 |  | +{
 | 
											
												
													
														|  | 
 |  | +    ast::Parser parser(file, filename);
 | 
											
												
													
														|  | 
 |  | +    return parser.parse();
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 |