-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTJSONParser.js
More file actions
113 lines (102 loc) · 3.19 KB
/
TJSONParser.js
File metadata and controls
113 lines (102 loc) · 3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const inp = require('fs').readFileSync('./example.json').toString()
const stringParser = input => {
input = input.trim() // change to regex later
if (input.startsWith('"') === false) return null
var end = input.slice(1).indexOf('"')
return [input.slice(1, end + 1), input.slice(end + 2)]
}
const intParser = (input, numPattern = /^[-+]?(\d+(\.\d*)?|\.\d+)([e][+-]?\d+)?/) => {
input = input.trim()
if (input.match(numPattern)) {
return [parseFloat(input.match(numPattern)[0]), input.slice(input.match(numPattern)[0].length)]
}
return null
}
const keyParser = input => {
const keyRegex = /^("([a-zA-Z]+[a-z\-A-Z]*))((.|\n)*)$/
if (keyRegex.exec(input) === null) return null
return [keyRegex.exec(input)[2], keyRegex.exec(input)[3]]
}
const tagParser = input => {
const tagRegex = /^:([a-zA-Z0-9<]+[>]*)((.|\n)*)$/
if (tagRegex.exec(input) === null) return null
return [tagRegex.exec(input)[1], tagRegex.exec(input)[2]]
}
const colonParser = input => {
input = input.trim()
if (input.startsWith(':') === false) return null
return [':', input.slice(1)]
}
const commaParser = (input) => {
input = input.trim() // use space parser
if (input.startsWith(',') === true) {
return [',', input.slice(1)]
}
return null
}
const parserFactory = (tag) => {
if (tag === 's') return stringParser
if (tag === 'i') return intParser
if (tag === 'O') return objectParser
if (tag.startsWith('A') === true) {
return (tag) => {
const insideTag = 's'
return arrayParserGenerator(insideTag)
}
}
return input => null
}
const arrayParserGenerator = (insideTag) => input => {
let tempArray = []
let requiredOut, comma
input = input.trim()
if (input.startsWith('[') === false) return null
input = input.slice(1)
input = input.trim()
if (insideTag === '' && input.startsWith(']')) return [[], input.slice(1)]
let requiredParser = parserFactory(insideTag)
while (input !== null) {
input = input.trim()
requiredOut = requiredParser(input)
tempArray.push(requiredOut[0])
input = requiredOut[1]
comma = commaParser(requiredOut[1])
if (comma === null) break
input = comma[1]
}
input = input.trim()
if (input.startsWith(']') === true) return [tempArray, input.slice(1)]
return null
}
const objectParser = input => {
if (input.startsWith('{') === false) return null
let obj = {}
let key, value, tag, comma
input = input.slice(1)
while (input !== null) {
key = keyParser(input)[0]
tag = tagParser(keyParser(input)[1])[0]
value = tagParser(keyParser(input)[1])[1]
value = value.trim()
if (value.startsWith('"') === false) return null
value = value.slice(1)
value = colonParser(value)
if (value === null) return null
value = value[1]
let reqParser = parserFactory(tag)
value = reqParser()(value)
if (value === null) return null
obj[key] = value[0]
input = value[1]
comma = commaParser(input)
if (comma === null) break
input = comma[1]
}
input = input.trim()
if (input.startsWith('}') === true) return [obj, input.slice(1)]
return null
}
const out = objectParser(inp)
if (out === null) {
console.log('INVALID TJSON')
} else console.log(JSON.stringify(out[0], null, 2))