Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

script: Add modify memory operators (eg. +=) #573

Merged
merged 8 commits into from
Sep 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 33 additions & 7 deletions apps/utilities/repl.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,16 @@
* ReadEvalPrintLoop - Utility to play around with script execution.
*/

typedef enum {
ReplFlags_None = 0,
ReplFlags_OutputAst = 1 << 0,
} ReplFlags;

static void repl_output(const String text) { file_write_sync(g_file_stdout, text); }

static void repl_output_error(const String message) {
const String text = fmt_write_scratch(
"{}ERROR: {}{}\n",
"{}ERROR: {}{}",
fmt_ttystyle(.bgColor = TtyBgColor_Red, .flags = TtyStyleFlags_Bold),
fmt_text(message),
fmt_ttystyle());
Expand All @@ -43,15 +48,22 @@ static TtyFgColor repl_token_color(const ScriptTokenType tokenType) {
case ScriptTokenType_Gt:
case ScriptTokenType_GtEq:
case ScriptTokenType_Plus:
case ScriptTokenType_PlusEq:
case ScriptTokenType_Minus:
case ScriptTokenType_MinusEq:
case ScriptTokenType_Star:
case ScriptTokenType_StarEq:
case ScriptTokenType_Slash:
case ScriptTokenType_SlashEq:
case ScriptTokenType_Percent:
case ScriptTokenType_PercentEq:
case ScriptTokenType_Colon:
case ScriptTokenType_SemiColon:
case ScriptTokenType_AmpAmp:
case ScriptTokenType_PipePipe:
case ScriptTokenType_QMark:
case ScriptTokenType_QMarkQMark:
case ScriptTokenType_QMarkQMarkEq:
return TtyFgColor_Green;
case ScriptTokenType_ParenOpen:
case ScriptTokenType_ParenClose:
Expand All @@ -63,6 +75,7 @@ static TtyFgColor repl_token_color(const ScriptTokenType tokenType) {
}

typedef struct {
ReplFlags flags;
String editPrevText;
DynString* editBuffer;
ScriptMem* scriptMem;
Expand Down Expand Up @@ -107,11 +120,13 @@ static void repl_edit_submit(ReplState* state) {
script_read_all(script, dynstring_view(state->editBuffer), &res);

if (res.type == ScriptResult_Success) {
if (state->flags & ReplFlags_OutputAst) {
repl_output(fmt_write_scratch("{}\n", script_expr_fmt(script, res.expr)));
}
const ScriptVal value = script_eval(script, state->scriptMem, res.expr);
const String text = fmt_write_scratch("{}\n", fmt_text(script_val_str_scratch(value)));
repl_output(text);
repl_output(fmt_write_scratch("{}\n", script_val_fmt(value)));
} else {
repl_output_error(script_error_str(res.error));
repl_output_error(fmt_write_scratch("{}\n", fmt_text(script_error_str(res.error))));
}

script_destroy(script);
Expand Down Expand Up @@ -191,7 +206,7 @@ static bool repl_update(ReplState* state, TtyInputToken* input) {
return true; // Keep running.
}

static i32 repl_run_interactive() {
static i32 repl_run_interactive(const ReplFlags flags) {
if (!tty_isatty(g_file_stdin) || !tty_isatty(g_file_stdout)) {
file_write_sync(g_file_stderr, string_lit("ERROR: REPL has to be ran interactively\n"));
return 1;
Expand All @@ -201,6 +216,7 @@ static i32 repl_run_interactive() {
DynString editBuffer = dynstring_create(g_alloc_heap, 128);

ReplState state = {
.flags = flags,
.editBuffer = &editBuffer,
.scriptMem = script_mem_create(g_alloc_heap),
};
Expand Down Expand Up @@ -234,19 +250,29 @@ static i32 repl_run_interactive() {
return 0;
}

static CliId g_helpFlag;
static CliId g_astFlag, g_helpFlag;

void app_cli_configure(CliApp* app) {
cli_app_register_desc(app, string_lit("Script ReadEvalPrintLoop utility."));

g_astFlag = cli_register_flag(app, 'a', string_lit("ast"), CliOptionFlags_None);
cli_register_desc(app, g_astFlag, string_lit("Ouput the abstract-syntax-tree expressions."));

g_helpFlag = cli_register_flag(app, 'h', string_lit("help"), CliOptionFlags_None);
cli_register_desc(app, g_helpFlag, string_lit("Display this help page."));
cli_register_exclusions(app, g_helpFlag, g_astFlag);
}

i32 app_cli_run(const CliApp* app, const CliInvocation* invoc) {
if (cli_parse_provided(invoc, g_helpFlag)) {
cli_help_write_file(app, g_file_stdout);
return 0;
}
return repl_run_interactive();

ReplFlags flags = ReplFlags_None;
if (cli_parse_provided(invoc, g_astFlag)) {
flags |= ReplFlags_OutputAst;
}

return repl_run_interactive(flags);
}
2 changes: 1 addition & 1 deletion libs/ai/test/test_node_execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ spec(node_execute) {
.nextSibling = sentinel_u16,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc, key, script_add_value(scriptDoc, script_number(42))),
},
},
Expand Down
2 changes: 1 addition & 1 deletion libs/ai/test/test_node_invert.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ spec(node_invert) {
.nextSibling = sentinel_u16,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc,
string_hash_lit("test"),
script_add_value(scriptDoc, script_number(42.42))),
Expand Down
6 changes: 3 additions & 3 deletions libs/ai/test/test_node_parallel.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ spec(node_parallel) {
.nextSibling = 2,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc,
string_hash_lit("test1"),
script_add_value(scriptDoc, script_number(1))),
Expand All @@ -119,7 +119,7 @@ spec(node_parallel) {
.nextSibling = 3,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc,
string_hash_lit("test2"),
script_add_value(scriptDoc, script_number(2))),
Expand All @@ -130,7 +130,7 @@ spec(node_parallel) {
.nextSibling = sentinel_u16,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc,
string_hash_lit("test3"),
script_add_value(scriptDoc, script_number(3))),
Expand Down
2 changes: 1 addition & 1 deletion libs/ai/test/test_node_repeat.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ spec(node_repeat) {
.nextSibling = sentinel_u16,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc,
string_hash_lit("test"),
script_add_value(scriptDoc, script_number(42.42))),
Expand Down
2 changes: 1 addition & 1 deletion libs/ai/test/test_node_try.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ spec(node_try) {
.nextSibling = sentinel_u16,
.data_execute =
{
.scriptExpr = script_add_store(
.scriptExpr = script_add_mem_store(
scriptDoc,
string_hash_lit("test"),
script_add_value(scriptDoc, script_number(42.42))),
Expand Down
8 changes: 4 additions & 4 deletions libs/script/include/script_doc.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ typedef struct sScriptDoc ScriptDoc;
*/
typedef enum {
ScriptExprType_Value,
ScriptExprType_Load,
ScriptExprType_Store,
ScriptExprType_MemLoad,
ScriptExprType_MemStore,
ScriptExprType_OpNullary,
ScriptExprType_OpUnary,
ScriptExprType_OpBinary,
Expand Down Expand Up @@ -48,8 +48,8 @@ void script_destroy(ScriptDoc*);
* Add new expressions.
*/
ScriptExpr script_add_value(ScriptDoc*, ScriptVal val);
ScriptExpr script_add_load(ScriptDoc*, StringHash key);
ScriptExpr script_add_store(ScriptDoc*, StringHash key, ScriptExpr val);
ScriptExpr script_add_mem_load(ScriptDoc*, StringHash key);
ScriptExpr script_add_mem_store(ScriptDoc*, StringHash key, ScriptExpr val);
ScriptExpr script_add_op_nullary(ScriptDoc*, ScriptOpNullary);
ScriptExpr script_add_op_unary(ScriptDoc*, ScriptExpr, ScriptOpUnary);
ScriptExpr script_add_op_binary(ScriptDoc*, ScriptExpr, ScriptExpr, ScriptOpBinary);
Expand Down
59 changes: 33 additions & 26 deletions libs/script/include/script_lex.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,39 @@
#include "script_error.h"

typedef enum {
ScriptTokenType_ParenOpen, // (
ScriptTokenType_ParenClose, // )
ScriptTokenType_Comma, // ,
ScriptTokenType_Eq, // =
ScriptTokenType_EqEq, // ==
ScriptTokenType_Bang, // !
ScriptTokenType_BangEq, // !=
ScriptTokenType_Le, // <
ScriptTokenType_LeEq, // <=
ScriptTokenType_Gt, // >
ScriptTokenType_GtEq, // >=
ScriptTokenType_Plus, // +
ScriptTokenType_Minus, // -
ScriptTokenType_Star, // *
ScriptTokenType_Slash, // /
ScriptTokenType_Colon, // :
ScriptTokenType_SemiColon, // ;
ScriptTokenType_AmpAmp, // &&
ScriptTokenType_PipePipe, // ||
ScriptTokenType_QMark, // ?
ScriptTokenType_QMarkQMark, // ??
ScriptTokenType_Number, // 42.1337
ScriptTokenType_Identifier, // foo
ScriptTokenType_Key, // $bar
ScriptTokenType_Error, //
ScriptTokenType_End, // \0
ScriptTokenType_ParenOpen, // (
ScriptTokenType_ParenClose, // )
ScriptTokenType_Comma, // ,
ScriptTokenType_Eq, // =
ScriptTokenType_EqEq, // ==
ScriptTokenType_Bang, // !
ScriptTokenType_BangEq, // !=
ScriptTokenType_Le, // <
ScriptTokenType_LeEq, // <=
ScriptTokenType_Gt, // >
ScriptTokenType_GtEq, // >=
ScriptTokenType_Plus, // +
ScriptTokenType_PlusEq, // +=
ScriptTokenType_Minus, // -
ScriptTokenType_MinusEq, // -=
ScriptTokenType_Star, // *
ScriptTokenType_StarEq, // *=
ScriptTokenType_Slash, // /
ScriptTokenType_SlashEq, // /=
ScriptTokenType_Percent, // %
ScriptTokenType_PercentEq, // %=
ScriptTokenType_Colon, // :
ScriptTokenType_SemiColon, // ;
ScriptTokenType_AmpAmp, // &&
ScriptTokenType_PipePipe, // ||
ScriptTokenType_QMark, // ?
ScriptTokenType_QMarkQMark, // ??
ScriptTokenType_QMarkQMarkEq, // ??=
ScriptTokenType_Number, // 42.1337
ScriptTokenType_Identifier, // foo
ScriptTokenType_Key, // $bar
ScriptTokenType_Error, //
ScriptTokenType_End, // \0
} ScriptTokenType;

typedef struct {
Expand Down
1 change: 1 addition & 0 deletions libs/script/include/script_operation.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ typedef enum {
ScriptOpBinary_Sub,
ScriptOpBinary_Mul,
ScriptOpBinary_Div,
ScriptOpBinary_Mod,
ScriptOpBinary_Distance,
ScriptOpBinary_Angle,
ScriptOpBinary_RetRight,
Expand Down
1 change: 1 addition & 0 deletions libs/script/include/script_val.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ ScriptVal script_val_add(ScriptVal, ScriptVal);
ScriptVal script_val_sub(ScriptVal, ScriptVal);
ScriptVal script_val_mul(ScriptVal, ScriptVal);
ScriptVal script_val_div(ScriptVal, ScriptVal);
ScriptVal script_val_mod(ScriptVal, ScriptVal);
ScriptVal script_val_dist(ScriptVal, ScriptVal);
ScriptVal script_val_norm(ScriptVal);
ScriptVal script_val_mag(ScriptVal);
Expand Down
32 changes: 16 additions & 16 deletions libs/script/src/doc.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,23 +82,23 @@ ScriptExpr script_add_value(ScriptDoc* doc, const ScriptVal val) {
});
}

ScriptExpr script_add_load(ScriptDoc* doc, const StringHash key) {
ScriptExpr script_add_mem_load(ScriptDoc* doc, const StringHash key) {
diag_assert_msg(key, "Empty key is not valid");
return script_doc_expr_add(
doc,
(ScriptExprData){
.type = ScriptExprType_Load,
.data_load = {.key = key},
.type = ScriptExprType_MemLoad,
.data_mem_load = {.key = key},
});
}

ScriptExpr script_add_store(ScriptDoc* doc, const StringHash key, const ScriptExpr val) {
ScriptExpr script_add_mem_store(ScriptDoc* doc, const StringHash key, const ScriptExpr val) {
diag_assert_msg(key, "Empty key is not valid");
return script_doc_expr_add(
doc,
(ScriptExprData){
.type = ScriptExprType_Store,
.data_store = {.key = key, .val = val},
.type = ScriptExprType_MemStore,
.data_mem_store = {.key = key, .val = val},
});
}

Expand Down Expand Up @@ -151,11 +151,11 @@ ScriptExprType script_expr_type(const ScriptDoc* doc, const ScriptExpr expr) {
static void script_visitor_readonly(void* ctx, const ScriptDoc* doc, const ScriptExpr expr) {
bool* isReadonly = ctx;
switch (script_doc_expr_data(doc, expr)->type) {
case ScriptExprType_Store:
case ScriptExprType_MemStore:
*isReadonly = false;
return;
case ScriptExprType_Value:
case ScriptExprType_Load:
case ScriptExprType_MemLoad:
case ScriptExprType_OpNullary:
case ScriptExprType_OpUnary:
case ScriptExprType_OpBinary:
Expand Down Expand Up @@ -187,11 +187,11 @@ void script_expr_visit(
const ScriptExprData* data = script_doc_expr_data(doc, expr);
switch (data->type) {
case ScriptExprType_Value:
case ScriptExprType_Load:
case ScriptExprType_MemLoad:
case ScriptExprType_OpNullary:
return; // No children.
case ScriptExprType_Store:
script_expr_visit(doc, data->data_store.val, ctx, visitor);
case ScriptExprType_MemStore:
script_expr_visit(doc, data->data_mem_store.val, ctx, visitor);
return;
case ScriptExprType_OpUnary:
script_expr_visit(doc, data->data_op_unary.arg1, ctx, visitor);
Expand Down Expand Up @@ -232,12 +232,12 @@ void script_expr_str_write(
script_val_str_write(script_doc_val_data(doc, data->data_value.valId), str);
fmt_write(str, "]");
return;
case ScriptExprType_Load:
fmt_write(str, "[load: ${}]", fmt_int(data->data_load.key));
case ScriptExprType_MemLoad:
fmt_write(str, "[mem-load: ${}]", fmt_int(data->data_mem_load.key));
return;
case ScriptExprType_Store:
fmt_write(str, "[store: ${}]", fmt_int(data->data_store.key));
script_expr_str_write_child(doc, data->data_store.val, indent + 1, str);
case ScriptExprType_MemStore:
fmt_write(str, "[mem-store: ${}]", fmt_int(data->data_mem_store.key));
script_expr_str_write_child(doc, data->data_mem_store.val, indent + 1, str);
return;
case ScriptExprType_OpNullary:
fmt_write(str, "[op-nullary: {}]", script_op_nullary_fmt(data->data_op_nullary.op));
Expand Down
8 changes: 4 additions & 4 deletions libs/script/src/doc_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ typedef struct {

typedef struct {
StringHash key;
} ScriptExprLoad;
} ScriptExprMemLoad;

typedef struct {
StringHash key;
ScriptExpr val;
} ScriptExprStore;
} ScriptExprMemStore;

typedef struct {
ScriptOpNullary op;
Expand Down Expand Up @@ -44,8 +44,8 @@ typedef struct {
ScriptExprType type;
union {
ScriptExprValue data_value;
ScriptExprLoad data_load;
ScriptExprStore data_store;
ScriptExprMemLoad data_mem_load;
ScriptExprMemStore data_mem_store;
ScriptExprOpNullary data_op_nullary;
ScriptExprOpUnary data_op_unary;
ScriptExprOpBinary data_op_binary;
Expand Down
Loading