diff --git a/test/json.nas b/test/json.nas index 39f5686..5d65e47 100644 --- a/test/json.nas +++ b/test/json.nas @@ -1,196 +1,324 @@ #lib json.nas import("lib.nas"); -var json={ - text:'', - line:1, - size:0, - ptr:0, - get:nil, - check:nil, - next:nil, - match:nil, - hash_gen:nil, - vec_gen:nil, - member:nil, - parse:nil, - token:{content:'',type:''}, - content:[], -}; -json.get=func(filename) -{ - me.line=1; - me.ptr=0; - me.content=[]; - me.token={content:'',type:''}; - me.text=io.fin(filename); - if(!size(me.text)) - die("cannot open "~filename); - me.text=split('',me.text); - me.size=size(me.text); - return; -} +var JSON=func(){ -json.check=func(ptr) -{ - var str=me.text[ptr]; - return (str=='{' or str=='}' or str=='[' or str==']' or str==',' or str==':' or str=='\"' or ('0'<=str and str<='9')); -} + var ( + j_eof, + j_lbrace, + j_rbrace, + j_lbracket, + j_rbracket, + j_comma, + j_colon, + j_str, + j_num, + j_id + )=( + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ); + var j_content=[ + "eof", + "`{`", + "`}`", + "`[`", + "`]`", + "`,`", + "`:`", + "string", + "number", + "identifier" + ]; -json.next=func() -{ - while(me.ptr=me.size) + + var isnum=func(c){ + return '0'<=c and c<='9'; + } + 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() { - me.token.content=""; - me.token.type="eof"; + var c=text[ptr]; + return ( + c=='{' or c=='}' or + c=='[' or c==']' or + c==',' or c==':' or + c=='\"' or c=='\'' or + isnum(c) or isid(c) + ); + } + + var get=func(str) + { + init(); + if(!size(str)) + die("empty string"); + text=split('',str); + text_size=size(text); return; } - - if(me.text[me.ptr]=='{') + var next=func() { - me.token.content='{'; - me.token.type="left brace"; - } - elsif(me.text[me.ptr]=='}') - { - me.token.content='}'; - me.token.type="right brace"; - } - elsif(me.text[me.ptr]=='[') - { - me.token.content='['; - me.token.type="left bracket"; - } - elsif(me.text[me.ptr]==']') - { - me.token.content=']'; - me.token.type="right bracket"; - } - elsif(me.text[me.ptr]==',') - { - me.token.content=','; - me.token.type="comma"; - } - elsif(me.text[me.ptr]==':') - { - me.token.content=':'; - me.token.type="colon"; - } - elsif(me.text[me.ptr]=='\"') - { - var s=""; - me.ptr+=1; - while(me.ptr=text_size) { - s~=me.text[me.ptr]; - me.ptr+=1; + token.content="eof"; + token.type=j_eof; + return; } - me.ptr-=1; - me.token.content=num(s); - me.token.type="number"; - } - me.ptr+=1; - return; -} - -json.match=func(type) -{ - if(me.token.type!=type) - print("line ",me.line,": expect ",type," but get ",me.token.content,"."); - me.next(); - return; -} - -json.hash_gen=func() -{ - var hash={}; - me.match("left brace"); - me.member(hash); - while(me.token.type=="comma") - { - me.match("comma"); - me.member(hash); - } - me.match("right brace"); - return hash; -} - -json.vec_gen=func() -{ - var vec=[]; - me.match("left bracket"); - if(me.token.type=="left brace") - append(vec,me.hash_gen()); - elsif(me.token.type=="left bracket") - append(vec,me.vec_gen()); - elsif(me.token.type=="string" or me.token.type=="number") - { - append(vec,me.token.content); - me.next(); - } - while(me.token.type=="comma") - { - me.match("comma"); - if(me.token.type=="left brace") - append(vec,me.hash_gen()); - elsif(me.token.type=="left bracket") - append(vec,me.vec_gen()); - elsif(me.token.type=="string" or me.token.type=="number") + + var c=text[ptr]; + if(c=='{') { - append(vec,me.token.content); - me.next(); + token.content='{'; + token.type=j_lbrace; + } + elsif(c=='}') + { + token.content='}'; + token.type=j_rbrace; + } + elsif(c=='[') + { + token.content='['; + token.type=j_lbracket; + } + elsif(c==']') + { + token.content=']'; + token.type=j_rbracket; + } + elsif(c==',') + { + token.content=','; + token.type=j_comma; + } + elsif(c==':') + { + token.content=':'; + token.type=j_colon; + } + elsif(c=='\"' or c=='\'') + { + var strbegin=c; + var s=""; + ptr+=1; + while(ptr