CypressJSONReader.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 18 Sep 2012 13:00:02 +0000
changeset 18 fb5dc5aae98c
parent 15 31a33727c629
child 20 cdf3ee8ceeaa
permissions -rw-r--r--
- CypressFileTreeReader added: #readPackage:as:from: changed: #readPackage:from: category of:8 methods - CypressAbstractWriter category of:11 methods - CypressRepository added: #packageDirectoryForPackageName:in: #read:as: changed: #initialize #read: category of: #read: #writer - CypressAbstractReader class definition added: #packageDirectoryForPackageName:in: #readPackage:as:from: #readPackage:from: - extensions ...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     1
"{ Package: 'stx:goodies/cypress' }"
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     2
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
     3
Object subclass:#CypressJSONReader
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     4
	instanceVariableNames:'stream'
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     5
	classVariableNames:''
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     6
	poolDictionaries:''
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
     7
	category:'Cypress-New-Reader & Writer'
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     8
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
     9
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    10
CypressJSONReader comment:'Main comment stating the purpose of this class and relevant relationship to other classes.

Possible useful expressions for doIt or printIt.

Structure:
 instVar1		type -- comment about the purpose of instVar1
 instVar2		type -- comment about the purpose of instVar2

Any further useful comments about the general approach of this implementation.'
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    11
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    12
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    13
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    14
!CypressJSONReader class methodsFor:'instance creation'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    15
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    16
new
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    17
	self error: 'Instantiate the parser with a stream.'
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    18
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    19
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    20
on: aStream
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    21
	^ self basicNew initializeOn: aStream
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    22
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    23
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    24
!CypressJSONReader class methodsFor:'accessing'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    25
12
ec118792047a - Package writing rewritten to use new model. Writes package according to recent spec.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    26
parse: aStringOrFilename
ec118792047a - Package writing rewritten to use new model. Writes package according to recent spec.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    27
        ^ self parseStream: aStringOrFilename readStream
ec118792047a - Package writing rewritten to use new model. Writes package according to recent spec.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    28
ec118792047a - Package writing rewritten to use new model. Writes package according to recent spec.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    29
    "Modified (format): / 11-09-2012 / 11:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    30
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    31
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    32
parseStream: aStream
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    33
	^ (self on: aStream) parse
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    34
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    35
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    36
!CypressJSONReader methodsFor:'adding'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    37
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    38
addProperty: anAssociation to: anObject
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    39
	"Add the property anAssociation described with key and value to anObject. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    40
	
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    41
	^ anObject 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    42
		add: anAssociation;
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    43
		yourself
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    44
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    45
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    46
addValue: anObject to: aCollection
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    47
	"Add anObject to aCollection. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    48
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    49
	^ aCollection copyWith: anObject
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    50
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    51
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    52
!CypressJSONReader methodsFor:'creating'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    53
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    54
createArray
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    55
	"Create an empty collection. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    56
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    57
	^ Array new
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    58
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    59
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    60
createFalse
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    61
	"Create the false literal. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    62
	
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    63
	^ false
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    64
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    65
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    66
createNull
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    67
	"Create the null literal. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    68
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    69
	^ nil
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    70
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    71
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    72
createNumber: aString
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    73
	"Create a number literal. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    74
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    75
	^ aString asNumber
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    76
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    77
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    78
createObject
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    79
	"Create an empty object. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    80
	
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    81
	^ Dictionary new
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    82
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    83
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    84
createProperty: aKey with: aValue
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    85
	"Create an empty attribute value pair. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    86
	
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    87
	^ aKey -> aValue
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    88
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    89
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    90
createString: aString
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    91
	"Create a string literal. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    92
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    93
	^ aString
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    94
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    95
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    96
createTrue
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    97
	"Create the true literal. Subclasses might want to refine this implementation."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    98
