author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Tue, 05 May 2015 15:07:56 +0200 | |
changeset 450 | 914c2567c987 |
parent 427 | a7f5e6de19d2 |
child 642 | 77d5fddb6462 |
permissions | -rw-r--r-- |
4 | 1 |
"{ Package: 'stx:goodies/petitparser' }" |
0 | 2 |
|
427
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
3 |
"{ NameSpace: Smalltalk }" |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
4 |
|
0 | 5 |
ReadStream subclass:#PPStream |
427
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
6 |
instanceVariableNames:'newlines' |
0 | 7 |
classVariableNames:'' |
8 |
poolDictionaries:'' |
|
9 |
category:'PetitParser-Core' |
|
10 |
! |
|
11 |
||
12 |
||
13 |
!PPStream methodsFor:'accessing'! |
|
14 |
||
159 | 15 |
collection |
16 |
"Answer the underlying collection." |
|
17 |
||
18 |
^ collection |
|
19 |
! |
|
20 |
||
42 | 21 |
next: anInteger |
0 | 22 |
"Answer up to anInteger elements of my collection. Overridden for efficiency." |
23 |
||
24 |
| answer endPosition | |
|
25 |
endPosition := position + anInteger min: readLimit. |
|
26 |
answer := collection copyFrom: position + 1 to: endPosition. |
|
27 |
position := endPosition. |
|
28 |
^ answer |
|
29 |
! |
|
30 |
||
31 |
peek |
|
32 |
"An improved version of peek, that is slightly faster than the built in version." |
|
33 |
||
34 |
^ self atEnd ifFalse: [ collection at: position + 1 ] |
|
35 |
! |
|
36 |
||
37 |
position: anInteger |
|
38 |
"The receiver does not check for invalid arguments passed to this method, as it is solely used with valid indexes for backtracking." |
|
39 |
||
40 |
position := anInteger |
|
41 |
! |
|
42 |
||
405
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
43 |
size |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
44 |
" |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
45 |
The same implementation as a ReadStream. Implemented here for compatibility with Smalltalk/X |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
46 |
that has different implementation in a ReadStream |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
47 |
" |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
48 |
^readLimit |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
49 |
! |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
50 |
|
0 | 51 |
uncheckedPeek |
52 |
"An unchecked version of peek that throws an error if we try to peek over the end of the stream, even faster than #peek." |
|
53 |
||
54 |
^ collection at: position + 1 |
|
55 |
! ! |
|
56 |
||
57 |
!PPStream methodsFor:'converting'! |
|
58 |
||
59 |
asPetitStream |
|
60 |
^ self |
|
61 |
! ! |
|
62 |
||
427
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
63 |
!PPStream methodsFor:'positioning'! |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
64 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
65 |
column: pos |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
66 |
| nl | |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
67 |
(pos = -1) ifTrue: [ ^ 0 ]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
68 |
(pos > readLimit) ifTrue: [ ^ self error: 'Out of limit' ]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
69 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
70 |
nl := self newlines. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
71 |
nl keysAndValuesDo: [ :index :value | |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
72 |
(value > pos) ifTrue: [ ^ pos - (nl at: (index - 1)) + 1] |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
73 |
]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
74 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
75 |
^ pos - (nl at: (nl size )) + 1 |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
76 |
! |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
77 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
78 |
fillNewlines |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
79 |
| tmp line | |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
80 |
newlines := OrderedCollection new. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
81 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
82 |
tmp := position. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
83 |
line := 0. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
84 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
85 |
(0 to: readLimit) do: [:index | |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
86 |
position := index. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
87 |
self isStartOfLine ifTrue: [ newlines add: position ] |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
88 |
]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
89 |
position := tmp. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
90 |
newlines := newlines asArray. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
91 |
^ newlines |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
92 |
! |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
93 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
94 |
line: pos |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
95 |
| nl | |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
96 |
(pos = -1) ifTrue: [ ^ 0 ]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
97 |
(pos > readLimit) ifTrue: [ ^ self error: 'Out of limit' ]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
98 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
99 |
nl := self newlines. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
100 |
nl keysAndValuesDo: [ :index :value | |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
101 |
(value > pos) ifTrue: [ ^ (index - 1)] |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
102 |
]. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
103 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
104 |
^ nl size |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
105 |
! |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
106 |
|
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
107 |
newlines |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
108 |
^ newlines ifNil: [ |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
109 |
newlines := self fillNewlines. |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
110 |
] |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
111 |
! ! |
a7f5e6de19d2
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
421
diff
changeset
|
112 |
|
0 | 113 |
!PPStream methodsFor:'printing'! |
114 |
||
115 |
printOn: aStream |
|
116 |
collection isString |
|
117 |
ifFalse: [ ^ super printOn: aStream ]. |
|
118 |
aStream |
|
119 |
nextPutAll: (collection copyFrom: 1 to: position); |
|
120 |
nextPutAll: '·'; |
|
121 |
nextPutAll: (collection copyFrom: position + 1 to: readLimit) |
|
122 |
! ! |
|
123 |
||
377
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
124 |
!PPStream methodsFor:'queries'! |
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
125 |
|
421
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
126 |
column |
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
127 |
^ self column: position. |
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
128 |
! |
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
129 |
|
377
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
130 |
insideCRLF |
405
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
131 |
(position < 1) ifTrue: [ ^ false ]. |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
132 |
|
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
133 |
^ (self peek = (Character codePoint: 10)) and: [ self peekBack = (Character codePoint: 13) ] |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
134 |
! |
380
8fe3cb4e607f
Remove Pharoisms to make code more portable and running on Smalltalk/X
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
377
diff
changeset
|
135 |
|
405
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
136 |
isEndOfLine |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
137 |
self atEnd ifTrue: [ ^ true ]. |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
138 |
self insideCRLF ifTrue: [ ^ false ]. |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
139 |
^ (self peek = (Character codePoint: 13) or: [ self peek = (Character codePoint: 10)]). |
377
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
140 |
! |
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
141 |
|
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
142 |
isStartOfLine |
405
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
143 |
(position = 0) ifTrue: [ ^ true ]. |
380
8fe3cb4e607f
Remove Pharoisms to make code more portable and running on Smalltalk/X
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
377
diff
changeset
|
144 |
|
405
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
145 |
self insideCRLF ifTrue: [ ^ false ]. |
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
146 |
|
0470a5e6e712
Merged PetitParser and PetitTests
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
388
diff
changeset
|
147 |
^ (self peekBack = (Character codePoint: 13)) or: [ self peekBack = (Character codePoint: 10)]. |
421
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
148 |
! |
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
149 |
|
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
150 |
line |
7e08b31e0dae
Merged JK's version from Monticello
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
405
diff
changeset
|
151 |
^ self line: position |
377
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
152 |
! ! |
6112a403a52d
Updated to latest version from Moose repository.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
159
diff
changeset
|
153 |
|
0 | 154 |
!PPStream class methodsFor:'documentation'! |
155 |
||
42 | 156 |
version |
159 | 157 |
^ '$Header: /cvs/stx/stx/goodies/petitparser/PPStream.st,v 1.4 2014-03-04 14:32:00 cg Exp $' |
42 | 158 |
! |
159 |
||
160 |
version_CVS |
|
159 | 161 |
^ '$Header: /cvs/stx/stx/goodies/petitparser/PPStream.st,v 1.4 2014-03-04 14:32:00 cg Exp $' |
42 | 162 |
! |
163 |
||
388
74c9c229033b
Workaround to fix PPComposedTest>>testLeftRecursion - make PPStream>>size returning size of the input.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
380
diff
changeset
|
164 |
version_HG |
74c9c229033b
Workaround to fix PPComposedTest>>testLeftRecursion - make PPStream>>size returning size of the input.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
380
diff
changeset
|
165 |
|
74c9c229033b
Workaround to fix PPComposedTest>>testLeftRecursion - make PPStream>>size returning size of the input.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
380
diff
changeset
|
166 |
^ '$Changeset: <not expanded> $' |
74c9c229033b
Workaround to fix PPComposedTest>>testLeftRecursion - make PPStream>>size returning size of the input.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
380
diff
changeset
|
167 |
! |
74c9c229033b
Workaround to fix PPComposedTest>>testLeftRecursion - make PPStream>>size returning size of the input.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
380
diff
changeset
|
168 |
|
0 | 169 |
version_SVN |
159 | 170 |
^ '$Id: PPStream.st,v 1.4 2014-03-04 14:32:00 cg Exp $' |
0 | 171 |
! ! |
159 | 172 |