json-tutorial
json-tutorial copied to clipboard
遇到不合法的转义字符 c->top = head; return ERROR 的同时是否需要弹栈
#define STRING_ERROR(ret) \
do { \
c->top = head; \
return ret; \
} while(0)
case '\0':
STRING_ERROR(LEPT_PARSE_MISS_QUOTATION_MARK);
default:
if ((unsigned char)ch < 0x20)
STRING_ERROR(LEPT_PARSE_INVALID_STRING_CHAR);
这里用 STRING_ERROR
的宏在错误时还原 c->top
的数值并 return
错误信息,需不需要同时使用 c->stack = (char*)lept_context_pop(c, len);
对 c->stack
进行弹栈。
即
#define STRING_ERROR(ret, c, len) \
do { \
c->stack = (char*)lept_context_pop(c, len); \
c->top = head; \
return ret; \
} while(0)
c->top=head; 这就是pop啊
惰性删除
c->stack = (char*)lept_context_pop(c, len);
你居然写出这样的,看来你没有理解。
首先,c->stack
整个过程就没有变过,要变的话,也是在realloc()变化。
为什么不变c->stack
? 因为lept_parse()
需要你realloc出来的地址指针也就是c->stack
你要明白你这里的删除是什么意思。
这里不是释放空间
c->top=head; 已经能够完成删除的功能