aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorc+12023-11-21 16:12:58 -0500
committerc+12023-11-21 16:12:58 -0500
commit930ca8d3b760b33123ba877514a49eca5af35a6a (patch)
tree181b03509727a10ff0b41d76393ae0fa476c36fc /src/parser.c
parenta2a5e863dc9beb4bc7a73a7361d8e208599134c9 (diff)
It is possible to parse strings.
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/parser.c b/src/parser.c
index fb8a4aa..b086703 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -38,7 +38,7 @@ int parser_nxt_token_match(parser_t* parser, token_type_t type) {
return parser_match(parser, type);
}
-tree_t* parser_parse_lit(parser_t* parser) {
+tree_t* parser_parse_lint(parser_t* parser) {
tree_t* lint;
lint = tree_init(TREE_TYPE_LINT);
@@ -47,13 +47,35 @@ tree_t* parser_parse_lit(parser_t* parser) {
return lint;
}
+tree_t* parser_parse_lstr(parser_t* parser) {
+ tree_t* lstr;
+
+ lstr = tree_init(TREE_TYPE_LSTR);
+ lstr->data.lstr.len = strlen(parser->token->val);
+ lstr->data.lstr.val = ecalloc(lstr->data.lstr.len + 1, sizeof(char));
+ lstr->data.lstr.val[lstr->data.lstr.len] = '\0';
+ strcpy(lstr->data.lstr.val, parser->token->val);
+
+ return lstr;
+}
+
tree_t* parser_parse_expr(parser_t* parser) {
tree_t* expr;
expr = tree_init(TREE_TYPE_EXPR);
/* For now this is the only type of expression. */
- expr->data.expr.val = parser_parse_lit(parser);
+
+ switch (parser->token->type) {
+ case TOKEN_INT:
+ expr->data.expr.val = parser_parse_lint(parser);
+ break;
+ case TOKEN_STR:
+ expr->data.expr.val = parser_parse_lstr(parser);
+ break;
+ default:
+ return expr;
+ }
return expr;
}