Almost working parser.

This commit is contained in:
Simon Forman 2023-03-04 11:59:19 -08:00
parent 5ee30a70f9
commit 8b1db4bea7
1 changed files with 123 additions and 15 deletions

View File

@ -195,29 +195,137 @@ tokenize(char *str)
} }
/*u32*/ u32
/*parse0(u32 tokens, u32 acc)*/ expect_right_bracket(u32 tokens, u32 acc)
/*{*/ {
/* if (!tokens)*/ if (!tokens) {
/* return acc;*/ print_str("ERROR: Missing closing bracket. B");
/* u32 tok = head(tokens);*/ print_endl();
/* return parse0(tokens, empty_list);*/ return acc;
/*}*/ }
u32 jv = head(tokens);
tokens = tail(tokens);
if (RIGHT_BRACKET == jv) {
print_str("found expected ]");print_endl();
return cons(acc, tokens);
}
if (LEFT_BRACKET == jv) {
print_str("found [ while expecting ]");
print_endl();
u32 results = expect_right_bracket(tokens, empty_list);
if (!results)
print_str("ERROR: Missing closing bracket. C");
print_endl();
return empty_list;
jv = head(results);
tokens = tail(results);
} else {
print_str("found >");
print_str(ht_lookup(VALUE_OF(jv)));
print_str("< while expecting ]");
print_endl();
}
u32 results = expect_right_bracket(tokens, acc);
if (!results)
print_str("ERROR: Missing closing bracket. C");
print_endl();
return empty_list;
return cons(cons(head(results), acc), tail(results));
}
/*u32*/ u32
/*parse(u32 tokens)*/ parse0(u32 tokens, u32 acc)
/*{*/ {
/* return parse0(tokens, empty_list);*/ if (!tokens)
/*}*/ return acc;
u32 jv = head(tokens);
tokens = tail(tokens);
if (RIGHT_BRACKET == jv) {
print_str("ERROR: Extra closing bracket.");print_endl();
return empty_list;
}
if (LEFT_BRACKET == jv) {
print_str("parsing [");print_endl();
//jv, tokens = expect_right_bracket(tokens, empty_list);
// We can't return two things from a C function, so...
// We could cons the sublist onto the rest of the
// tokens in expect_right_bracket() and then split them
// out again here? It wastes a cell?
u32 results = expect_right_bracket(tokens, empty_list);
if (!results)
print_str("ERROR: Missing closing bracket. A");
print_endl();
return empty_list;
jv = JOY_VALUE(joyList, head(results));
tokens = tail(results);
} else {
print_str("parsing >");
print_str(ht_lookup(VALUE_OF(jv)));
print_str("<");
print_endl();
}
return cons(jv, parse0(tokens, acc));
}
u32
parse(u32 tokens)
{
return parse0(tokens, empty_list);
}
void
print_joy_value(u32 jv)
{
u8 type = TYPE_OF(jv);
if (type == joyInt) {
print_i64(VALUE_OF(jv));
} else if (type == joyBool) {
print_str(VALUE_OF(jv) ? "true" : "false");
} else if (type == joyList) {
print_str("[");
print_joy_list(jv);
print_str("]");
} else if (type == joySymbol) {
char *str = ht_lookup(VALUE_OF(jv));
/*if (error != NO_ERROR)*/
/* return;*/
print_str(str);
}
}
void
print_joy_list(u32 list)
{
while (list) {
print_joy_value(head(list));
/*if (error != NO_ERROR)*/
/* return;*/
list = tail(list);
if (list) {
print_str(" ");
}
}
}
void void
main() main()
{ {
memset(string_heap, 0, sizeof(string_heap)); memset(string_heap, 0, sizeof(string_heap));
char *buffer = " 1[2[ 3 cats ]4] cats dogs bunnies"; //char *buffer = " 1[2[ 3 cats ]4] cats dogs bunnies";
char *buffer = " 1[2]3 bunnies";
/*print_str(allocate_string(buffer, 4, 4)); print_endl();*/ /*print_str(allocate_string(buffer, 4, 4)); print_endl();*/
/*print_str(allocate_string(buffer, 2, 4)); print_endl();*/ /*print_str(allocate_string(buffer, 2, 4)); print_endl();*/
/*print_str(allocate_string(buffer, 7, 5)); print_endl();*/ /*print_str(allocate_string(buffer, 7, 5)); print_endl();*/
tokenize(buffer); u32 jv = parse(tokenize(buffer));
jv = JOY_VALUE(joyList, jv);
print_joy_list(jv);
print_endl();
} }