bydgoszczscript

simple, fast and efficient programming language
git clone git://git.kocotian.pl/bydgoszczscript.git
Log | Files | Refs | README | LICENSE

commit 7d9a0d6b206b3ed5d9fb69c340eb0de2f65b8f49
parent 0774cab0194d13791a1524d6eec7a5323844f2ce
Author: kocotian <kocotian@kocotian.pl>
Date:   Wed, 26 May 2021 15:59:38 +0200

Simple function calling

Diffstat:
Mcompile.c | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Msamples/fibbonaci.bs | 8++++----
Msamples/witajswiat.bs | 2+-
3 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/compile.c b/compile.c @@ -34,6 +34,9 @@ static String defaultType(void); static Token *enextToken(File *f, TokenType type); static String g_type(File *f); +static void g_expression(File *f); +static void g_zadzwon(File *f); +static void g_obywatel(File *f); static void g_miasto(File *f); static String @@ -137,6 +140,50 @@ g_type(File *f) } static void +g_expression(File *f) +{ + Token *t; + t = &(f->curtok); + if (t->type == TokenString) { + dprintf(f->outfd, "%.*s", + Strevalf(t->c)); + } else { + errwarn(*f, 1, "expected expression"); + } +} + +static void +g_zadzwon(File *f) +{ + Token *t; + String name; + + t = enextToken(f, TokenIdentifier); + name = t->c; + dprintf(f->outfd, "%.*s(", + Strevalf(name)); + t = enextToken(f, TokenNULL); + if (t->type == TokenIdentifier) { + if (!Strccmp(t->c, "daj")) { + while ((t = enextToken(f, TokenNULL))) { + if (t->type == TokenSemicolon) + goto semicolon; + else + g_expression(f); + } + } else { + errwarn(*f, 1, "unexpected identifier (expected daj)"); + } + } else if (t->type == TokenSemicolon) { +semicolon: + dprintf(f->outfd, ");\n"); + return; + } else { + errwarn(*f, 1, "unexpected token (expected identifier or semicolon)"); + } +} + +static void g_obywatel(File *f) { String name; @@ -176,6 +223,8 @@ g_aglomeracja(File *f) return; } else if (!(Strccmp(t->c, "obywatel"))) { g_obywatel(f); + } else if (!(Strccmp(t->c, "zadzwon"))) { + g_zadzwon(f); } else { errwarn(*f, 1, "unexpected identifier (expected a keyword)"); } diff --git a/samples/fibbonaci.bs b/samples/fibbonaci.bs @@ -5,18 +5,18 @@ miasto bonifacy przyjmuje (n przechowuje cyferki) oddaje cyferki: oddaj n; inaczej oddaj ( - (zadzwon miasto bonifacy daj (n - 1)) + (zadzwon bonifacy daj (n - 1)) plus - (zadzwon miasto bonifacy daj (n - 2)) + (zadzwon bonifacy daj (n - 2)) ); koniec koniec miasto bydgoszcz przyjmuje (argc przechowuje cyferki, wskaznik argv przechowuje literki) oddaje cyferki: - zadzwon miasto puts daj ("ciag bonifacego :)"); + zadzwon puts daj ("ciag bonifacego :)"); obywatel i przechowuje cyferki; dla ustaw 0 dla i; i jest mniejsze niz 32; powieksz i: - zadzwon miasto bonifacy daj (i); + zadzwon bonifacy daj (i); koniec oddaj 0; koniec diff --git a/samples/witajswiat.bs b/samples/witajswiat.bs @@ -1,5 +1,5 @@ wykorzystaj "stdio" miasto bydgoszcz: - obywatel i przechowuje cyferki; + zadzwon puts daj "Hello, world!"; koniec