Skip to content

Commit d9bb945

Browse files
committed
Built analyzer
1 parent cfae262 commit d9bb945

3 files changed

Lines changed: 254 additions & 3 deletions

File tree

Source/Decode.js

Lines changed: 233 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,240 @@ const { log } = console;
88

99
export default function decode(string){
1010

11+
log([ ... normalize(new Tokenizer(string).iterator()) ]);
12+
1113
const tokens = normalize(new Tokenizer(string).iterator());
1214

13-
log([ ... tokens ]);
15+
// log([ ... tokens ]);
16+
17+
const state = {
18+
tokens : tokens ,
19+
object : {}
20+
}
21+
22+
object(state);
23+
24+
return state.object;
25+
}
26+
27+
28+
function object(state){
29+
30+
log('\nObject\n')
31+
32+
const { object , tokens } = state;
33+
34+
35+
while(true){
36+
37+
const token = tokens.next();
38+
39+
if(token.done)
40+
return;
41+
42+
switch(token.value.type){
43+
case 'ObjectEnd' :
44+
return;
45+
case 'Word' :
46+
member({
47+
parent : object ,
48+
tokens : tokens ,
49+
key : token.value.value
50+
});
51+
break;
52+
default:
53+
throw `Invalid Object Token ${ token.value.type }`;
54+
}
55+
}
56+
}
57+
58+
function member(state){
59+
60+
log('\nMember\n')
61+
62+
const { tokens , parent , key } = state;
63+
64+
while(true){
65+
66+
const token = tokens.next();
67+
68+
if(token.done)
69+
throw 'Missing Member Colon';
70+
71+
const { type } = token.value;
72+
73+
if(type === 'Colon')
74+
break;
75+
76+
switch(type){
77+
default:
78+
throw `Invalid Member Seperator Token ${ token.value.type }`;
79+
}
80+
}
81+
82+
while(true){
83+
84+
const token = tokens.next();
85+
86+
if(token.done)
87+
throw 'Missing Member Value';
88+
89+
const { type } = token.value;
90+
91+
if([ 'Multiline' , 'Word' ].includes(type)){
92+
93+
const { value } = token.value;
94+
95+
parent[key] = value;
96+
97+
break;
98+
}
99+
100+
if(type === 'ObjectStart'){
101+
102+
const s = {
103+
tokens : tokens ,
104+
object : {}
105+
}
106+
107+
object(s);
108+
109+
const { value } = token.value;
110+
111+
parent[key] = s.object;
112+
113+
break;
114+
}
115+
116+
if(type === 'ArrayStart'){
117+
118+
const s = {
119+
tokens : tokens ,
120+
array : []
121+
}
122+
123+
array(s);
124+
125+
const { value } = token.value;
126+
127+
parent[key] = s.array;
128+
129+
break;
130+
}
131+
132+
switch(type){
133+
default:
134+
throw `Invalid Member Value Token ${ token.value.type }`;
135+
}
136+
}
137+
138+
while(true){
139+
140+
const token = tokens.next();
141+
142+
if(token.done)
143+
throw 'Missing Member End';
144+
145+
const { type } = token.value;
146+
147+
switch(type){
148+
case 'Comma' :
149+
case 'Newline' :
150+
return;
151+
default:
152+
throw `Invalid Member End Token ${ token.value.type }`;
153+
}
154+
}
155+
}
156+
157+
158+
function array(state){
14159

15-
return {};
160+
log('\nArray\n')
161+
162+
const { array , tokens } = state;
163+
164+
165+
let was
166+
167+
while(true){
168+
169+
while(true){
170+
171+
const token = tokens.next();
172+
173+
if(token.done)
174+
return;
175+
176+
const { type } = token.value;
177+
178+
if(type === 'Word'){
179+
array.push(token.value.value);
180+
break;
181+
}
182+
183+
if(type === 'ObjectStart'){
184+
185+
const s = {
186+
tokens : tokens ,
187+
object : {}
188+
}
189+
190+
object(s);
191+
192+
const { value } = token.value;
193+
194+
array.push(s.object);
195+
196+
break;
197+
}
198+
199+
if(type === 'ArrayStart'){
200+
201+
const s = {
202+
tokens : tokens ,
203+
array : []
204+
}
205+
206+
array(s);
207+
208+
const { value } = token.value;
209+
210+
array.push(s.array);
211+
212+
break;
213+
}
214+
215+
switch(type){
216+
case 'ArrayEnd' :
217+
return;
218+
case 'Newline' :
219+
break;
220+
default:
221+
throw `Invalid Array Value Token ${ token.value.type }`;
222+
}
223+
}
224+
225+
while(true){
226+
227+
const token = tokens.next();
228+
229+
if(token.done)
230+
return;
231+
232+
const { type } = token.value;
233+
234+
if(type === 'Comma')
235+
break;
236+
237+
switch(type){
238+
case 'ArrayEnd' :
239+
return;
240+
case 'Newline' :
241+
break;
242+
default:
243+
throw `Invalid Array Seperator Token ${ token.value.type }`;
244+
}
245+
}
246+
}
16247
}

Source/Normalize.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,32 @@ function * forwardCombine(tokens){
151151
) continue;
152152

153153
break;
154+
case 'Comma' :
155+
156+
if(
157+
nowType === 'Newline' ||
158+
nowType === 'Space'
159+
) continue;
160+
161+
break;
162+
154163
case 'Newline' :
155164

156165
if(
157166
nowType === 'Newline' ||
158-
nowType === 'Space'
167+
nowType === 'Space' ||
168+
nowType === 'Comma'
159169
) continue;
160170

161171
break;
172+
case 'Space' :
173+
174+
if(
175+
nowType === 'Comma'
176+
){
177+
before = { type : 'Comma' }
178+
continue;
179+
}
162180
}
163181

164182
yield before.value;

Tests/Basic.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const model = {
3737

3838
research : {
3939

40+
name : '\ntesting \'wow\'\n' ,
41+
4042
parent : 'nuclearFacility' ,
4143

4244
objectives: [{

0 commit comments

Comments
 (0)