author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Wed, 07 Dec 2016 13:18:16 +0000 | |
changeset 26 | b2c091b8cea1 |
parent 16 | 55254a6f8404 |
permissions | -rw-r--r-- |
1 | 1 |
"{ Package: 'stx:goodies/smaCC' }" |
2 |
||
3 |
"{ NameSpace: SmaCC }" |
|
4 |
||
5 |
SmaCCParser subclass:#SmaCCScannerParser |
|
6 |
instanceVariableNames:'tokens' |
|
7 |
classVariableNames:'' |
|
8 |
poolDictionaries:'' |
|
9 |
category:'SmaCC-Scanner Generator' |
|
10 |
! |
|
11 |
||
12 |
SmaCCScannerParser comment:'SmaCCScannerParser is the parser for the scanner definition. |
|
13 |
||
14 |
Instance Variables: |
|
15 |
tokens <Dictionary key: String value: SmaCCRegularExpressionNode> the tokens that are parsed |
|
16 |
||
17 |
' |
|
18 |
! |
|
19 |
||
20 |
||
21 |
!SmaCCScannerParser class methodsFor:'generated-accessing'! |
|
22 |
||
23 |
scannerClass |
|
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
24 |
^SmaCC::SmaCCScannerScanner |
1 | 25 |
! ! |
26 |
||
27 |
!SmaCCScannerParser class methodsFor:'generated-comments'! |
|
28 |
||
29 |
parserDefinitionComment |
|
30 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
31 |
"%left ""|""; |
1 | 32 |
%left ""("" <character> <backslashcharacter> <characterblock> <anycharacter> <tokenname>; |
33 |
%left ""*"" ""+"" ""?"" <repeat> ; |
|
34 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
35 |
File: Rules {tokens} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
36 |
| {tokens}; |
1 | 37 |
|
38 |
Rules: Rule "";"" |
|
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
39 |
| Rules Rule "";"" ; |
1 | 40 |
|
41 |
Rule: <tokenname> "":"" Regex {'3' position: '1' startPosition. tokens at: '1' value put: '3'. nil}; |
|
42 |
||
43 |
Regex: RegexTerm {'1'} |
|
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
44 |
| Regex ""|"" Regex {'1' | '3'} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
45 |
| Regex RegexTerm {'1' , '2'}; |
1 | 46 |
|
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
47 |
RegexTerm: <character> {SmaCCCharacterRENode characters: '1' value} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
48 |
| <anycharacter> {SmaCCCharacterRENode characters: self allCharacters} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
49 |
| <backslashcharacter> {self nodeFor: (ReadStream on: ('1' value copyFrom: 2 to: '1' value size))} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
50 |
| ""("" Regex "")"" {'2'} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
51 |
| <characterblock> {SmaCCCharacterRENode characters: (self parseCharacterBlock: '1')} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
52 |
| <tokenname> {(tokens at: '1' value) copy} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
53 |
| RegexTerm ""*"" {'1' repeat} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
54 |
| RegexTerm ""+"" {'1' repeatForAtLeast: 1} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
55 |
| RegexTerm ""?"" {'1' repeatFor: 0 to: 1} |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
56 |
| RegexTerm <repeat> {| readStream start stop | |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
57 |
readStream := ReadStream on: ('2' value copyFrom: 2 to: '2' value size - 1). |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
58 |
start := readStream upTo: $,. |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
59 |
stop := readStream upToEnd. |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
60 |
'1' repeatFor: (start isEmpty ifTrue: [0] ifFalse: [start asNumber]) to: (stop isEmpty ifTrue: [(1 bitShift: 31)] ifFalse: [stop asNumber])} ; |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
61 |
" |
1 | 62 |
! ! |
63 |
||
64 |
!SmaCCScannerParser class methodsFor:'generated-starting states'! |
|
65 |
||
66 |
startingStateForFile |
|
67 |
^1 |
|
68 |
! ! |
|
69 |
||
70 |
!SmaCCScannerParser methodsFor:'generated-reduction actions'! |
|
71 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
72 |
reduceActionForFile1:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
73 |
^ tokens |
1 | 74 |
! |
75 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
76 |
reduceActionForFile2:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
77 |
^ tokens |
1 | 78 |
! |
79 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
80 |
reduceActionForRegex1:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
81 |
^ nodes at:1 |
1 | 82 |
! |
83 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
84 |
reduceActionForRegex2:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
85 |
^ (nodes at:1) | (nodes at:3) |
1 | 86 |
! |
87 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
88 |
reduceActionForRegex3:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
89 |
^ (nodes at:1) , (nodes at:2) |
1 | 90 |
! |
91 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
92 |
reduceActionForRegexTerm10:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
93 |
|readStream start stop| |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
94 |
|
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
95 |
readStream := ReadStream |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
96 |
on:((nodes at:2) value copyFrom:2 to:(nodes at:2) value size - 1). |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
97 |
start := readStream upTo:$,. |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
98 |
stop := readStream upToEnd. |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
99 |
^ (nodes at:1) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
100 |
repeatFor:(start isEmpty ifTrue:[ 0 ] ifFalse:[ start asNumber ]) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
101 |
to:(stop isEmpty ifTrue:[ (1 bitShift:31) ] ifFalse:[ stop asNumber ]) |
1 | 102 |
! |
103 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
104 |
reduceActionForRegexTerm1:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
105 |
^ SmaCCCharacterRENode characters:(nodes at:1) value |
1 | 106 |
! |
107 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
108 |
reduceActionForRegexTerm2:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
109 |
^ SmaCCCharacterRENode characters:self allCharacters |
1 | 110 |
! |
111 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
112 |
reduceActionForRegexTerm3:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
113 |
^ self nodeFor:(ReadStream |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
114 |
on:((nodes at:1) value copyFrom:2 to:(nodes at:1) value size)) |
1 | 115 |
! |
116 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
117 |
reduceActionForRegexTerm4:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
118 |
^ nodes at:2 |
1 | 119 |
! |
120 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
121 |
reduceActionForRegexTerm5:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
122 |
^ SmaCCCharacterRENode characters:(self parseCharacterBlock:(nodes at:1)) |
1 | 123 |
! |
124 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
125 |
reduceActionForRegexTerm6:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
126 |
^ (tokens at:(nodes at:1) value) copy |
1 | 127 |
! |
128 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
129 |
reduceActionForRegexTerm7:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
130 |
^ (nodes at:1) repeat |
1 | 131 |
! |
132 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
133 |
reduceActionForRegexTerm8:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
134 |
^ (nodes at:1) repeatForAtLeast:1 |
1 | 135 |
! |
136 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
137 |
reduceActionForRegexTerm9:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
138 |
^ (nodes at:1) repeatFor:0 to:1 |
1 | 139 |
! |
140 |
||
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
141 |
reduceActionForRule1:nodes |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
142 |
(nodes at:3) position:(nodes at:1) startPosition. |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
143 |
tokens at:(nodes at:1) value put:(nodes at:3). |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
144 |
^ nil |
1 | 145 |
! ! |
146 |
||
147 |
!SmaCCScannerParser methodsFor:'generated-tables'! |
|
148 |
||
149 |
reduceTable |
|
150 |
^#( |
|
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
151 |
#(17 1 #reduceFor:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
152 |
#(18 1 #reduceActionForFile1:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
153 |
#(18 0 #reduceActionForFile2:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
154 |
#(19 1 #reduceActionForRegex1:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
155 |
#(19 3 #reduceActionForRegex2:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
156 |
#(19 2 #reduceActionForRegex3:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
157 |
#(20 1 #reduceActionForRegexTerm1:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
158 |
#(20 1 #reduceActionForRegexTerm2:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
159 |
#(20 1 #reduceActionForRegexTerm3:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
160 |
#(20 3 #reduceActionForRegexTerm4:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
161 |
#(20 1 #reduceActionForRegexTerm5:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
162 |
#(20 1 #reduceActionForRegexTerm6:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
163 |
#(20 2 #reduceActionForRegexTerm7:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
164 |
#(20 2 #reduceActionForRegexTerm8:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
165 |
#(20 2 #reduceActionForRegexTerm9:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
166 |
#(20 2 #reduceActionForRegexTerm10:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
167 |
#(23 2 #reduceFor:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
168 |
#(23 3 #reduceFor:) |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
169 |
#(24 3 #reduceActionForRule1:) |
1 | 170 |
) |
171 |
! |
|
172 |
||
173 |
transitionTable |
|
174 |
^#( |
|
16
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
175 |
#[1 0 9 0 12 0 13 0 18 0 14 0 21 0 17 0 23 0 21 0 24] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
176 |
#[0 0 25 0 7] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
177 |
#[0 0 0 0 21] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
178 |
#[1 0 9 0 12 0 10 0 21 0 29 0 24] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
179 |
#[0 0 33 0 8] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
180 |
#[1 0 37 0 1 0 41 0 9 0 45 0 10 0 49 0 12 0 53 0 15 0 57 0 16 0 61 0 19 0 65 0 20] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
181 |
#[0 0 69 0 8] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
182 |
#[0 0 70 0 12 0 21] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
183 |
#[1 0 37 0 1 0 41 0 9 0 45 0 10 0 49 0 12 0 53 0 15 0 57 0 16 0 73 0 19 0 65 0 20] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
184 |
#[0 0 38 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
185 |
#[0 0 46 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
186 |
#[0 0 50 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
187 |
#[0 0 30 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
188 |
#[0 0 34 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
189 |
#[1 0 37 0 1 0 77 0 2 0 78 0 8 0 41 0 9 0 45 0 10 0 49 0 12 0 53 0 15 0 57 0 16 0 81 0 20] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
190 |
#[1 0 18 0 1 0 18 0 2 0 85 0 3 0 18 0 4 0 89 0 5 0 93 0 6 0 18 0 8 0 18 0 9 0 18 0 10 0 18 0 12 0 97 0 14 0 18 0 15 0 18 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
191 |
#[0 0 74 0 12 0 21] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
192 |
#[1 0 37 0 1 0 77 0 2 0 101 0 4 0 41 0 9 0 45 0 10 0 49 0 12 0 53 0 15 0 57 0 16 0 81 0 20] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
193 |
#[1 0 37 0 1 0 41 0 9 0 45 0 10 0 49 0 12 0 53 0 15 0 57 0 16 0 105 0 19 0 65 0 20] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
194 |
#[1 0 26 0 1 0 26 0 2 0 85 0 3 0 26 0 4 0 89 0 5 0 93 0 6 0 26 0 8 0 26 0 9 0 26 0 10 0 26 0 12 0 97 0 14 0 26 0 15 0 26 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
195 |
#[0 0 54 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
196 |
#[0 0 58 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
197 |
#[0 0 62 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
198 |
#[0 0 66 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
199 |
#[0 0 42 0 1 0 2 0 3 0 4 0 5 0 6 0 8 0 9 0 10 0 12 0 14 0 15 0 16] |
55254a6f8404
Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents:
15
diff
changeset
|
200 |
#[1 0 37 0 1 0 22 0 2 0 22 0 4 0 22 0 8 0 41 0 9 0 45 0 10 0 49 0 12 0 53 0 15 0 57 0 16 0 81 0 20] |
1 | 201 |
) |
202 |
! ! |
|
203 |
||
204 |
!SmaCCScannerParser methodsFor:'initialize-release'! |
|
205 |
||
206 |
initialize |
|
207 |
super initialize. |
|
208 |
tokens := Dictionary new |
|
209 |
! ! |
|
210 |
||
211 |
!SmaCCScannerParser methodsFor:'private'! |
|
212 |
||
213 |
allCharacters |
|
214 |
^UnicodeString withAll: ((0 to: SmaCCGrammar maximumCharacterValue) |
|
215 |
collect: [:each | Character value: each]) |
|
216 |
||
217 |
"Modified: / 26-05-2006 / 22:16:45 / janfrog" |
|
218 |
! |
|
219 |
||
220 |
charactersFor: aStream in: aToken |
|
221 |
| characters char endCharacters | |
|
222 |
aStream atEnd ifTrue: [self reportCharacterBlockErrorForToken: aToken]. |
|
223 |
char := aStream next. |
|
224 |
characters := char == $\ |
|
225 |
ifTrue: [(self nodeFor: aStream) characters] |
|
226 |
ifFalse: [OrderedCollection with: char]. |
|
227 |
(characters size = 1 and: [aStream peekFor: $-]) ifFalse: [^characters]. |
|
228 |
endCharacters := self charactersFor: aStream in: aToken. |
|
229 |
endCharacters size > 1 |
|
230 |
ifTrue: [self reportCharacterBlockErrorForToken: aToken]. |
|
231 |
^(characters first asInteger to: endCharacters first asInteger) |
|
232 |
collect: [:each | Character value: each] |
|
233 |
! |
|
234 |
||
235 |
nodeFor: aStream |
|
236 |
| block char value count | |
|
237 |
char := aStream next. |
|
238 |
char == $f |
|
239 |
ifTrue: |
|
240 |
[^SmaCCCharacterRENode characters: (String with: (Character value: 12))]. |
|
241 |
char == $n |
|
242 |
ifTrue: |
|
243 |
[^SmaCCCharacterRENode characters: (String with: (Character value: 10))]. |
|
244 |
char == $r |
|
245 |
ifTrue: |
|
246 |
[^SmaCCCharacterRENode characters: (String with: (Character value: 13))]. |
|
247 |
char == $t ifTrue: [^SmaCCCharacterRENode characters: ' ']. |
|
248 |
char == $v |
|
249 |
ifTrue: |
|
250 |
[^SmaCCCharacterRENode characters: (String with: (Character value: 11))]. |
|
251 |
char == $c |
|
252 |
ifTrue: |
|
253 |
[^SmaCCCharacterRENode characters: (String |
|
254 |
with: (Character value: aStream next asInteger - $A asInteger))]. |
|
255 |
char == $x |
|
256 |
ifTrue: |
|
257 |
[count := value := 0. |
|
258 |
||
259 |
[aStream atEnd not and: |
|
260 |
[count < 4 and: |
|
261 |
[char := aStream peek. |
|
262 |
(char between: $0 and: $9) |
|
263 |
or: [(char between: $A and: $F) or: [char between: $a and: $f]]]]] |
|
264 |
whileTrue: |
|
265 |
[count := count + 1. |
|
266 |
value := value * 16 + aStream next digitValue]. |
|
267 |
^SmaCCCharacterRENode characters: (String with: (Character value: value))]. |
|
268 |
char == $d ifTrue: [block := [:each | each between: $0 and: $9]]. |
|
269 |
char == $D ifTrue: [block := [:each | (each between: $0 and: $9) not]]. |
|
270 |
char == $s |
|
271 |
ifTrue: [block := [:each | #[9 10 11 12 13 32] includes: each asInteger]]. |
|
272 |
char == $S |
|
273 |
ifTrue: |
|
274 |
[block := [:each | (#[9 10 11 12 13 32] includes: each asInteger) not]]. |
|
275 |
char == $w |
|
276 |
ifTrue: |
|
277 |
[block := |
|
278 |
[:each | |
|
279 |
(each between: $a and: $z) or: |
|
280 |
[(each between: $A and: $Z) |
|
281 |
or: [(each between: $0 and: $9) or: [each == $_]]]]]. |
|
282 |
char == $W |
|
283 |
ifTrue: |
|
284 |
[block := |
|
285 |
[:each | |
|
286 |
((each between: $a and: $z) or: |
|
287 |
[(each between: $A and: $Z) |
|
288 |
or: [(each between: $0 and: $9) or: [each == $_]]]) |
|
289 |
not]]. |
|
290 |
block isNil |
|
291 |
ifTrue: [^SmaCCCharacterRENode characters: (String with: char)]. |
|
292 |
^SmaCCCharacterRENode |
|
293 |
characters: (String withAll: (self allCharacters select: block)) |
|
294 |
! |
|
295 |
||
296 |
parseCharacterBlock: aToken |
|
297 |
| characters aStream invert | |
|
298 |
aStream := ReadStream |
|
299 |
on: (aToken value copyFrom: 2 to: aToken value size - 1). |
|
300 |
characters := OrderedCollection new. |
|
301 |
invert := aStream peekFor: $^. |
|
302 |
[aStream atEnd] |
|
303 |
whileFalse: [characters addAll: (self charactersFor: aStream in: aToken)]. |
|
304 |
^UnicodeString withAll: (invert |
|
305 |
ifTrue: [self allCharacters reject: [:each | characters includes: each]] |
|
306 |
ifFalse: [characters]) |
|
307 |
||
308 |
"Modified: / 26-05-2006 / 22:17:06 / janfrog" |
|
309 |
! |
|
310 |
||
311 |
reportCharacterBlockErrorForToken: aToken |
|
312 |
currentToken := aToken. |
|
313 |
self reportErrorMessage: 'Invalid character block' |
|
314 |
! ! |
|
315 |
||
316 |
!SmaCCScannerParser class methodsFor:'documentation'! |
|
317 |
||
318 |
version |
|
319 |
^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCScannerParser.st,v 1.2 2006-05-28 20:10:22 vranyj1 Exp $' |
|
15 | 320 |
! |
321 |
||
322 |
version_SVN |
|
323 |
^ '$Id$' |
|
1 | 324 |
! ! |