Almost working parser.
This commit is contained in:
parent
5ee30a70f9
commit
8b1db4bea7
|
|
@ -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();
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue