✨ add cli module and test/wavecity.nas
This commit is contained in:
parent
3b71c5fee4
commit
40a53a4224
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
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}")
|
message("CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}")
|
||||||
|
|
||||||
|
@ -16,9 +16,7 @@ set(CMAKE_BUILD_TYPE "Release")
|
||||||
|
|
||||||
# build nasal used object
|
# build nasal used object
|
||||||
set(NASAL_OBJECT_SOURCE_FILE
|
set(NASAL_OBJECT_SOURCE_FILE
|
||||||
${CMAKE_SOURCE_DIR}/src/ast_dumper.cpp
|
${CMAKE_SOURCE_DIR}/src/cli/cli.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/ast_visitor.cpp
|
|
||||||
${CMAKE_SOURCE_DIR}/src/nasal_ast.cpp
|
|
||||||
${CMAKE_SOURCE_DIR}/src/natives/nasal_builtin.cpp
|
${CMAKE_SOURCE_DIR}/src/natives/nasal_builtin.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/natives/coroutine.cpp
|
${CMAKE_SOURCE_DIR}/src/natives/coroutine.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/natives/fg_props.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/dylib_lib.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/natives/regex_lib.cpp
|
${CMAKE_SOURCE_DIR}/src/natives/regex_lib.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/natives/unix_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_codegen.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/nasal_dbg.cpp
|
${CMAKE_SOURCE_DIR}/src/nasal_dbg.cpp
|
||||||
${CMAKE_SOURCE_DIR}/src/nasal_err.cpp
|
${CMAKE_SOURCE_DIR}/src/nasal_err.cpp
|
||||||
|
@ -49,11 +50,13 @@ target_include_directories(nasal-object PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
# build nasal
|
# build nasal
|
||||||
add_executable(nasal ${CMAKE_SOURCE_DIR}/src/main.cpp)
|
add_executable(nasal ${CMAKE_SOURCE_DIR}/src/main.cpp)
|
||||||
target_link_libraries(nasal nasal-object)
|
target_link_libraries(nasal nasal-object)
|
||||||
|
# link ldl and lpthread
|
||||||
if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
|
if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
|
||||||
target_link_libraries(nasal dl)
|
target_link_libraries(nasal dl)
|
||||||
target_link_libraries(nasal pthread)
|
target_link_libraries(nasal pthread)
|
||||||
endif()
|
endif()
|
||||||
target_include_directories(nasal PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
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")
|
if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
TARGET nasal POST_BUILD
|
TARGET nasal POST_BUILD
|
||||||
|
|
6
makefile
6
makefile
|
@ -27,6 +27,7 @@ NASAL_HEADER = \
|
||||||
src/nasal.h\
|
src/nasal.h\
|
||||||
src/optimizer.h\
|
src/optimizer.h\
|
||||||
src/symbol_finder.h\
|
src/symbol_finder.h\
|
||||||
|
src/cli/cli.h\
|
||||||
src/natives/fg_props.h\
|
src/natives/fg_props.h\
|
||||||
src/natives/bits_lib.h\
|
src/natives/bits_lib.h\
|
||||||
src/natives/io_lib.h\
|
src/natives/io_lib.h\
|
||||||
|
@ -66,6 +67,7 @@ NASAL_OBJECT = \
|
||||||
build/nasal_dbg.o\
|
build/nasal_dbg.o\
|
||||||
build/repl.o\
|
build/repl.o\
|
||||||
build/regex_lib.o\
|
build/regex_lib.o\
|
||||||
|
build/cli.o\
|
||||||
build/main.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
|
build/nasal_misc.o: src/nasal.h src/nasal_misc.cpp | build
|
||||||
$(CXX) $(CXXFLAGS) src/nasal_misc.cpp -o build/nasal_misc.o
|
$(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
|
build/repl.o: $(NASAL_HEADER) src/repl.h src/repl.cpp | build
|
||||||
$(CXX) $(CXXFLAGS) src/repl.cpp -o build/repl.o
|
$(CXX) $(CXXFLAGS) src/repl.cpp -o build/repl.o
|
||||||
|
|
||||||
|
@ -294,5 +299,6 @@ test:nasal
|
||||||
@ ./nasal -e test/trait.nas
|
@ ./nasal -e test/trait.nas
|
||||||
@ ./nasal -t -d test/turingmachine.nas
|
@ ./nasal -t -d test/turingmachine.nas
|
||||||
@ ./nasal -d test/wavecollapse.nas
|
@ ./nasal -d test/wavecollapse.nas
|
||||||
|
@ ./nasal -d test/wavecity.nas
|
||||||
@ ./nasal test/word_collector.nas test/md5compare.nas
|
@ ./nasal test/word_collector.nas test/md5compare.nas
|
||||||
@ ./nasal -t -d test/ycombinator.nas
|
@ ./nasal -t -d test/ycombinator.nas
|
||||||
|
|
|
@ -22,7 +22,7 @@ private:
|
||||||
if (indent.size()) {
|
if (indent.size()) {
|
||||||
if (indent.back()=="├──") {
|
if (indent.back()=="├──") {
|
||||||
indent.back() = "│ ";
|
indent.back() = "│ ";
|
||||||
} else if (indent.back()=="└──") {
|
} else if (indent.back()=="╰──") {
|
||||||
indent.back() = " ";
|
indent.back() = " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_last() {
|
void set_last() {
|
||||||
indent.back() = "└──";
|
indent.back() = "╰──";
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_indent() {
|
void dump_indent() {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "cli/cli.h"
|
||||||
|
|
||||||
|
namespace nasal::cli {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <sstream>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
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<option, std::string>;
|
||||||
|
|
||||||
|
const std::unordered_map<std::string, option> 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}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
10
src/main.cpp
10
src/main.cpp
|
@ -15,6 +15,8 @@
|
||||||
#include "nasal_dbg.h"
|
#include "nasal_dbg.h"
|
||||||
#include "repl.h"
|
#include "repl.h"
|
||||||
|
|
||||||
|
#include "cli/cli.h"
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
@ -86,8 +88,8 @@ std::ostream& logo(std::ostream& out) {
|
||||||
<< "wiki : https://wiki.flightgear.org/Nasal_scripting_language\n"
|
<< "wiki : https://wiki.flightgear.org/Nasal_scripting_language\n"
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< "presented by fgprc members\n"
|
<< "presented by fgprc members\n"
|
||||||
<< " - fgprc : http://fgprc.org\n"
|
<< " - http://fgprc.org\n"
|
||||||
<< " - fgprc.cn : http://fgprc.org.cn\n"
|
<< " - http://fgprc.org.cn\n"
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< "input <nasal -h> to get help .\n\n";
|
<< "input <nasal -h> to get help .\n\n";
|
||||||
return out;
|
return out;
|
||||||
|
@ -113,9 +115,7 @@ std::ostream& version(std::ostream& out) {
|
||||||
|
|
||||||
[[noreturn]]
|
[[noreturn]]
|
||||||
void err() {
|
void err() {
|
||||||
std::cerr
|
std::cerr << "invalid argument(s), use <nasal -h> to get help.\n";
|
||||||
<< "invalid argument(s).\n"
|
|
||||||
<< "use <nasal -h> to get help.\n";
|
|
||||||
std::exit(1);
|
std::exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,16 +4,16 @@ use std.io;
|
||||||
use std.unix;
|
use std.unix;
|
||||||
|
|
||||||
var os_time = func() {
|
var os_time = func() {
|
||||||
return "[\e[33;1m"~os.time()~"\e[0m] ";
|
return "\e[33;1m["~os.time()~"]\e[0m ";
|
||||||
}
|
}
|
||||||
var err_hd = func() {
|
var err_hd = func() {
|
||||||
return "[\e[91;1merror\e[0m] ";
|
return "\e[91;1m[error]\e[0m ";
|
||||||
}
|
}
|
||||||
var info_hd = func() {
|
var info_hd = func() {
|
||||||
return "[\e[96;1minfo\e[0m] ";
|
return "\e[96;1m[info]\e[0m ";
|
||||||
}
|
}
|
||||||
var modified_hd = func() {
|
var modified_hd = func() {
|
||||||
return "[\e[92;1mmodified\e[0m] ";
|
return "\e[92;1m[modified]\e[0m ";
|
||||||
}
|
}
|
||||||
var usage = func() {
|
var usage = func() {
|
||||||
println(os_time(),info_hd(),"\e[1musage: nasal watchdog.nas <filename> [\"argv\"]\e[0m");
|
println(os_time(),info_hd(),"\e[1musage: nasal watchdog.nas <filename> [\"argv\"]\e[0m");
|
||||||
|
@ -41,7 +41,7 @@ if (size(argv)==2) {
|
||||||
var modified_time = io.fstat(filename).st_mtime;
|
var modified_time = io.fstat(filename).st_mtime;
|
||||||
println(os_time(),info_hd(),"\e[1mwatching ",filename," ..\e[0m");
|
println(os_time(),info_hd(),"\e[1mwatching ",filename," ..\e[0m");
|
||||||
while(1) {
|
while(1) {
|
||||||
unix.sleep(1);
|
unix.sleep(5);
|
||||||
if (!io.exists(filename)) {
|
if (!io.exists(filename)) {
|
||||||
println(os_time(),err_hd(),"\e[1mfile <",filename,"> does not exist\e[0m");
|
println(os_time(),err_hd(),"\e[1mfile <",filename,"> does not exist\e[0m");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue