... | @@ -112,26 +112,32 @@ determining whether there are any errors after the opening LBrak or |
... | @@ -112,26 +112,32 @@ determining whether there are any errors after the opening LBrak or |
|
after any value or Comma.
|
|
after any value or Comma.
|
|
|
|
|
|
```
|
|
```
|
|
atDepth = bnc.EQ(ND, d)
|
|
zeroND = bnc.EQ(ND, 0)
|
|
nested = bnc.UGT(ND, d)
|
|
validEndValues = (valueToken | RBrak | RBrace) & ~zeroND
|
|
arrayStart = atDepth & LBrak
|
|
validEndValuesMinusStr = validEndValues & ~DQuote
|
|
arrayEnd = ScanThru(arrayStart, nested | (atDepth & ~ (RBrak | RBrace)))
|
|
|
|
errorAtEnd = arrayEnd & RBrace
|
|
// Validate that every value that is not a string is followed either
|
|
arraySpan = ExclusiveSpan(arrayStart, arrayEnd)
|
|
// by a comma or a the end validRBracket.
|
|
// Now validate that every value or nested item is followed
|
|
// String is a special case and is checked on kernel JSONParserObj
|
|
// either by a comma or a the end RBrak.
|
|
afterToken = Advance(validEndValuesMinusStr, 1)
|
|
afterNested = Advance(nested & arraySpan, 1) & atDepth
|
|
tokenNext = ScanThru(afterToken, whitespace)
|
|
afterToken = Advance(atDepth & valueToken & arraySpan, 1)
|
|
errAfterValue = tokenNext & ~(Comma | RBrak | RBrace | zeroND)
|
|
tokenNext = ScanThru(afterNested | afterToken, whitespace)
|
|
//
|
|
errAfterValue = tokenNext &~(Comma | RBrak)
|
|
// Every Comma must be followed by a value
|
|
//
|
|
advComma = Advance(Comma, 1)
|
|
// Every Comma must be followed by a value
|
|
validBeginValues = (valueToken | LBrak | LBrace) & ~zeroND
|
|
advCommaArrSpan = Advance(Comma & atDepth & arrarySpan, 1)
|
|
errAfterComma = ScanTo(advComma, anyToken) & ~validBeginValues)
|
|
errAfterComma = ScanTo(advCommaArrSpan, anyToken) & ~ (nested | (valueToken & atDepth))
|
|
|
|
//
|
|
for d in 1...MaxDepth
|
|
// After the LBrak we must have either a value or an RBrak.
|
|
atDepth = bnc.EQ(ND, d)
|
|
scanArrAnyToken = ScanTo(Advance(arrayStart, 1), anyToken)
|
|
nested = bnc.UGT(ND, d)
|
|
errAfterLBrak = scanArrAnyToken & ~ (nested | valueToken | RBrak)
|
|
arrayStart = atDepth & LBrak
|
|
|
|
arrayEnd = ScanThru(arrayStart, nested | (atDepth & ~ (RBrak | RBrace)))
|
|
|
|
errorAtEnd = arrayEnd & RBrace
|
|
|
|
//
|
|
|
|
// After the LBrak we must have either a value or an RBrak.
|
|
|
|
scanArrAnyToken = ScanTo(Advance(arrayStart, 1), anyToken)
|
|
|
|
errAfterLBrak = scanArrAnyToken & ~ (nested | (valueToken & atDepth) | RBrak)
|
|
```
|
|
```
|
|
|
|
|
|
### Validating objects
|
|
### Validating objects
|
... | | ... | |