1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
2 |
2 |
3 "{ NameSpace: Smalltalk }" |
3 "{ NameSpace: Smalltalk }" |
4 |
4 |
5 PPCConfiguration subclass:#PPCTokenizingConfiguration |
5 PPCConfiguration subclass:#PPCTokenizingConfiguration |
6 instanceVariableNames:'scannerClazz parserClazz idGen' |
6 instanceVariableNames:'' |
7 classVariableNames:'' |
7 classVariableNames:'' |
8 poolDictionaries:'' |
8 poolDictionaries:'' |
9 category:'PetitCompiler-Core' |
9 category:'PetitCompiler-Core' |
10 ! |
10 ! |
11 |
11 |
|
12 |
12 !PPCTokenizingConfiguration methodsFor:'compiling'! |
13 !PPCTokenizingConfiguration methodsFor:'compiling'! |
13 |
|
14 options: args |
|
15 super options: args. |
|
16 ! |
|
17 |
14 |
18 buildClass: clazz |
15 buildClass: clazz |
19 | builder | |
16 | builder | |
20 builder := PPCClassBuilder new. |
17 builder := PPCClassBuilder new. |
21 |
18 |
46 self createFSAs. |
43 self createFSAs. |
47 self buildScannerTokens. |
44 self buildScannerTokens. |
48 self buildScannerScans. |
45 self buildScannerScans. |
49 self generateScanner. |
46 self generateScanner. |
50 self generateParser. |
47 self generateParser. |
51 ! ! |
|
52 |
|
53 !PPCTokenizingConfiguration methodsFor:'initialization'! |
|
54 |
|
55 fillInClazzes |
|
56 parserClazz name: options parserName. |
|
57 parserClazz superclass: PPTokenizingCompiledParser. |
|
58 |
|
59 scannerClazz name: options scannerName. |
|
60 scannerClazz superclass: options scannerSuperclass. |
|
61 |
|
62 ! |
48 ! |
63 |
49 |
64 initialize |
50 options: args |
65 super initialize. |
51 super options: args. |
66 |
|
67 parserClazz := PPCClass new. |
|
68 scannerClazz := PPCClass new. |
|
69 |
|
70 idGen := PPCIdGenerator new. |
|
71 |
|
72 "The parser and scanner share the same id generator in order |
|
73 to use same names for tokens. |
|
74 " |
|
75 parserClazz idGen: idGen. |
|
76 scannerClazz idGen: idGen. |
|
77 ! ! |
52 ! ! |
78 |
53 |
79 !PPCTokenizingConfiguration methodsFor:'phases'! |
54 !PPCTokenizingConfiguration methodsFor:'phases'! |
80 |
55 |
81 buildParserClazz |
56 buildParserClazz |
82 | rootMethod | |
57 | rootMethod | |
83 rootMethod := PPCTokenizingCodeGenerator new |
58 rootMethod := PPCTokenizingCodeGenerator new |
84 clazz: parserClazz; |
59 clazz: context parserClass; |
85 options: options; |
60 options: options; |
86 visit: ir. |
61 visit: ir. |
87 |
62 |
88 parserClazz propertyAt: #rootMethod put: rootMethod |
63 context parserClass propertyAt: #rootMethod put: rootMethod |
|
64 |
|
65 "Modified: / 25-08-2015 / 00:07:38 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
89 ! |
66 ! |
90 |
67 |
91 buildScannerScans |
68 buildScannerScans |
92 | fsas generator | |
69 | fsas generator | |
93 |
70 |
96 fsas addAll: (ir allNodes select: [ :node | node hasFsa ] thenCollect: [:node | node fsa]). |
73 fsas addAll: (ir allNodes select: [ :node | node hasFsa ] thenCollect: [:node | node fsa]). |
97 fsas addAll: (ir allNodes select: [ :node | node hasNextFsa ] thenCollect: [:node | node nextFsa]). |
74 fsas addAll: (ir allNodes select: [ :node | node hasNextFsa ] thenCollect: [:node | node nextFsa]). |
98 fsas := fsas reject: [ :fsa | fsa hasDistinctRetvals not ]. |
75 fsas := fsas reject: [ :fsa | fsa hasDistinctRetvals not ]. |
99 |
76 |
100 generator := PPCScannerCodeGenerator new |
77 generator := PPCScannerCodeGenerator new |
101 clazz: scannerClazz; |
78 clazz: context scannerClass; |
102 options: options; |
79 options: options; |
103 yourself. |
80 yourself. |
104 |
81 |
105 fsas do: [ :fsa | generator generate: fsa ]. |
82 fsas do: [ :fsa | generator generate: fsa ]. |
|
83 |
|
84 "Modified: / 25-08-2015 / 00:04:43 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
106 ! |
85 ! |
107 |
86 |
108 buildScannerTokens |
87 buildScannerTokens |
109 | generator | |
88 | generator | |
110 generator := PPCTokenCodeGenerator new |
89 generator := PPCTokenCodeGenerator new |
111 clazz: scannerClazz; |
90 clazz: context scannerClass; |
112 options: options; |
91 options: options; |
113 yourself. |
92 yourself. |
114 |
93 |
115 generator visit: ir. |
94 generator visit: ir. |
|
95 |
|
96 "Modified: / 25-08-2015 / 00:04:46 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
116 ! |
97 ! |
117 |
98 |
118 createFSAs |
99 createFSAs |
119 ir := PPCFSAVisitor new |
100 ir := PPCFSAVisitor new |
120 idGen: idGen; |
101 idGen: context scannerClass idGen; |
121 visit: ir. |
102 visit: ir. |
122 |
103 |
123 self remember: (self copyTree: ir) as: #withFSAs |
104 self remember: (self copyTree: ir) as: #withFSAs |
|
105 |
|
106 "Modified: / 25-08-2015 / 00:07:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
124 ! |
107 ! |
125 |
108 |
126 createLL1Choices |
109 createLL1Choices |
127 self flag: 'This phase needs revisit and update'. |
110 self flag: 'This phase needs revisit and update'. |
128 |
111 |
134 ! |
117 ! |
135 |
118 |
136 generateParser |
119 generateParser |
137 | parserClass rootMethod | |
120 | parserClass rootMethod | |
138 options generate ifFalse: [ ^ self ]. |
121 options generate ifFalse: [ ^ self ]. |
139 rootMethod := parserClazz propertyAt: #rootMethod. |
122 rootMethod := context parserClass propertyAt: #rootMethod. |
140 |
123 |
141 parserClazz name: options parserName. |
124 context parserClass name: options parserName. |
142 parserClazz superclass: options parserSuperclass. |
125 context parserClass superclass: options parserSuperclass. |
143 |
126 |
144 parserClass := self buildClass: parserClazz. |
127 parserClass := self buildClass: context parserClass. |
145 parserClass startSymbol: rootMethod methodName. |
128 parserClass startSymbol: rootMethod methodName. |
146 |
129 |
147 self remember: parserClass as: #parser. |
130 self remember: parserClass as: #parser. |
148 ir := parserClass new |
131 ir := parserClass new |
149 |
132 |
150 |
133 "Modified: / 25-08-2015 / 00:05:49 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
151 ! |
134 ! |
152 |
135 |
153 generateScanner |
136 generateScanner |
154 | scanner | |
137 | scanner | |
155 options generate ifFalse: [ ^ self ]. |
138 options generate ifFalse: [ ^ self ]. |
156 |
139 |
157 scannerClazz name: options scannerName. |
140 context scannerClass name: options scannerName. |
158 scannerClazz superclass: options scannerSuperclass. |
141 context scannerClass superclass: options scannerSuperclass. |
159 |
142 |
160 scanner := (self buildClass: scannerClazz). |
143 scanner := (self buildClass: context scannerClass). |
161 parserClazz addConstant: scanner as: #scannerClass. |
144 context parserClass addConstant: scanner as: #scannerClass. |
162 |
145 |
163 ir := scanner. |
146 ir := scanner. |
164 |
147 |
165 self remember: scanner as: #scanner |
148 self remember: scanner as: #scanner |
|
149 |
|
150 "Modified: / 25-08-2015 / 00:06:49 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
166 ! |
151 ! |
167 |
152 |
168 tokenize |
153 tokenize |
169 " |
154 " |
170 This will try transform the parser into the tokenizing parser |
155 This will try transform the parser into the tokenizing parser |