Skip to content

Commit 092ed1a

Browse files
committed
Support for Association and Fraction
1 parent ef3ea26 commit 092ed1a

16 files changed

Lines changed: 106 additions & 24 deletions

File tree

repository/STON-Core.package/STONReader.class/instance/parseMapDo..st

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ parseMapDo: block
44
(self matchChar: $})
55
ifTrue: [ ^ self ].
66
[ readStream atEnd ] whileFalse: [ | name value |
7-
name := self parseValue.
7+
name := self parseSimpleValue.
88
(allowComplexMapKeys or: [ name isString or: [ name isNumber ] ])
99
ifFalse: [ self error: 'unexpected property name type' ].
1010
self expectChar: $:.

repository/STON-Core.package/STONReader.class/instance/parseNumber.st

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@ parseNumber
33
| negated number |
44
negated := readStream peekFor: $-.
55
number := self parseNumberInteger.
6-
(readStream peekFor: $.)
7-
ifTrue: [ number := number + self parseNumberFraction ].
8-
((readStream peekFor: $e) or: [ readStream peekFor: $E ])
9-
ifTrue: [ number := number * self parseNumberExponent ].
6+
(readStream peekFor: $/)
7+
ifTrue:
8+
[number := Fraction numerator: number denominator: self parseNumberInteger.
9+
(readStream peekFor: $s)
10+
ifTrue: [ number := ScaledDecimal for: number scale: self parseNumberInteger ]]
11+
ifFalse:
12+
[(readStream peekFor: $.)
13+
ifTrue: [ number := number + self parseNumberFraction ].
14+
((readStream peekFor: $e) or: [ readStream peekFor: $E ])
15+
ifTrue: [ number := number * self parseNumberExponent ]].
1016
negated
1117
ifTrue: [ number := number negated ].
1218
self consumeWhitespace.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
parsing
2+
parseSimpleValue
3+
| char |
4+
readStream atEnd ifFalse: [
5+
(self isClassStartChar: (char := readStream peek))
6+
ifTrue: [ ^ self parseObject ].
7+
char = ${
8+
ifTrue: [ ^ self parseMap ].
9+
char = $[
10+
ifTrue: [ ^ self parseList ].
11+
(char = $' or: [ char = $" ])
12+
ifTrue: [ ^ self parseString ].
13+
char = $#
14+
ifTrue: [ ^ self parseSymbol ].
15+
char = $@
16+
ifTrue: [ ^ self parseReference ].
17+
(char = $- or: [ char isDigit ])
18+
ifTrue: [ ^ self parseNumber ].
19+
self parseConstantDo: [ :value | ^ value ] ].
20+
self error: 'invalid input'
Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,8 @@
11
parsing
22
parseValue
3-
| char |
4-
readStream atEnd ifFalse: [
5-
(self isClassStartChar: (char := readStream peek))
6-
ifTrue: [ ^ self parseObject ].
7-
char = ${
8-
ifTrue: [ ^ self parseMap ].
9-
char = $[
10-
ifTrue: [ ^ self parseList ].
11-
(char = $' or: [ char = $" ])
12-
ifTrue: [ ^ self parseString ].
13-
char = $#
14-
ifTrue: [ ^ self parseSymbol ].
15-
char = $@
16-
ifTrue: [ ^ self parseReference ].
17-
(char = $- or: [ char isDigit ])
18-
ifTrue: [ ^ self parseNumber ].
19-
self parseConstantDo: [ :value | ^ value ] ].
20-
self error: 'invalid input'
3+
4+
| value |
5+
value := self parseSimpleValue.
6+
^ (self matchChar: $:)
7+
ifTrue: [ Association new key: value value: self parseValue ]
8+
ifFalse: [ value ]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
writing
2+
writeAssociation: association
3+
4+
jsonMode
5+
ifTrue: [ self error: 'wrong object class for JSON mode' ].
6+
self
7+
encodeKey: association key
8+
value: association value
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
writing
2+
writeFraction: fraction
3+
4+
jsonMode
5+
ifTrue: [ self writeFloat: fraction asFloat ]
6+
ifFalse: [ writeStream
7+
print: fraction numerator;
8+
nextPut: $/;
9+
print: fraction denominator ]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
writing
2+
writeScaledDecimal: scaledDecimal
3+
4+
jsonMode
5+
ifTrue: [ self writeFloat: scaledDecimal asFloat ]
6+
ifFalse: [ writeStream
7+
print: scaledDecimal numerator;
8+
nextPut: $/;
9+
print: scaledDecimal denominator;
10+
nextPut: $s;
11+
print: scaledDecimal scale ]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*ston-gemstone-core
2+
stonOn: stonWriter
3+
4+
stonWriter writeFraction: self
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"class" : {
3+
},
4+
"instance" : {
5+
} }
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
"name" : "AbstractFraction" }

0 commit comments

Comments
 (0)