From 959b379b90ec95ea0813cc1228cd949872713ec2 Mon Sep 17 00:00:00 2001 From: kdx Date: Wed, 14 Jun 2023 02:38:30 +0200 Subject: function piping --- samples/move.golem | 7 ++----- src/main.c | 52 ++++++++++++++++++++++++++++++++++++---------------- 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(); } diff --git a/src/main.c b/src/main.c index 622ced0..8aa98ec 100644 --- a/src/main.c +++ b/src/main.c @@ -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); } @@ -563,6 +565,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) { @@ -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 diff --git a/testing.sh b/testing.sh index 7d35ec0..9781638 100755 --- a/testing.sh +++ b/testing.sh @@ -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.* -- cgit v1.2.3