summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sys/include/np/lex.h2
-rw-r--r--src/sys/include/np/piir.h1
-rw-r--r--src/sys/np/core/np_lex.c5
-rw-r--r--src/sys/np/core/np_parse.c37
4 files changed, 44 insertions, 1 deletions
diff --git a/src/sys/include/np/lex.h b/src/sys/include/np/lex.h
index ebd6f32..ba581b7 100644
--- a/src/sys/include/np/lex.h
+++ b/src/sys/include/np/lex.h
@@ -41,6 +41,7 @@ struct np_work;
#define TOKEN_BEGIN "begin"
#define TOKEN_PROC "proc"
#define TOKEN_END "end"
+#define TOKEN_RETURN "return"
/* Types */
#define TOKEN_U8 "u8"
@@ -93,6 +94,7 @@ typedef enum {
TT_BEGIN, /* 'begin' */
TT_PROC, /* 'proc' */
TT_END, /* 'end' */
+ TT_RETURN, /* 'return' */
} tt_t;
typedef uint64_t tokval_t;
diff --git a/src/sys/include/np/piir.h b/src/sys/include/np/piir.h
index d108776..5625409 100644
--- a/src/sys/include/np/piir.h
+++ b/src/sys/include/np/piir.h
@@ -56,6 +56,7 @@ typedef int8_t md_byte_t;
#define PIIR_LOAD_R32 0x03 /* Load 32-bit register */
#define PIIR_LOAD_R64 0x04 /* Load 64-bit register */
#define PIIR_RET_NIL 0x05 /* Return nothing */
+#define PIIR_RET_NUM 0x06 /* Return a number */
/*
* Represents the PIIR virtual machine for storing
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_BEGIN>",
[TT_PROC] = "<TT_PROC>",
- [TT_END] = "<TT_END>"
+ [TT_END] = "<TT_END>",
+ [TT_RETURN] = "<TT_RETURN>"
};
/*
@@ -173,6 +174,35 @@ parse_type(struct np_work *work, struct lex_token *tok)
}
/*
+ * 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
*
* @work: Input work
@@ -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;