diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-14 02:38:30 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-14 02:38:30 +0200 |
commit | 959b379b90ec95ea0813cc1228cd949872713ec2 (patch) | |
tree | 5bb04ed04831ce8b1788961c05ce237a2f30e5a0 | |
parent | cd20e8bb36f6ef65bea0e062c66867cb80568152 (diff) | |
download | golem-959b379b90ec95ea0813cc1228cd949872713ec2.tar.gz |
function piping
-rw-r--r-- | samples/move.golem | 7 | ||||
-rw-r--r-- | src/main.c | 52 | ||||
-rwxr-xr-x | testing.sh | 2 |
3 files changed, 40 insertions, 21 deletions
diff --git a/samples/move.golem b/samples/move.golem index 407b6e1..f29a899 100644 --- a/samples/move.golem +++ b/samples/move.golem @@ -6,16 +6,13 @@ define FALSE = 0; main() { loop { slp; - erase(); - update(); - draw(); + erase() |> update() |> draw(); } } update() { - input_update(); - player_update(); + input_update() |> player_update(); } @@ -92,6 +92,8 @@ is_punct(const char *p) return 2; if (strchr("-+", p[0]) != NULL && p[0] == p[1]) return 2; + if (p[0] == '|' && p[1] == '>') + return 2; return (strchr("+-/*()<>,;{}[]=&^|", p[0]) != NULL); } @@ -564,6 +566,29 @@ mul(Token **rest, Token *tok) } static Node * +fncall(Token **rest, Token *tok) +{ + Node *node = new_word(tok); + tok = tok->next; + node->type = NOD_FNCALL; + + /* args */ + Node head = {0}; + Node *cur = &head; + + tok = skip(tok, "("); + while (tok->type != TOK_EOF && !equal(tok, ")")) { + cur = cur->next = expr(&tok, tok); + if (equal(tok, ",")) + tok = tok->next; + } + *rest = skip(tok, ")"); + + node->rhs = head.next; + return node; +} + +static Node * primary(Token **rest, Token *tok) { if (equal(tok, "(")) { @@ -605,23 +630,13 @@ primary(Token **rest, Token *tok) if (tok->type == TOK_WORD && equal(tok->next, "(")) { /* function call */ - Node *node = new_word(tok); - tok = tok->next; - node->type = NOD_FNCALL; - - /* args */ - Node head = {0}; - Node *cur = &head; - - tok = skip(tok, "("); - while (tok->type != TOK_EOF && !equal(tok, ")")) { - cur = cur->next = expr(&tok, tok); - if (equal(tok, ",")) - tok = tok->next; + Node *node = fncall(&tok, tok); + Node *cur = node; + while (tok->type != TOK_EOF && equal(tok, "|>")) { + tok = tok->next; + cur = cur->lhs = fncall(&tok, tok); } - *rest = skip(tok, ")"); - - node->rhs = head.next; + *rest = tok; return node; } @@ -899,6 +914,11 @@ gen_fncall(Node *node) printf("\tJRT ,__fn_%.*s\n", node->len, node->loc); depth += 1; + + if (node->lhs != NULL) { + depth -= 1; + gen_fncall(node->lhs); + } } static void @@ -16,6 +16,7 @@ tup -q || ./build.sh || exit 1 test "$1" "main(){5 + 2; return 4;}" test "$1" "main(){6 + 3;}" test "$1" "main(){'a' - 'b';}" +test "$1" "main(){ buzz(); } buzz() { return 42; }" test "$1" "main(){ fizz(50 + buzz() - 3) * 4; } fizz() { return 3; } buzz() { return 42; }" test "$1" "global abc; main(){ return abc; }" test "$1" "global abc = 5; main(){ return abc; }" @@ -55,4 +56,5 @@ test "$1" "main() return;" test "$1" "main() { local a; a = 5; dbg a; a++; dbg a; }" test "$1" "main() { local a; a = 5; dbg a; a--; dbg a; }" test "$1" "main() { wrt [\"(\"]; wrt '\n'; }" +test "$1" "main() { wrt inc('0') |> dec() |> inc() |> inc(); wrt '\n'; } inc(a) return a + 1; dec(a) return a - 1;" rm -f build/tmp.* |