diff --git a/frontend/cmd/cmd.h b/frontend/cmd/cmd.h index df18463..86d6439 100644 --- a/frontend/cmd/cmd.h +++ b/frontend/cmd/cmd.h @@ -6,6 +6,7 @@ enum command_id { CMD_ASSEMBLE, CMD_COMPILE, CMD_REPL, + CMD_INTERNAL, }; #endif diff --git a/frontend/cmd/internal.c b/frontend/cmd/internal.c new file mode 100644 index 0000000..e1797ea --- /dev/null +++ b/frontend/cmd/internal.c @@ -0,0 +1,60 @@ +#include +#include "cmd.h" +#include +#include +#include + +enum { + OPT_PRINT_SYMBOLS = 0x1000, + OPT_PRINT_KEYWORDS, +}; + +static int internal(const b_command *cmd, const b_arglist *args, const b_array *_) +{ + struct ivy_lexer *lex; + enum ivy_status status = ivy_lexer_create(&lex); + + if (status != IVY_OK) { + b_err("failed to initialise lexer (error %s)", + ivy_status_to_string(status)); + return -1; + } + + if (b_arglist_get_count(args, OPT_PRINT_SYMBOLS, B_COMMAND_INVALID_ID)) { + internal_lexer_print_symbol_tree(lex); + } + + if (b_arglist_get_count(args, OPT_PRINT_KEYWORDS, B_COMMAND_INVALID_ID)) { + internal_lexer_print_keyword_dict(lex); + } + + ivy_lexer_destroy(lex); + + return 0; +} + +B_COMMAND(CMD_INTERNAL, CMD_ROOT) +{ + B_COMMAND_NAME("internal"); + B_COMMAND_SHORT_NAME('X'); + B_COMMAND_DESC("internal frontend debugging tools."); + B_COMMAND_FUNCTION(internal); + + B_COMMAND_OPTION(OPT_PRINT_SYMBOLS) + { + B_OPTION_LONG_NAME("print-symbols"); + B_OPTION_SHORT_NAME('s'); + B_OPTION_DESC( + "print the symbol tree used by the language lexer."); + } + + B_COMMAND_OPTION(OPT_PRINT_KEYWORDS) + { + B_OPTION_LONG_NAME("print-keywords"); + B_OPTION_SHORT_NAME('k'); + B_OPTION_DESC( + "print the keyword dictionary used by the language lexer."); + } + + B_COMMAND_HELP_OPTION(); +}