diff --git a/CMakeLists.txt b/CMakeLists.txt index e6c3521..64d7e3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,10 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wshadow -Wall") add_compile_options(-fPIC) +# MSVC needs this command option to really enable utf-8 output +if(MSVC) + add_compile_options(/utf-8) +endif() # generate release executables set(CMAKE_BUILD_TYPE "Release") diff --git a/makefile b/makefile index 698e9c2..17a35e8 100644 --- a/makefile +++ b/makefile @@ -112,7 +112,12 @@ build/nasal_type.o:\ src/nasal_type.h src/nasal_type.cpp | build $(CXX) $(CXXFLAGS) src/nasal_type.cpp -o build/nasal_type.o -build/nasal_gc.o: src/nasal.h src/nasal_type.h src/nasal_gc.h src/nasal_gc.cpp | build +build/nasal_gc.o:\ + src/nasal.h\ + src/util/util.h\ + src/nasal_type.h\ + src/nasal_gc.h\ + src/nasal_gc.cpp | build $(CXX) $(CXXFLAGS) src/nasal_gc.cpp -o build/nasal_gc.o build/nasal_import.o: \ diff --git a/src/ast_dumper.cpp b/src/ast_dumper.cpp index 03fbb71..c570019 100644 --- a/src/ast_dumper.cpp +++ b/src/ast_dumper.cpp @@ -185,6 +185,7 @@ bool ast_dumper::visit_binary_operator(binary_operator* node) { case binary_operator::binary_type::leq: std::cout << "<="; break; case binary_operator::binary_type::condition_and: std::cout << "and"; break; case binary_operator::binary_type::condition_or: std::cout << "or"; break; + case binary_operator::binary_type::null_chain: std::cout << "??"; break; } std::cout << "\"" << format_location(node); push_indent(); @@ -241,6 +242,13 @@ bool ast_dumper::visit_call_hash(call_hash* node) { return true; } +bool ast_dumper::visit_null_access(null_access* node) { + dump_indent(); + std::cout << "null_access " << node->get_field(); + std::cout << format_location(node); + return true; +} + bool ast_dumper::visit_call_vector(call_vector* node) { dump_indent(); std::cout << "call_vector"; diff --git a/src/ast_dumper.h b/src/ast_dumper.h index 3855509..1586d0b 100644 --- a/src/ast_dumper.h +++ b/src/ast_dumper.h @@ -45,7 +45,7 @@ private: std::string format_location(expr* node) { std::stringstream ss; - ss << " → ["; + ss << " ⇒ ["; node->get_location().dump_begin(ss); ss << "]\n"; return ss.str(); @@ -70,6 +70,7 @@ public: bool visit_unary_operator(unary_operator*) override; bool visit_call_expr(call_expr*) override; bool visit_call_hash(call_hash*) override; + bool visit_null_access(null_access*) override; bool visit_call_vector(call_vector*) override; bool visit_call_function(call_function*) override; bool visit_slice_vector(slice_vector*) override; @@ -90,10 +91,10 @@ public: public: void dump(code_block* root) { - util::windows_code_page_manager wcpm; - wcpm.set_utf8_output(); + util::windows_code_page_manager wm; + wm.set_utf8_output(); root->accept(this); - wcpm.restore_code_page(); + wm.restore_code_page(); } }; diff --git a/src/ast_visitor.cpp b/src/ast_visitor.cpp index f438b4b..dacd80b 100644 --- a/src/ast_visitor.cpp +++ b/src/ast_visitor.cpp @@ -116,6 +116,10 @@ bool ast_visitor::visit_call_hash(call_hash* node) { return true; } +bool ast_visitor::visit_null_access(null_access* node) { + return true; +} + bool ast_visitor::visit_call_vector(call_vector* node) { for(auto i : node->get_slices()) { i->accept(this); diff --git a/src/ast_visitor.h b/src/ast_visitor.h index 4235541..e6a5abd 100644 --- a/src/ast_visitor.h +++ b/src/ast_visitor.h @@ -26,6 +26,7 @@ public: virtual bool visit_unary_operator(unary_operator*); virtual bool visit_call_expr(call_expr*); virtual bool visit_call_hash(call_hash*); + virtual bool visit_null_access(null_access*); virtual bool visit_call_vector(call_vector*); virtual bool visit_call_function(call_function*); virtual bool visit_slice_vector(slice_vector*); diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index fa0caf5..8605fa1 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -23,4 +23,40 @@ cli_config parse(const std::vector& args) { return result; } +std::ostream& help(std::ostream& out) { + out + << "\n" + << " ,--#-,\n" + << "<3 / \\____\\ <3\n" + << " |_|__A_|\n" + << "\nnasal