Browse Source

rewriting driver

Nicolas Winkler 6 years ago
parent
commit
39ff3c7c7f
4 changed files with 61 additions and 46 deletions
  1. 44 41
      src/Driver.cpp
  2. 8 5
      src/Driver.h
  3. 7 0
      src/ast/Ast.cpp
  4. 2 0
      src/ast/Ast.h

+ 44 - 41
src/Driver.cpp

@@ -74,36 +74,7 @@ int Driver::run(void)
     
     logger.debug() << "starting parser" << std::endl;
     //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) {
         logger << "Aborting due to syntax errors." << std::endl;
@@ -113,7 +84,7 @@ int Driver::run(void)
     std::unique_ptr<qlow::sem::GlobalScope> semClasses = nullptr;
     try {
         semClasses =
-            qlow::sem::createFromAst(objects);
+            qlow::sem::createFromAst(this->ast);
     }
     catch(SemanticError& se) {
         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();
 }
 
 

+ 8 - 5
src/Driver.h

@@ -6,6 +6,7 @@
 #include <memory>
 #include <string>
 #include <utility>
+#include "Parser.h"
 
 namespace qlow
 {
@@ -14,8 +15,8 @@ namespace qlow
     class Driver;
     
     
-    namespace ast
-    {
+    namespace ast {
+        struct Ast;
         struct AstObject;
     }
 }
@@ -37,16 +38,18 @@ struct qlow::Options
 class qlow::Driver
 {
     Options options;
+    std::unique_ptr<qlow::ast::Ast> ast = nullptr;
 public:
     Driver(void) = delete;
     Driver(int argc, char** argv);
     
     int run(void);
+
+    bool parseStage(void);
     
-    /// \brief runs the parser over a given stream
-    /// \warning Don't call concurrently. Not (yet) supported!
-    std::vector<std::unique_ptr<qlow::ast::AstObject>> parseFile(FILE* file);
+    qlow::ast::Ast parseFile(FILE* file, const std::string& filename);
 };
 
 
 #endif // QLOW_DRIVER_H
+

+ 7 - 0
src/ast/Ast.cpp

@@ -6,6 +6,13 @@
 
 using namespace qlow::ast;
 
+void Ast::merge(Ast&& other)
+{
+    objects.insert(objects.end(),
+                   std::make_move_iterator(other.objects.begin()),
+                   std::make_move_iterator(other.objects.end()));
+}
+
 
 AstObject::~AstObject(void)
 {

+ 2 - 0
src/ast/Ast.h

@@ -102,6 +102,8 @@ class qlow::ast::Ast
 public:
     inline const OwningList<AstObject>& getObjects(void) const  { return objects; }
     inline       OwningList<AstObject>& getObjects(void)        { return objects; }
+
+    void merge(Ast&& other);
 };