faster parsing

This commit is contained in:
2026-02-07 15:38:36 -06:00
parent 08d2bacb1f
commit 1a925371d3
2 changed files with 33 additions and 22 deletions

View File

@@ -402,8 +402,14 @@ int cell_init(int argc, char **argv)
char *json = JS_AST(script, strlen(script), filename);
if (json) {
int has_errors = print_json_errors(json);
printf("%s\n", json);
cJSON *root = cJSON_Parse(json);
free(json);
if (root) {
char *pretty = cJSON_Print(root);
cJSON_Delete(root);
printf("%s\n", pretty);
free(pretty);
}
free(allocated_script);
return has_errors ? 1 : 0;
} else {
@@ -445,8 +451,14 @@ int cell_init(int argc, char **argv)
char *json = JS_Tokenize(script, strlen(script), filename);
if (json) {
int has_errors = print_json_errors(json);
printf("%s\n", json);
cJSON *root = cJSON_Parse(json);
free(json);
if (root) {
char *pretty = cJSON_Print(root);
cJSON_Delete(root);
printf("%s\n", pretty);
free(pretty);
}
free(allocated_script);
return has_errors ? 1 : 0;
} else {
@@ -507,8 +519,14 @@ int cell_init(int argc, char **argv)
return 1;
}
printf("%s\n", mcode_json);
cJSON *root = cJSON_Parse(mcode_json);
free(mcode_json);
if (root) {
char *pretty = cJSON_Print(root);
cJSON_Delete(root);
printf("%s\n", pretty);
free(pretty);
}
free(allocated_script);
return 0;

View File

@@ -28342,11 +28342,12 @@ typedef struct ASTParseState {
/* Add a length-delimited string to a cJSON object (source pointers aren't null-terminated) */
static void cjson_add_strn (cJSON *obj, const char *key, const char *str, size_t len) {
char *tmp = sys_malloc (len + 1);
char buf[256];
char *tmp = (len < sizeof (buf)) ? buf : sys_malloc (len + 1);
memcpy (tmp, str, len);
tmp[len] = '\0';
cJSON_AddStringToObject (obj, key, tmp);
sys_free (tmp);
if (tmp != buf) sys_free (tmp);
}
/* Compare a length-delimited token string against a null-terminated literal */
@@ -29724,16 +29725,9 @@ static const ASTBinOp ast_binops[] = {
{ 0, NULL, 0 }
};
static int ast_get_binop_prec (int token) {
static const ASTBinOp *ast_get_binop (int token) {
for (int i = 0; ast_binops[i].kind; i++) {
if (ast_binops[i].token == token) return ast_binops[i].prec;
}
return 0;
}
static const char *ast_get_binop_kind (int token) {
for (int i = 0; ast_binops[i].kind; i++) {
if (ast_binops[i].token == token) return ast_binops[i].kind;
if (ast_binops[i].token == token) return &ast_binops[i];
}
return NULL;
}
@@ -29744,17 +29738,16 @@ static cJSON *ast_parse_binary (ASTParseState *s, int min_prec) {
for (;;) {
const uint8_t *start = s->token_ptr;
int prec = ast_get_binop_prec (s->token_val);
if (prec == 0 || prec < min_prec) break;
const ASTBinOp *op = ast_get_binop (s->token_val);
if (!op || op->prec < min_prec) break;
const char *kind = ast_get_binop_kind (s->token_val);
ast_next_token (s);
/* Right associativity for ** */
int next_prec = (prec == 14) ? prec : prec + 1;
int next_prec = (op->prec == 14) ? op->prec : op->prec + 1;
cJSON *right = ast_parse_binary (s, next_prec);
cJSON *node = ast_node (s, kind, start);
cJSON *node = ast_node (s, op->kind, start);
cJSON_AddItemToObject (node, "left", left);
cJSON_AddItemToObject (node, "right", right);
ast_node_end (s, node, s->buf_ptr);
@@ -31213,7 +31206,7 @@ char *JS_AST (const char *source, size_t len, const char *filename) {
}
/* Convert to JSON string */
char *json = cJSON_Print (ast);
char *json = cJSON_PrintUnformatted (ast);
cJSON_Delete (ast);
return json;
@@ -31316,7 +31309,7 @@ char *JS_Tokenize (const char *source, size_t len, const char *filename) {
cJSON_AddItemToObject (root, "errors", s.errors);
}
char *json = cJSON_Print (root);
char *json = cJSON_PrintUnformatted (root);
cJSON_Delete (root);
return json;
}
@@ -35643,7 +35636,7 @@ char *JS_Mcode (const char *ast_json) {
if (s.errors)
cJSON_AddItemToObject (mach, "errors", s.errors);
char *json = cJSON_Print (mach);
char *json = cJSON_PrintUnformatted (mach);
cJSON_Delete (mach);
return json;
}