diff --git a/src/fart.propane b/src/fart.propane index caa200d..f832e9b 100644 --- a/src/fart.propane +++ b/src/fart.propane @@ -1,4 +1,5 @@ tree; +tree_prefix P; drop /\s+/; diff --git a/src/fart/Engine.cpp b/src/fart/Engine.cpp index d2ddffd..c69eca5 100644 --- a/src/fart/Engine.cpp +++ b/src/fart/Engine.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -8,6 +9,11 @@ Engine::Engine(const RenderParams & params) { } +Engine::~Engine() +{ + delete scene; +} + int Engine::run(string_view input_file, opt output_file) { string output_path; @@ -49,5 +55,12 @@ int Engine::run(string_view input_file, opt output_file) return 1; } + delete scene; + scene = Parser::load_scene(input_file); + if (!scene) + { + return 1; + } + return 0; } diff --git a/src/fart/Engine.h b/src/fart/Engine.h index 951469c..528ece7 100644 --- a/src/fart/Engine.h +++ b/src/fart/Engine.h @@ -2,15 +2,18 @@ #include #include +#include #include class Engine { public: Engine(const RenderParams & params); + ~Engine(); int run(string_view input_file, opt output_file); protected: RenderParams params; std::unique_ptr image_writer; + Scene * scene = nullptr; }; diff --git a/src/fart/Parser.cpp b/src/fart/Parser.cpp index 91dc6a0..6f4e0cb 100644 --- a/src/fart/Parser.cpp +++ b/src/fart/Parser.cpp @@ -1,5 +1,7 @@ #include +#include #include +#include Scene * Parser::load_scene(const string_view & input_file) { @@ -8,5 +10,59 @@ Scene * Parser::load_scene(const string_view & input_file) { return nullptr; } - return nullptr; + + p_context_t * context = p_context_new(input->data(), input->size()); + size_t result = p_parse(context); + p_position_t pos = p_position(context); + int fname_len = (int)input_file.size(); + const char * fname = input_file.data(); + bool success = false; + switch (result) + { + case P_SUCCESS: + success = true; + break; + + case P_DECODE_ERROR: + fprintf(stderr, "%.*s:%u:%u: error: invalid UTF-8 encoding\n", + fname_len, fname, pos.row, pos.col); + break; + + case P_UNEXPECTED_INPUT: + fprintf(stderr, "%.*s:%u:%u: error: unexpected input\n", + fname_len, fname, pos.row, pos.col); + break; + + case P_UNEXPECTED_TOKEN: + { + p_token_t token = p_token(context); + if (token == TOKEN___EOF) + { + fprintf(stderr, "%.*s:%u:%u: error: unexpected end of input\n", + fname_len, fname, pos.row, pos.col); + } + else + { + fprintf(stderr, "%.*s:%u:%u: error: unexpected token '%s'\n", + fname_len, fname, pos.row, pos.col, p_token_names[token]); + } + break; + } + + default: + fprintf(stderr, "%.*s:%u:%u: internal error: unknown parser result %zu\n", + fname_len, fname, pos.row, pos.col, result); + break; + } + + if (!success) + { + p_context_delete(context); + return nullptr; + } + + /* TODO: populate the Scene from p_result(context). */ + Scene * scene = new Scene(); + p_context_delete(context); + return scene; } diff --git a/src/fart/Parser.h b/src/fart/Parser.h index 1dadd1d..1102d71 100644 --- a/src/fart/Parser.h +++ b/src/fart/Parser.h @@ -1,6 +1,6 @@ #pragma once -#include +#include class Parser {