From 40a53a4224bac2018970da67ea4671a90e740b53 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sat, 1 Jun 2024 18:52:22 +0800 Subject: [PATCH] :sparkles: add cli module and test/wavecity.nas --- CMakeLists.txt | 11 ++-- makefile | 6 +++ src/ast_dumper.h | 4 +- src/cli/cli.cpp | 7 +++ src/cli/cli.h | 56 +++++++++++++++++++++ src/main.cpp | 10 ++-- test/watchdog.nas | 10 ++-- test/wavecity.nas | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 214 insertions(+), 16 deletions(-) create mode 100644 src/cli/cli.cpp create mode 100644 src/cli/cli.h create mode 100644 test/wavecity.nas diff --git a/CMakeLists.txt b/CMakeLists.txt index e107812..cbecc8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.10) -project(nasal VERSION 10.1) +project(nasal VERSION 11.2) message("CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}") @@ -16,9 +16,7 @@ set(CMAKE_BUILD_TYPE "Release") # build nasal used object set(NASAL_OBJECT_SOURCE_FILE - ${CMAKE_SOURCE_DIR}/src/ast_dumper.cpp - ${CMAKE_SOURCE_DIR}/src/ast_visitor.cpp - ${CMAKE_SOURCE_DIR}/src/nasal_ast.cpp + ${CMAKE_SOURCE_DIR}/src/cli/cli.cpp ${CMAKE_SOURCE_DIR}/src/natives/nasal_builtin.cpp ${CMAKE_SOURCE_DIR}/src/natives/coroutine.cpp ${CMAKE_SOURCE_DIR}/src/natives/fg_props.cpp @@ -29,6 +27,9 @@ set(NASAL_OBJECT_SOURCE_FILE ${CMAKE_SOURCE_DIR}/src/natives/dylib_lib.cpp ${CMAKE_SOURCE_DIR}/src/natives/regex_lib.cpp ${CMAKE_SOURCE_DIR}/src/natives/unix_lib.cpp + ${CMAKE_SOURCE_DIR}/src/ast_dumper.cpp + ${CMAKE_SOURCE_DIR}/src/ast_visitor.cpp + ${CMAKE_SOURCE_DIR}/src/nasal_ast.cpp ${CMAKE_SOURCE_DIR}/src/nasal_codegen.cpp ${CMAKE_SOURCE_DIR}/src/nasal_dbg.cpp ${CMAKE_SOURCE_DIR}/src/nasal_err.cpp @@ -49,11 +50,13 @@ target_include_directories(nasal-object PRIVATE ${CMAKE_SOURCE_DIR}/src) # build nasal add_executable(nasal ${CMAKE_SOURCE_DIR}/src/main.cpp) target_link_libraries(nasal nasal-object) +# link ldl and lpthread if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") target_link_libraries(nasal dl) target_link_libraries(nasal pthread) endif() target_include_directories(nasal PRIVATE ${CMAKE_SOURCE_DIR}/src) +# copy nasal from build dir to the outside dir if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") add_custom_command( TARGET nasal POST_BUILD diff --git a/makefile b/makefile index 47c12b4..a496739 100644 --- a/makefile +++ b/makefile @@ -27,6 +27,7 @@ NASAL_HEADER = \ src/nasal.h\ src/optimizer.h\ src/symbol_finder.h\ + src/cli/cli.h\ src/natives/fg_props.h\ src/natives/bits_lib.h\ src/natives/io_lib.h\ @@ -66,6 +67,7 @@ NASAL_OBJECT = \ build/nasal_dbg.o\ build/repl.o\ build/regex_lib.o\ + build/cli.o\ build/main.o @@ -89,6 +91,9 @@ build/main.o: $(NASAL_HEADER) src/main.cpp | build build/nasal_misc.o: src/nasal.h src/nasal_misc.cpp | build $(CXX) $(CXXFLAGS) src/nasal_misc.cpp -o build/nasal_misc.o +build/cli.o: src/cli/cli.h src/cli/cli.cpp | build + $(CXX) $(CXXFLAGS) src/cli/cli.cpp -o build/cli.o + build/repl.o: $(NASAL_HEADER) src/repl.h src/repl.cpp | build $(CXX) $(CXXFLAGS) src/repl.cpp -o build/repl.o @@ -294,5 +299,6 @@ test:nasal @ ./nasal -e test/trait.nas @ ./nasal -t -d test/turingmachine.nas @ ./nasal -d test/wavecollapse.nas + @ ./nasal -d test/wavecity.nas @ ./nasal test/word_collector.nas test/md5compare.nas @ ./nasal -t -d test/ycombinator.nas diff --git a/src/ast_dumper.h b/src/ast_dumper.h index cfbd1d0..d9516a9 100644 --- a/src/ast_dumper.h +++ b/src/ast_dumper.h @@ -22,7 +22,7 @@ private: if (indent.size()) { if (indent.back()=="├──") { indent.back() = "│ "; - } else if (indent.back()=="└──") { + } else if (indent.back()=="╰──") { indent.back() = " "; } } @@ -34,7 +34,7 @@ private: } void set_last() { - indent.back() = "└──"; + indent.back() = "╰──"; } void dump_indent() { diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp new file mode 100644 index 0000000..c8051c2 --- /dev/null +++ b/src/cli/cli.cpp @@ -0,0 +1,7 @@ +#include "cli/cli.h" + +namespace nasal::cli { + + + +} \ No newline at end of file diff --git a/src/cli/cli.h b/src/cli/cli.h new file mode 100644 index 0000000..ba2c12d --- /dev/null +++ b/src/cli/cli.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include +#include + +namespace nasal::cli { + +enum class option { + cli_help, + cli_version, + cli_repl_mode, + cli_view_ast, + cli_view_raw_ast, + cli_view_code, + cli_show_symbol, + cli_execute, + cli_show_execute_time, + cli_show_detail_info, + cli_show_referenced_file, + cli_debug_mode, + cli_profile, + cli_profile_all, + cli_limit_mode +}; + +using config = std::unordered_map; + +const std::unordered_map options = { + {"-h", option::cli_help}, + {"--help", option::cli_help}, + {"-v", option::cli_version}, + {"--version", option::cli_version}, + {"-r", option::cli_repl_mode}, + {"--repl", option::cli_repl_mode}, + {"-a", option::cli_view_ast}, + {"--ast", option::cli_view_ast}, + {"--raw-ast", option::cli_view_raw_ast}, + {"-c", option::cli_view_code}, + {"--code", option::cli_view_code}, + {"-s", option::cli_show_symbol}, + {"--symbol", option::cli_show_symbol}, + {"-e", option::cli_execute}, + {"--exec", option::cli_execute}, + {"-t", option::cli_show_execute_time}, + {"--time", option::cli_show_execute_time}, + {"-f", option::cli_show_referenced_file}, + {"--ref-file", option::cli_show_referenced_file}, + {"-dbg", option::cli_debug_mode}, + {"--debug", option::cli_debug_mode}, + {"--prof", option::cli_profile}, + {"--prof-all", option::cli_profile_all}, + {"--limit", option::cli_limit_mode} +}; + +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index f2a107f..c9dfb81 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,6 +15,8 @@ #include "nasal_dbg.h" #include "repl.h" +#include "cli/cli.h" + #include #include #include @@ -86,8 +88,8 @@ std::ostream& logo(std::ostream& out) { << "wiki : https://wiki.flightgear.org/Nasal_scripting_language\n" << "\n" << "presented by fgprc members\n" - << " - fgprc : http://fgprc.org\n" - << " - fgprc.cn : http://fgprc.org.cn\n" + << " - http://fgprc.org\n" + << " - http://fgprc.org.cn\n" << "\n" << "input to get help .\n\n"; return out; @@ -113,9 +115,7 @@ std::ostream& version(std::ostream& out) { [[noreturn]] void err() { - std::cerr - << "invalid argument(s).\n" - << "use to get help.\n"; + std::cerr << "invalid argument(s), use to get help.\n"; std::exit(1); } diff --git a/test/watchdog.nas b/test/watchdog.nas index 2e315fd..e0e2a9f 100644 --- a/test/watchdog.nas +++ b/test/watchdog.nas @@ -4,16 +4,16 @@ use std.io; use std.unix; var os_time = func() { - return "[\e[33;1m"~os.time()~"\e[0m] "; + return "\e[33;1m["~os.time()~"]\e[0m "; } var err_hd = func() { - return "[\e[91;1merror\e[0m] "; + return "\e[91;1m[error]\e[0m "; } var info_hd = func() { - return "[\e[96;1minfo\e[0m] "; + return "\e[96;1m[info]\e[0m "; } var modified_hd = func() { - return "[\e[92;1mmodified\e[0m] "; + return "\e[92;1m[modified]\e[0m "; } var usage = func() { println(os_time(),info_hd(),"\e[1musage: nasal watchdog.nas [\"argv\"]\e[0m"); @@ -41,7 +41,7 @@ if (size(argv)==2) { var modified_time = io.fstat(filename).st_mtime; println(os_time(),info_hd(),"\e[1mwatching ",filename," ..\e[0m"); while(1) { - unix.sleep(1); + unix.sleep(5); if (!io.exists(filename)) { println(os_time(),err_hd(),"\e[1mfile <",filename,"> does not exist\e[0m"); break; diff --git a/test/wavecity.nas b/test/wavecity.nas new file mode 100644 index 0000000..baf44a4 --- /dev/null +++ b/test/wavecity.nas @@ -0,0 +1,126 @@ +var table_character_set = [ + "─", "━", "│", "┃", "╌", "╍", "╎", "╏", "┄", "┅", + "┆", "┇", "┈", "┉", "┊", "┋", "┌", "┍", "┎", "┏", + "┐", "┑", "┒", "┓", "└", "┕", "┖", "┗", "┘", "┙", + "┚", "┛", "├", "┝", "┞", "┟", "┠", "┡", "┢", "┣", + "┤", "┥", "┦", "┧", "┨", "┩", "┪", "┫", "┬", "┭", + "┮", "┯", "┰", "┱", "┲", "┳", "┴", "┵", "┶", "┷", + "┸", "┹", "┺", "┻", "┼", "┽", "┾", "┿", "╀", "╁", + "╂", "╃", "╄", "╅", "╆", "╇", "╈", "╉", "╊", "╋", + "╪", "╫", "╬", "═", "║", "╒", "╓", "╔", "╕", "╖", + "╗", "╘", "╙", "╚", "╛", "╜", "╝", "╞", "╟", "╠", + "╡", "╢", "╣", "╤", "╥", "╦", "╧", "╨", "╩", "╔", + "╗", "╝", "╚", "╬", "═", "╓", "╩", "┠", "┨", "┯", + "┷", "┏", "┓", "┗", "┛", "┳", "⊥", "﹃", "﹄", + "╮", "╭", "╯", "╰", "╳" +]; + +var road_enum = { + null: 0, + narrow: 1, + wide: 2 +}; + +var block = { + "┌": [road_enum.null, road_enum.narrow, road_enum.narrow, road_enum.null], + "└": [road_enum.narrow, road_enum.narrow, road_enum.null, road_enum.null], + "┐": [road_enum.null, road_enum.null, road_enum.narrow, road_enum.narrow], + "┘": [road_enum.narrow, road_enum.null, road_enum.null, road_enum.narrow], + "╪": [road_enum.narrow, road_enum.wide, road_enum.narrow, road_enum.wide], + "│": [road_enum.narrow, road_enum.null, road_enum.narrow, road_enum.null], + "─": [road_enum.null, road_enum.narrow, road_enum.null, road_enum.narrow], + "┼": [road_enum.narrow, road_enum.narrow, road_enum.narrow, road_enum.narrow], + "╫": [road_enum.wide, road_enum.narrow, road_enum.wide, road_enum.narrow], + "╬": [road_enum.wide, road_enum.wide, road_enum.wide, road_enum.wide], + "═": [road_enum.null, road_enum.wide, road_enum.null, road_enum.wide], + "║": [road_enum.wide, road_enum.null, road_enum.wide, road_enum.null], + # "╒": [road_enum.null, road_enum.wide, road_enum.narrow, road_enum.null], + # "╓": [road_enum.null, road_enum.narrow, road_enum.wide, road_enum.null], + "╔": [road_enum.null, road_enum.wide, road_enum.wide, road_enum.null], + # "╕": [road_enum.null, road_enum.null, road_enum.narrow, road_enum.wide], + # "╖": [road_enum.null, road_enum.null, road_enum.wide, road_enum.narrow], + "╗": [road_enum.null, road_enum.null, road_enum.wide, road_enum.wide], + # "╘": [road_enum.narrow, road_enum.wide, road_enum.null, road_enum.null], + # "╙": [road_enum.wide, road_enum.narrow, road_enum.null, road_enum.null], + "╚": [road_enum.wide, road_enum.wide, road_enum.null, road_enum.null], + # "╛": [road_enum.narrow, road_enum.null, road_enum.null, road_enum.wide], + # "╜": [road_enum.wide, road_enum.null, road_enum.null, road_enum.narrow], + "╝": [road_enum.wide, road_enum.null, road_enum.null, road_enum.wide], + "╞": [road_enum.narrow, road_enum.wide, road_enum.narrow, road_enum.null], + "╟": [road_enum.wide, road_enum.narrow, road_enum.wide, road_enum.null], + "╠": [road_enum.wide, road_enum.wide, road_enum.wide, road_enum.null], + "╡": [road_enum.narrow, road_enum.null, road_enum.narrow, road_enum.wide], + "╢": [road_enum.wide, road_enum.null, road_enum.wide, road_enum.narrow], + "╣": [road_enum.wide, road_enum.null, road_enum.wide, road_enum.wide], + "╤": [road_enum.null, road_enum.wide, road_enum.narrow, road_enum.wide], + "╥": [road_enum.null, road_enum.narrow, road_enum.wide, road_enum.narrow], + "╦": [road_enum.null, road_enum.wide, road_enum.wide, road_enum.wide], + "╧": [road_enum.narrow, road_enum.wide, road_enum.null, road_enum.wide], + "╨": [road_enum.wide, road_enum.narrow, road_enum.null, road_enum.narrow], + "╩": [road_enum.wide, road_enum.wide, road_enum.null, road_enum.wide], + " ": [road_enum.null, road_enum.null, road_enum.null, road_enum.null] +}; + +var choice = func(above_block_char, + left_block_char, + flag_no_road_at_right, + flag_no_road_at_bottom) { + var above_block = block[above_block_char]; + var left_block = block[left_block_char]; + var block_char_set = keys(block); + + var possible = []; + foreach(var bcs; block_char_set) { + var this_block = block[bcs]; + if (this_block[0] == above_block[2] and + this_block[3] == left_block[1]) { + if (flag_no_road_at_right and this_block[1]!=road_enum.null) { + continue; + } + if (flag_no_road_at_bottom and this_block[2]!=road_enum.null) { + continue; + } + append(possible, bcs); + } + } + + func() { + if (vecindex(possible, " ")!=nil) { + for(var i = 0; i < 64; i+= 1) { + append(possible, " "); + } + } + }(); + return possible[rand()*size(possible)]; +} + +var print_whole_line = func(this_line) { + var res = ""; + foreach(var i; this_line) { + res ~= i; + } + println(res); +} + +srand(); +var last_line = []; +for(var i = 0; i<100; i+=1) { + append(last_line, " "); +} + +for(var iteration_times = 0; iteration_times < 25; iteration_times += 1) { + var this_line = []; + var left_block = " "; + for(var i = 0; i < 100; i += 1) { + var this_block = choice( + last_line[i], + left_block, + i==99, + iteration_times==24 + ); + left_block = this_block; + append(this_line, this_block); + } + print_whole_line(this_line); + last_line = this_line; +}