8a5b7afa28ff - First shot
jv
parents:
diff changeset
    99
	^ true
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   100
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   101
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   102
!CypressJSONReader methodsFor:'initialization'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   103
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   104
initializeOn: aStream
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   105
	self initialize.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   106
	stream := aStream
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   107
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   108
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   109
!CypressJSONReader methodsFor:'parsing'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   110
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   111
parse
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   112
	| result |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   113
	result := self whitespace; parseValue.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   114
	stream atEnd
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   115
		ifFalse: [ self error: 'end of input expected' ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   116
	^ result
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   117
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   118
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   119
parseArray
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   120
	| result |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   121
	self expect: '['.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   122
	result := self createArray.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   123
	(self match: ']')
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   124
		ifTrue: [ ^ result ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   125
	[ stream atEnd ] whileFalse: [
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   126
		result := self
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   127
			addValue: self parseValue
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   128
			to: result.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   129
		(self match: ']') 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   130
			ifTrue: [ ^ result ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   131
		self expect: ',' ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   132
	self error: 'end of array expected'
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   133
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   134
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   135
parseObject
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   136
	| result |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   137
	self expect: '{'.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   138
	result := self createObject.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   139
	(self match: '}')
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   140
		ifTrue: [ ^ result ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   141
	[ stream atEnd ] whileFalse: [
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   142
		result := self
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   143
			addProperty: self parseProperty
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   144
			to: result.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   145
		(self match: '}')
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   146
			ifTrue: [ ^ result ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   147
		self expect: ',' ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   148
	self error: 'end of object expected'
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   149
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   150
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   151
parseValue
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   152
	| char |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   153
	stream atEnd ifFalse: [ 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   154
		char := stream peek.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   155
		char = ${
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   156
			ifTrue: [ ^ self parseObject ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   157
		char = $[
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   158
			ifTrue: [ ^ self parseArray ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   159
		char = $"
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   160
			ifTrue: [ ^ self parseString ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   161
		(char = $- or: [ char between: $0 and: $9 ])
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   162
			ifTrue: [ ^ self parseNumber ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   163
		(self match: 'true')
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   164
			ifTrue: [ ^ self createTrue ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   165
		(self match: 'false')
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   166
			ifTrue: [ ^ self createFalse ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   167
		(self match: 'null')
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   168
			ifTrue: [ ^ self createNull ] ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   169
	self error: 'invalid input'
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   170
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   171
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   172
!CypressJSONReader methodsFor:'parsing-internal'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   173
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   174
parseCharacter
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   175
	| char |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   176
	(char := stream next) = $\ 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   177
		ifFalse: [ ^ char ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   178
	(char := stream next) = $" 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   179
		ifTrue: [ ^ char ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   180
	char = $\
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   181
		ifTrue: [ ^ char ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   182
	char = $/
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   183
		ifTrue: [ ^ char ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   184
	char = $b
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   185
		ifTrue: [ ^ Character backspace ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   186
	char = $f
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   187
		ifTrue: [ ^ Character newPage ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   188
	char = $n
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   189
		ifTrue: [ ^ Character lfCharacter ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   190
	char = $r
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   191
		ifTrue: [ ^ Character crCharacter ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   192
	char = $t
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   193
		ifTrue: [ ^ Character tab ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   194
	char = $u
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   195
		ifTrue: [ ^ self parseCharacterHex ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   196
	self error: 'invalid escape character \' , (String with: char)
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   197
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   198
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   199
parseCharacterHex
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   200
	| value |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   201
	value := self parseCharacterHexDigit.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   202
	3 timesRepeat: [ value := (value << 4) + self parseCharacterHexDigit ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   203
	^ Character unicodeCodePoint: value
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   204
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   205
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   206
parseCharacterHexDigit
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   207
	| digit |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   208
	stream atEnd ifFalse: [
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   209
		digit _ stream next asUppercase digitValue.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   210
		"accept hex digits"
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   211
		(digit >= 0 and: [ digit < 16 ]) ifTrue: [ ^ digit ]].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   212
	self error: 'hex-digit expected'.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   213
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   214
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   215
parseNumber
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   216
	| negated number |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   217
	negated := stream peek = $-.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   218
	negated ifTrue: [ stream next ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   219
	number := self parseNumberInteger.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   220
	(stream peek = $.) ifTrue: [
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   221
		stream next. 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   222
		number := number + self parseNumberFraction ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   223
	(stream peek = $e or: [ stream peek = $E ]) ifTrue: [
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   224
		stream next.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   225
		number := number * self parseNumberExponent ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   226
	negated ifTrue: [ number := number negated ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   227
	^ self whitespace; createNumber: number
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   228
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   229
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   230
parseNumberExponent
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   231
    | number negated |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   232
    number := 0.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   233
    negated := stream peek = $-.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   234
    (negated or: [ stream peek = $+ ])
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   235
        ifTrue: [ stream next ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   236
    [ stream atEnd not and: [ stream peek isDigit ] ] whileTrue: [ number := 10 * number + (stream next digitValue) ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   237
    negated
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   238
        ifTrue: [ number := number negated ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   239
    ^ 10 raisedTo: number
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   240
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   241
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   242
parseNumberFraction
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   243
    | number power |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   244
    number := 0.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   245
    power := 1.0.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   246
    [ stream atEnd not and: [ stream peek isDigit ] ]
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   247
        whileTrue: [ 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   248
            number := 10 * number + (stream next digitValue).
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   249
            power := power * 10.0 ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   250
    ^ number / power
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   251
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   252
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   253
parseNumberInteger
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   254
    | number |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   255
    number := 0.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   256
    [ stream atEnd not and: [ stream peek isDigit ] ] whileTrue: [ number := 10 * number + (stream next asciiValue - 48) ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   257
    ^ number
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   258
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   259
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   260
parseProperty
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   261
	| name value |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   262
	name := self parseString.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   263
	self expect: ':'.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   264
	value := self parseValue.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   265
	^ self createProperty: name with: value.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   266
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   267
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   268
parseString
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   269
	| result |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   270
	self expect: '"'.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   271
	result := WriteStream on: String new.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   272
	[ stream atEnd or: [ stream peek = $" ] ] 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   273
		whileFalse: [ result nextPut: self parseCharacter ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   274
	^ self expect: '"'; createString: result contents
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   275
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   276
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   277
!CypressJSONReader methodsFor:'private'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   278
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   279
expect: aString
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   280
	"Expects aString and consume input, throw an error otherwise."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   281
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   282
	^ (self match: aString) ifFalse: [ self error: aString , ' expected' ]
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   283
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   284
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   285
match: aString
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   286
	"Tries to match aString, consume input and answer true if successful."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   287
	
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   288
	| position |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   289
	position := stream position.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   290
	aString do: [ :each |
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   291
		(stream atEnd or: [ stream next ~= each ]) ifTrue: [ 
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   292
			stream position: position.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   293
			^ false ] ].
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   294
	self whitespace.
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   295
	^ true
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   296
!
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   297
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   298
whitespace
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   299
	"Strip whitespaces from the input stream."
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   300
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   301
	[ stream atEnd not and: [ stream peek isSeparator ] ]
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   302
		whileTrue: [ stream next ]
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   303
! !
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   304
15
31a33727c629 - Getting rid of old Cypress implementation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   305
!CypressJSONReader class methodsFor:'documentation'!
1
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   306
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   307
version_SVN
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   308
    ^ '$Id::                                                                                                                        $'
8a5b7afa28ff - First shot
jv
parents:
diff changeset
   309
! !