From acb2e3664c6ff33fb378d6e5ea0accc798de8b09 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Tue, 31 Jan 2023 19:39:22 +0800 Subject: [PATCH] :bug: fix bugs in stl/json, now it runs correctly --- stl/json.nas | 262 +++++++++++++++++++++++++++----------------------- test/json.nas | 51 +++++++++- 2 files changed, 188 insertions(+), 125 deletions(-) diff --git a/stl/json.nas b/stl/json.nas index e490022..2e2ab58 100644 --- a/stl/json.nas +++ b/stl/json.nas @@ -1,13 +1,13 @@ # lib json.nas # 2021 ValKmjolnir -var JSON=func(){ +var JSON=func() { var ( j_eof, j_lbrace, j_rbrace, - j_lbracket, - j_rbracket, + j_lbrkt, + j_rbrkt, j_comma, j_colon, j_str, @@ -32,27 +32,28 @@ var JSON=func(){ var text_size=0; var ptr=0; var token={content:'',type:''}; - var content={}; - var init=func(){ + + var init=func() { text=''; line=1; text_size=0; ptr=0; - content={}; token={content:'',type:''}; } - var isnum=func(c){ + var isnum=func(c) { return '0'<=c and c<='9'; } - var isid=func(c){ + + var isid=func(c) { var tmp=c[0]; return ('a'[0]<=tmp and tmp<='z'[0]) or ('A'[0]<=tmp and tmp<='Z'[0]) or c=='_'; } - var check=func(){ - var c=text[ptr]; + + var check=func() { + var c=char(text[ptr]); return ( c=='{' or c=='}' or c=='[' or c==']' or @@ -62,70 +63,76 @@ var JSON=func(){ ); } - var get=func(str){ + var get=func(str) { init(); - if(!size(str)) + if(!size(str)) { die("empty string"); - text=split('',str); + } + text=str; text_size=size(text); return; } - var next=func(){ - while(ptr=text_size){ + if(ptr>=text_size) { token.content="eof"; token.type=j_eof; return; } - var c=text[ptr]; - if(c=='{'){ + var c=char(text[ptr]); + if(c=='{') { token.content='{'; token.type=j_lbrace; - }elsif(c=='}'){ + } elsif(c=='}') { token.content='}'; token.type=j_rbrace; - }elsif(c=='['){ + } elsif(c=='[') { token.content='['; - token.type=j_lbracket; - }elsif(c==']'){ + token.type=j_lbrkt; + } elsif(c==']') { token.content=']'; - token.type=j_rbracket; - }elsif(c==','){ + token.type=j_rbrkt; + } elsif(c==',') { token.content=','; token.type=j_comma; - }elsif(c==':'){ + } elsif(c==':') { token.content=':'; token.type=j_colon; - }elsif(c=='\"' or c=='\''){ + } elsif(c=='\"' or c=='\'') { var strbegin=c; var s=""; ptr+=1; - while(ptr