From c904bc2b78045bd81cfc3603422c385cbf7adc75 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Thu, 2 Oct 2025 20:06:06 -0400 Subject: kern: np: Add support for return statements This commit introduces lexical, parsing and code generation support for the return statements. As of now, one is only able to return unsigned integers but this will be expanded upon in the future Signed-off-by: Ian Moffett --- src/sys/np/core/np_lex.c | 5 +++++ src/sys/np/core/np_parse.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) (limited to 'src/sys/np') diff --git a/src/sys/np/core/np_lex.c b/src/sys/np/core/np_lex.c index 389f1e2..222feba 100644 --- a/src/sys/np/core/np_lex.c +++ b/src/sys/np/core/np_lex.c @@ -144,6 +144,11 @@ static int lex_cmptok(char *tokstr, struct lex_token *res) { switch (*tokstr) { + case 'r': + if (strcmp(tokstr, TOKEN_RETURN) == 0) { + res->token = TT_RETURN; + } + return 0; case 'b': if (strcmp(tokstr, TOKEN_BEGIN) == 0) { res->token = TT_BEGIN; diff --git a/src/sys/np/core/np_parse.c b/src/sys/np/core/np_parse.c index 4119d8b..b7b854b 100644 --- a/src/sys/np/core/np_parse.c +++ b/src/sys/np/core/np_parse.c @@ -84,7 +84,8 @@ static const char *stoktab[] = { /* Keywords */ [TT_BEGIN] = "", [TT_PROC] = "", - [TT_END] = "" + [TT_END] = "", + [TT_RETURN] = "" }; /* @@ -172,6 +173,35 @@ parse_type(struct np_work *work, struct lex_token *tok) return NP_BAD_TYPE; } +/* + * Parse a return statement + * + * @work: Input work + * @tok: Current token + * + * Returns zero on success + */ +static int +parse_return(struct np_work *work, struct lex_token *tok) +{ + tt_t tt; + + /* + * For now we'll only accept numbers as return values + * so we must see one after the return statement + */ + tt = parse_expect(work, "return", TT_NUMBER, tok); + if (tt == TT_NONE) { + return -1; + } + +#define PIIR_PUSH(BYTE) piir_push(work->piir_stack, (BYTE)) + PIIR_PUSH(PIIR_RET_NUM); + PIIR_PUSH(tok->val); +#undef PIIR_PUSH + return 0; +} + /* * Parse a procedure / function * @@ -311,6 +341,11 @@ parse_token(struct np_work *work, struct lex_token *tok) /* XXX: NOP for testing */ PIIR_PUSH(PIIR_NOP); break; + case TT_RETURN: + if ((error = parse_return(work, tok)) != 0) { + return -1; + } + break; } #undef PIIR_PUSH return 0; -- cgit v1.2.3