mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Remove faulty quoting logic in parser.
This commit is contained in:
		| @@ -126,6 +126,7 @@ int debug_repl(Gst *vm) { | ||||
|         /* Check if file read in correctly */ | ||||
|         if (p.error) { | ||||
|             printf("Parse error: %s\n", p.error); | ||||
|             buffer = reader = NULL; | ||||
|             continue; | ||||
|         } | ||||
|         /* Check that parser is complete */ | ||||
|   | ||||
| @@ -73,6 +73,13 @@ void gst_buffer_append(Gst *vm, GstBuffer *buffer, const uint8_t *string, uint32 | ||||
|     buffer->count = newSize; | ||||
| } | ||||
|  | ||||
| /* Push a cstring to buffer */ | ||||
| void gst_buffer_append_cstring(Gst *vm, GstBuffer *buffer, const char *cstring) { | ||||
|     uint32_t len = 0; | ||||
|     while (cstring[len]) ++len; | ||||
|     gst_buffer_append(vm, buffer, (const uint8_t *) cstring, len); | ||||
| } | ||||
|  | ||||
| /* Convert the buffer to a string */ | ||||
| const uint8_t *gst_buffer_to_string(Gst *vm, GstBuffer *buffer) { | ||||
|     return gst_string_b(vm, buffer->data, buffer->count); | ||||
|   | ||||
							
								
								
									
										35
									
								
								core/parse.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								core/parse.c
									
									
									
									
									
								
							| @@ -27,7 +27,6 @@ static const char UNEXPECTED_CLOSING_DELIM[] = "Unexpected closing delimiter"; | ||||
|  | ||||
| /* The type of a ParseState */ | ||||
| typedef enum ParseType { | ||||
|     PTYPE_ROOT, | ||||
|     PTYPE_FORM, | ||||
|     PTYPE_STRING, | ||||
|     PTYPE_TOKEN | ||||
| @@ -36,7 +35,6 @@ typedef enum ParseType { | ||||
| /* Contain a parse state that goes on the parse stack */ | ||||
| struct GstParseState { | ||||
|     ParseType type; | ||||
|     uint32_t quoteCount; | ||||
|     union { | ||||
|         struct { | ||||
|             uint8_t endDelimiter; | ||||
| @@ -62,7 +60,6 @@ struct GstParseState { | ||||
| /* Get the top ParseState in the parse stack */ | ||||
| static GstParseState *parser_peek(GstParser *p) { | ||||
|     if (!p->count) { | ||||
|         p_error(p, "parser stack underflow"); | ||||
|         return NULL; | ||||
|     } | ||||
|     return p->data + p->count - 1; | ||||
| @@ -96,18 +93,11 @@ static void parser_push(GstParser *p, ParseType type, uint8_t character) { | ||||
|         p->data = data; | ||||
|         p->cap = newCap; | ||||
|     } | ||||
|     if (p->count) { | ||||
|         top = parser_peek(p); | ||||
|         top->quoteCount = p->quoteCount; | ||||
|         p->quoteCount = 0; | ||||
|     } | ||||
|     ++p->count; | ||||
|     top = parser_peek(p); | ||||
|     if (!top) return; | ||||
|     top->type = type; | ||||
|     switch (type) { | ||||
|         case PTYPE_ROOT: | ||||
|             break; | ||||
|         case PTYPE_STRING: | ||||
|             top->buf.string.state = STRING_STATE_BASE; | ||||
|         case PTYPE_TOKEN: | ||||
| @@ -118,20 +108,19 @@ static void parser_push(GstParser *p, ParseType type, uint8_t character) { | ||||
|             if (character == '(') top->buf.form.endDelimiter = ')'; | ||||
|             if (character == '[') top->buf.form.endDelimiter = ']'; | ||||
|             if (character == '{') top->buf.form.endDelimiter = '}'; | ||||
|             break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Append a value to the top-most state in the Parser's stack. */ | ||||
| static void parser_append(GstParser *p, GstValue x) { | ||||
|     GstParseState *top = parser_peek(p); | ||||
|     if (!top) return; | ||||
|     while (top->quoteCount--) | ||||
|         x = quote(p, x);  | ||||
|     switch (top->type) { | ||||
|         case PTYPE_ROOT: | ||||
|     if (!top) { | ||||
|         p->value = x; | ||||
|         p->status = GST_PARSER_FULL; | ||||
|             break; | ||||
|         return; | ||||
|     } | ||||
|     switch (top->type) { | ||||
|         case PTYPE_FORM: | ||||
|             gst_array_push(p->vm, top->buf.form.array, x); | ||||
|             break; | ||||
| @@ -394,10 +383,6 @@ static int root_state(GstParser *p, uint8_t c) { | ||||
|         parser_push(p, PTYPE_STRING, c); | ||||
|         return 1; | ||||
|     } | ||||
|     if (c == '\'') { | ||||
|         p->quoteCount++; | ||||
|         return 1; | ||||
|     } | ||||
|     if (is_symbol_char(c)) { | ||||
|         parser_push(p, PTYPE_TOKEN, c); | ||||
|         return 0; | ||||
| @@ -447,10 +432,10 @@ static void dispatch_char(GstParser *p, uint8_t c) { | ||||
|     /* Dispatch character to state */ | ||||
|     while (!done) { | ||||
|         GstParseState *top = parser_peek(p); | ||||
|         switch (top->type) { | ||||
|             case PTYPE_ROOT: | ||||
|         if (!top) { | ||||
|             done = root_state(p, c); | ||||
|                 break; | ||||
|         } else { | ||||
|             switch (top->type) { | ||||
|                 case PTYPE_TOKEN: | ||||
|                     done = token_state(p, c); | ||||
|                     break; | ||||
| @@ -463,6 +448,7 @@ static void dispatch_char(GstParser *p, uint8_t c) { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Parse a C style string. The first value encountered when parsed is put | ||||
|  * in p->value. The string variable is then updated to the next char that | ||||
| @@ -518,7 +504,6 @@ void gst_parser(GstParser *p, Gst *vm) { | ||||
|     p->error = NULL; | ||||
|     p->status = GST_PARSER_ROOT; | ||||
|     p->value.type = GST_NIL; | ||||
|     parser_push(p, PTYPE_ROOT, ' '); | ||||
| } | ||||
|  | ||||
| /* GC mark a parser */ | ||||
| @@ -532,8 +517,6 @@ static void gst_stl_parser_mark(Gst *vm, void *data, uint32_t len) { | ||||
|     for (i = 0; i < p->count; ++i) { | ||||
| 		GstParseState *ps = p->data + i; | ||||
| 		switch (ps->type) { | ||||
|     		case PTYPE_ROOT: | ||||
|     			break; | ||||
| 			case PTYPE_FORM: | ||||
|     			gst_mark_value(vm, gst_wrap_array(ps->buf.form.array)); | ||||
|     			break; | ||||
|   | ||||
							
								
								
									
										69
									
								
								core/stl.c
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								core/stl.c
									
									
									
									
									
								
							| @@ -525,7 +525,7 @@ int gst_stl_serialize(Gst *vm) { | ||||
|  * def */ | ||||
| int gst_stl_export(Gst *vm) { | ||||
|     gst_table_put(vm, vm->registry, gst_arg(vm, 0), gst_arg(vm, 1)); | ||||
|     gst_c_return(vm, gst_wrap_nil()); | ||||
|     gst_c_return(vm, gst_arg(vm, 1)); | ||||
| } | ||||
|  | ||||
| /* Get everything in the current namespace */ | ||||
| @@ -700,6 +700,72 @@ int gst_stl_gcollect(Gst *vm) { | ||||
| 	return GST_RETURN_OK; | ||||
| } | ||||
|  | ||||
| /* Static debug print helper */ | ||||
| static GstInteger gst_stl_debugp_helper(Gst *vm, GstBuffer *b, GstTable *seen, GstValue x, GstInteger next) { | ||||
|     GstValue check = gst_table_get(seen, x); | ||||
|     const uint8_t *str; | ||||
|     if (check.type == GST_INTEGER) { | ||||
|         str = gst_to_string(vm, check); | ||||
|         gst_buffer_append_cstring(vm, b, "<visited "); | ||||
|         gst_buffer_append(vm, b, str, gst_string_length(str)); | ||||
|         gst_buffer_append_cstring(vm, b, " >"); | ||||
|     } else { | ||||
|         uint8_t open, close; | ||||
|         uint32_t len, i; | ||||
|         const GstValue *data; | ||||
|         switch (x.type) { | ||||
|             default: | ||||
|                 str = gst_to_string(vm, x); | ||||
|                 gst_buffer_append(vm, b, str, gst_string_length(str)); | ||||
|                 return next; | ||||
|             case GST_STRUCT: | ||||
|                 open = '<'; close = '>'; | ||||
|                 break; | ||||
|             case GST_TABLE: | ||||
|                 open = '{'; close = '}'; | ||||
|                 break; | ||||
|             case GST_TUPLE: | ||||
|                 open = '('; close = ')'; | ||||
|                 break; | ||||
|             case GST_ARRAY: | ||||
|                 open = '['; close = ']'; | ||||
|                 break; | ||||
|         } | ||||
|         gst_table_put(vm, seen, x, gst_wrap_integer(next++)); | ||||
|         gst_buffer_push(vm, b, open); | ||||
|         if (gst_hashtable_view(x, &data, &len)) { | ||||
|             int isfirst = 1; | ||||
|             for (i = 0; i < len; i += 2) { | ||||
|                 if (data[i].type != GST_NIL) { | ||||
|                     if (isfirst) | ||||
|                         isfirst = 0; | ||||
|                     else | ||||
|                         gst_buffer_push(vm, b, ' '); | ||||
|                     next = gst_stl_debugp_helper(vm, b, seen, data[i], next); | ||||
|                     gst_buffer_push(vm, b, ' '); | ||||
|                     next = gst_stl_debugp_helper(vm, b, seen, data[i + 1], next); | ||||
|                 } | ||||
|             }  | ||||
|         } else if (gst_seq_view(x, &data, &len)) { | ||||
|             for (i = 0; i < len; ++i) { | ||||
|                 next = gst_stl_debugp_helper(vm, b, seen, data[i], next); | ||||
|                 if (i != len - 1) | ||||
|                     gst_buffer_push(vm, b, ' '); | ||||
|             }  | ||||
|         } | ||||
|         gst_buffer_push(vm, b, close); | ||||
|     } | ||||
|     return next; | ||||
| } | ||||
|  | ||||
| /* Debug print */ | ||||
| int gst_stl_debugp(Gst *vm) { | ||||
|     GstValue x = gst_arg(vm, 0); | ||||
|     GstBuffer *buf = gst_buffer(vm, 10); | ||||
|     gst_stl_debugp_helper(vm, buf, gst_table(vm, 10), x, 0); | ||||
|     gst_c_return(vm, gst_wrap_string(gst_buffer_to_string(vm, buf))); | ||||
| } | ||||
|  | ||||
| /****/ | ||||
| /* Bootstraping */ | ||||
| /****/ | ||||
| @@ -750,6 +816,7 @@ static const GstModuleItem const std_module[] = { | ||||
|     {"close", gst_stl_close}, | ||||
|     {"dasm", gst_stl_dasm}, | ||||
|     {"gcollect", gst_stl_gcollect}, | ||||
|     {"debugp", gst_stl_debugp}, | ||||
|     {NULL, NULL} | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -344,6 +344,7 @@ void gst_buffer_ensure(Gst *vm, GstBuffer *buffer, uint32_t capacity); | ||||
| int gst_buffer_get(GstBuffer *buffer, uint32_t index); | ||||
| void gst_buffer_push(Gst *vm, GstBuffer *buffer, uint8_t c); | ||||
| void gst_buffer_append(Gst *vm, GstBuffer *buffer, const uint8_t *string, uint32_t length); | ||||
| void gst_buffer_append_cstring(Gst *vm, GstBuffer *buffer, const char *cstring); | ||||
| const uint8_t *gst_buffer_to_string(Gst *vm, GstBuffer *buffer); | ||||
|  | ||||
| /* Define a push function for pushing a certain type to the buffer */ | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|     (: seen (if seen seen {})) | ||||
|     (if (get seen a) (get seen a) | ||||
|         (do | ||||
|             (set! seen a "<cycle>") | ||||
|             (: parts []) | ||||
|             (: len (length a)) | ||||
|             (: i 0) | ||||
| @@ -25,6 +26,7 @@ | ||||
|     (: seen (if seen seen {})) | ||||
|     (if (get seen s) (get seen s) | ||||
|         (do | ||||
|             (set! seen s "<cycle>") | ||||
|             (: parts []) | ||||
|             (: key (next s)) | ||||
|             (while (not (= key nil)) | ||||
| @@ -54,6 +56,10 @@ | ||||
|     (handler x seen))) | ||||
|  | ||||
| "Export pretty print" | ||||
| (export! 'pp pp) | ||||
| (export! "pp" pp) | ||||
|  | ||||
| (: arr [1 2 3 4]) | ||||
| (push! arr arr) | ||||
| (print (pp arr)) | ||||
|  | ||||
| ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose