Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#!/usr/bin/env node
const fs = require('fs')
const parser = require('./src/parser.js')
const fileName = process.argv[2]
Expand All @@ -13,7 +12,7 @@ if (jsonStr === null) {
} else if (jsonStr[1] !== '') {
jsonStr[1] = jsonStr[1].trim()
if (jsonStr[1] !== '') {
console.log(message[0], jsonStr[1])
console.log(message[0])
} else {
console.log(jsonStr[0])
}
Expand Down
233 changes: 67 additions & 166 deletions src/parser.js
Original file line number Diff line number Diff line change
@@ -1,168 +1,86 @@
#!/usr/bin/env node
const nullParser = (input) => {
let nullValue = input.slice(0, 4)
if (nullValue === 'null') {
input = input.slice(4, input.length)
return [null, input]
} else return null
}

const nullParser = (input) => {return input.startsWith('null') ? [null, input.slice(4, input.length)]: null}
const boolParser = (input) => {
if (input[0] === 't') {
let boolValue = input.slice(0, 4)
if (boolValue === 'true') {
input = input.slice(4, input.length)
return [true, input]
} else {
return null
}
} else if (input[0] === 'f') {
let boolValue = input.slice(0, 5)
if (boolValue === 'false') {
input = input.slice(5, input.length)
return [false, input]
} else {
return null
}
} else return null
return input.startsWith('true')?[true, input.slice(4, input.length)]:
(input.startsWith('false'))?[false, input.slice(5, input.length)]:null
}
const digitParser = (input) => {return (input >=0 && input <= 9) ? input:null}
const expParser = (input) => {return (input === 'E' || input === 'e') ? input:null}
const signParser = (input) => {return (input === '+' || input === '-') ? input:null}
const next = (arr, input) => {
arr[0] = input[arr[2]]
arr[1] += input[arr[2]]
arr[2]++
return arr
}

const numParser = (input) => {
let prev = ''
let outputNum = ''
if (prev === '') {
if (input[0] === '-' || (input[0] >= 0 && input[0] <= 9)) {
prev = input[0]
outputNum += prev
let i = 1
while ((input[i] >= 0 && input[i] <= 9 || input[i] === 'e' ||
input[i] === 'E' || input[i] === '.') && i < input.length) {
prev = input[i]
outputNum += input[i]
i++
let arr = ['', '', 0]
if (signParser(input[arr[2]]) === '-' || digitParser(input[arr[2]])) {
next(arr, input)
while ((digitParser(input[arr[2]]) || expParser(input[arr[2]]) || input[arr[2]] === '.')) {
next(arr,input)
if (expParser(input[arr[2]])) {
next(arr,input)
while ((digitParser(input[arr[2]]) || signParser(input[arr[2]]))) {
next(arr, input)}
if (input[arr[2]] === '.') return null
}
if (prev === 'e' || prev === 'E') {
while ((input[i] >= 0 && input[i] <= 9 || input[i] === '-' ||
input[i] === '+') && i < input.length) {
prev = input[i]
outputNum += input[i]
i++
}
}
if (outputNum[0] === '0') {
if (outputNum[1] >= '0' && outputNum[1] <= '9') {
return null
} else {
if (Number(outputNum) >= 0) {
return [Number(outputNum), input.slice(i)]
} else return null
}
}
return [Number(outputNum), input.slice(i)]
} else {
return null
}
}
}
}
return arr[1][0] === '0'? (arr[1].length === 1?[Number(arr[1]),input.slice(arr[2])]:
(arr[1][1] === '.' || expParser(arr[1][1])?[Number(arr[1]),input.slice(arr[2])]:null))
: (Number(arr[1])?[Number(arr[1]), input.slice(arr[2])]:null)
} else return null}

const strParser = (input) => {
let outputStr = ''
let inpLength = input.length
let prev = ''
if (input[0] === '"') {
input = input.slice(1)
let i = 1
while (input[0] !== '"' && i < inpLength) {
prev = input[0]
outputStr += prev
input = input.slice(1)
i++
if (prev === '\\') {
outputStr = outputStr.slice(0, -1)
prev = input[0]
i++
let nextChar = (input[0] === '"' || input[0] === '\\' || input[0] === '/' ||
input[0] === 'b' || input[0] === 'f' || input[0] === 'n' ||
input[0] === 'r' || input[0] === 't' || input[0] === 'u')
if (nextChar === false) {
return null
} else if (input[0] === 'u') {
prev = input[0]
let numHex = 1
let hexCode = '0x'
input = input.slice(1)
while (((input[0] >= 'A' && input[0] <= 'F') ||
(input[0] >= 'a' && input[0] <= 'f') || input[0] >= 0 ||
input[0] <= 9 && input[0] !== '"') && numHex <= 4) {
// console.log(' reading ' + i + ' th character after \\u ' + input[0])
prev = input[0]
input = input.slice(1)
numHex++
hexCode += prev
}
prev = input[0]
if (numHex === 5) {
outputStr += String.fromCharCode(hexCode)

continue
} else {
return null
}
} else {
prev = input[0]
outputStr += prev
input = input.slice(1)
}
} // end of control char check
} // end of while
prev = input[0]

if (prev === '"') {
return [outputStr, input.slice(1)]
} else return null
let arr = ['','',0]
if (input[arr[2]] === '"') {
next(arr, input)
while(input[arr[2]] !== '"' && arr[2] < inpLength){
if (input[arr[2]] === '\\') {
next(arr, input)
if (!specialChars(input[arr[2]])) {return null}
else if (input[arr[2]] === 'u') {
let numHex = 1, hexCode = '0x'
next(arr, input)
while (hexChars(input[arr[2]]) && numHex<=4) {
numHex++
hexCode += input[arr[2]]
next(arr, input)
}
if (numHex === 5) {
arr[1] = arr[1].slice(0,-6)
arr[1] += String.fromCharCode(hexCode)
} else return null
} else if(input[arr[2]] === '"' || input[arr[2]] === '\\'){
arr[1] = arr[1].slice(0,-1)
}
}
next(arr, input)
}
return (input[arr[2]] === '"') ?[arr[1].slice(1), input.slice(arr[2]+1)]:null
} else return null
}

const commaParser = (input) => {
if (input[0] === ',') {
return [input[0], input.slice(1)]
} else {
return null
}
}

const whiteSpaceParser = (input) => {
if (input[0] === ' ') {
return [input[0], input.slice(1)]
} else {
return null
}
}

const hexChars = (input) => {return ((input >= 'A' && input <= 'F') || (input >= 'a' && input <= 'f') || digitParser(input))? input : null}
const specialChars = (input) => {return (input === '"' || input === '\\' || input === '/' || input === 'b' || input === 'f' || input === 'n' ||input === 'r' || input === 't' || input === 'u') ? input : null}
const commaParser = (input) => {return (input[0] === ',') ?[input[0], input.slice(1)] :null}
const whiteSpaceParser = (input) => {return (input[0] === ' ') ? [input[0], input.slice(1)] : null}
const specialCharParser = (input) => {
if (input[0] === '\n' || input[0] === '\t' || input[0] === '\b' ||
input[0] === '\f' || input[0] === '\r') {
return [input[0], input.slice(1)]
} else {
return null
}
return (input[0] === '\n' || input[0] === '\t' || input[0] === '\b' ||
input[0] === '\f' || input[0] === '\r')?[input[0], input.slice(1)]:null
}

const arrParser = (input) => {
let inpLength = input.length
if (input[0] === '[' && inpLength > 1) {
let i = 1
let prev
let outputArr = []
let result
let i = 1, prev, outputArr = [],result
input = input.slice(1)
while (input[0] !== ']' && result !== null) {
while (whiteSpaceParser(input) !== null || specialCharParser(input) !== null) {
while (whiteSpaceParser(input)|| specialCharParser(input)) {
input = input.slice(1)
}
if (input[0] === ']') {
return [outputArr, input.slice(1)]
}
if (input[0] === ']') {return [outputArr, input.slice(1)]}
result = valueParser(input) || commaParser(input)
if (result === null) {
return null
Expand All @@ -172,43 +90,29 @@ const arrParser = (input) => {
} else {
if (prev !== ',') {
prev = ','
} else {
return null
}
} else return null
}
input = result[1]
inpLength = input.length
}
if (result === null) {
return null
} else if (input[0] === ']') {
if (prev === ',') {
return null
} else {
return [outputArr, input.slice(i)]
}
return (prev === ',') ?null:[outputArr, input.slice(i)]
}
} else return null
}
const colonParser = (input) => {
if (input[0] === ':') {
return [input[0], input.slice(1)]
} else {
return null
}
}
const colonParser = (input) => {return (input[0] === ':') ?[input[0], input.slice(1)]:null}
const objParser = (input) => {
if (input[0] === '{') {
let outputStr = {}
input = input.slice(1)
let result

while (input[0] !== '}' && result !== null) {
while (whiteSpaceParser(input) !== null || specialCharParser(input) !== null) {
input = input.slice(1)
}
result = strParser(input)

if (result !== null) {
input = result[1]
let key = result[0]
Expand All @@ -220,13 +124,10 @@ const objParser = (input) => {
if (separator[0] === ':') {
colonEncountered = separator[0]
}

input = separator[1]
}
}
if (!colonEncountered) {
return null
}
if (!colonEncountered) {return null}
result = valueParser(input)

if (result !== null) {
Expand Down Expand Up @@ -268,4 +169,4 @@ const valueParser = (input) => {
arrParser(input) || objParser(input)
}

module.exports = valueParser
module.exports = valueParser