KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > polyglot > ext > jl > qq > QQ


1 package polyglot.ext.jl.qq;
2
3 import polyglot.ast.*;
4 import polyglot.types.*;
5 import polyglot.util.*;
6 import polyglot.visit.*;
7 import polyglot.frontend.*;
8 import polyglot.main.Report;
9 import polyglot.lex.Lexer;
10
11 import polyglot.ext.jl.qq.Lexer_c;
12 import polyglot.ext.jl.qq.Grm;
13
14 import java.util.*;
15 import java.io.*;
16
17 /**
18   Java language quasiquoter. This class contains methods for parsing strings
19   into ASTs.
20
21   <p>
22   To use the class, invoke one of the <code>parseT</code> methods to create a
23   <code>Node</code> of type <code>T</code>.
24
25   <p>
26   Each <code>parseT</code> method takes a format string as its first argument
27   and some additional <code>Object</code> arguments. Each pattern in the
28   format string is matched with its corresponding <code>Object</code>.
29
30   <p>
31   The format string may contain the following patterns:
32   <ul>
33     <li> <code>%s</code> matches <code>String (parsed as an identifier)
34
35     <li> <code>%T</code> matches <code>Type</code> or <code>TypeNode></code>
36     <li> <code>%E</code> matches <code>Expr</code>
37     <li> <code>%S</code> matches <code>Stmt</code>
38     <li> <code>%D</code> matches <code>ClassDecl</code>
39     <li> <code>%M</code> matches <code>ClassMember</code>
40     <li> <code>%F</code> matches <code>Formal</code>
41
42     <li> <code>%LT</code> matches <code>List&lt;Type&gt;</code> or <code>List&lt;TypeNode&gt;</code>
43     <li> <code>%LE</code> matches <code>List&lt;Expr&gt;</code>
44     <li> <code>%LS</code> matches <code>List&lt;Stmt&gt;</code>
45     <li> <code>%LD</code> matches <code>List&lt;ClassDecl&gt;</code>
46     <li> <code>%LM</code> matches <code>List&lt;ClassMember&gt;</code>
47     <li> <code>%LF</code> matches <code>List&lt;Formal&gt;</code>
48   </ul>
49   These patterns are recognized as tokens by the lexer--surrounding the token
50   with whitespace or parens may be needed to parse the string.
51
52   <p>
53   For example:
54   <pre>
55       Expr e;
56       TypeNode t;
57       Stmt s = qq.parseStmt("%T %s = new %T(%E);", t, "tmp", t, e);
58   </pre>
59  */

60 public class QQ {
61     protected ExtensionInfo ext;
62     protected Position pos;
63
64     protected static final int EXPR = 0;
65     protected static final int STMT = 1;
66     protected static final int TYPE = 2;
67     protected static final int MEMB = 3;
68     protected static final int DECL = 4;
69     protected static final int FILE = 5;
70
71     /** Create a new quasiquoter to create AST nodes of the given
72       language extension. */

73     public QQ(ExtensionInfo ext) {
74         this(ext, Position.COMPILER_GENERATED);
75     }
76
77     /** Create a new quasiquoter to create AST nodes of the given
78       language extension, using <code>pos</code> for the position
79       of the nodes created. */

80     public QQ(ExtensionInfo ext, Position pos) {
81         this.ext = ext;
82         this.pos = pos;
83     }
84
85     /** Create an empty list. */
86     private List list() { return Collections.EMPTY_LIST; }
87
88     /** Create a singleton list. */
89     private List list(Object JavaDoc o1) {
90     return list(new Object JavaDoc[] { o1 });
91     }
92
93     /** Create a 2-element list. */
94     private List list(Object JavaDoc o1, Object JavaDoc o2) {
95         return list(new Object JavaDoc[] { o1, o2 });
96     }
97  
98     /** Create a 3-element list. */
99     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
100         return list(new Object JavaDoc[] { o1, o2, o3 });
101     }
102
103     /** Create a 4-element list. */
104     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3, Object JavaDoc o4) {
105         return list(new Object JavaDoc[] { o1, o2, o3, o4 });
106     }
107
108     /** Create a 5-element list. */
109     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3, Object JavaDoc o4, Object JavaDoc o5) {
110         return list(new Object JavaDoc[] { o1, o2, o3, o4, o5 });
111     }
112
113     /** Create a 6-element list. */
114     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3, Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6) {
115         return list(new Object JavaDoc[] { o1, o2, o3, o4, o5, o6 });
116     }
117
118     /** Create a 7-element list. */
119     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3, Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7) {
120         return list(new Object JavaDoc[] { o1, o2, o3, o4, o5, o6, o7 });
121     }
122
123     /** Create a 8-element list. */
124     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3, Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8) {
125         return list(new Object JavaDoc[] { o1, o2, o3, o4, o5, o6, o7, o8 });
126     }
127
128     /** Create a 9-element list. */
129     private List list(Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3, Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9) {
130         return list(new Object JavaDoc[] { o1, o2, o3, o4, o5, o6, o7, o8, o9 });
131     }
132
133     /** Create a list from an array. */
134     private List list(Object JavaDoc[] os) {
135         return Arrays.asList(os);
136     }
137
138     /**
139      * Parse a string into a <code>SourceFile</code> AST node,
140      * applying substitutions.
141      */

142     public SourceFile parseFile(String JavaDoc fmt) {
143         return (SourceFile) parse(fmt, list(), FILE);
144     }
145
146     /**
147      * Parse a string into a <code>SourceFile</code> AST node,
148      * applying substitutions.
149      */

150     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1) {
151         return (SourceFile) parse(fmt, list(o1), FILE);
152     }
153
154     /**
155      * Parse a string into a <code>SourceFile</code> AST node,
156      * applying substitutions.
157      */

158     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2) {
159         return (SourceFile) parse(fmt, list(o1, o2), FILE);
160     }
161
162     /**
163      * Parse a string into a <code>SourceFile</code> AST node,
164      * applying substitutions.
165      */

166     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
167         return (SourceFile) parse(fmt, list(o1, o2, o3), FILE);
168     }
169
170     /**
171      * Parse a string into a <code>SourceFile</code> AST node,
172      * applying substitutions.
173      */

174     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
175         Object JavaDoc o4)
176     {
177         return (SourceFile) parse(fmt, list(o1, o2, o3, o4), FILE);
178     }
179
180     /**
181      * Parse a string into a <code>SourceFile</code> AST node,
182      * applying substitutions.
183      */

184     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
185         Object JavaDoc o4, Object JavaDoc o5)
186     {
187         return (SourceFile) parse(fmt, list(o1, o2, o3, o4, o5), FILE);
188     }
189
190     /**
191      * Parse a string into a <code>SourceFile</code> AST node,
192      * applying substitutions.
193      */

194     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
195         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6)
196     {
197         return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6), FILE);
198     }
199
200     /**
201      * Parse a string into a <code>SourceFile</code> AST node,
202      * applying substitutions.
203      */

204     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
205         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7)
206     {
207         return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), FILE);
208     }
209
210     /**
211      * Parse a string into a <code>SourceFile</code> AST node,
212      * applying substitutions.
213      */

214     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
215         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8)
216     {
217         return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), FILE);
218     }
219
220     /**
221      * Parse a string into a <code>SourceFile</code> AST node,
222      * applying substitutions.
223      */

224     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
225         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9)
226     {
227         return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), FILE);
228     }
229
230     /**
231      * Parse a string into a <code>SourceFile</code> AST node,
232      * applying substitutions.
233      */

234     public SourceFile parseFile(String JavaDoc fmt, Object JavaDoc[] os) {
235         return (SourceFile) parse(fmt, list(os), FILE);
236     }
237
238     /**
239      * Parse a string into a <code>SourceFile</code> AST node,
240      * applying substitutions.
241      */

242     public SourceFile parseFile(String JavaDoc fmt, List subst) {
243         return (SourceFile) parse(fmt, subst, FILE);
244     }
245
246     /** Parse a string into a <code>ClassDecl</code> AST node,
247      * applying substitutions. */

248     public ClassDecl parseDecl(String JavaDoc fmt) {
249         return (ClassDecl) parse(fmt, list(), DECL);
250     }
251
252     /** Parse a string into a <code>ClassDecl</code> AST node,
253      * applying substitutions. */

254     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1) {
255         return (ClassDecl) parse(fmt, list(o1), DECL);
256     }
257
258     /** Parse a string into a <code>ClassDecl</code> AST node,
259      * applying substitutions. */

260     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2) {
261         return (ClassDecl) parse(fmt, list(o1, o2), DECL);
262     }
263
264     /** Parse a string into a <code>ClassDecl</code> AST node,
265      * applying substitutions. */

266     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
267         return (ClassDecl) parse(fmt, list(o1, o2, o3), DECL);
268     }
269
270     /** Parse a string into a <code>ClassDecl</code> AST node,
271      * applying substitutions. */

272     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
273         Object JavaDoc o4)
274     {
275         return (ClassDecl) parse(fmt, list(o1, o2, o3, o4), DECL);
276     }
277
278     /** Parse a string into a <code>ClassDecl</code> AST node,
279      * applying substitutions. */

280     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
281         Object JavaDoc o4, Object JavaDoc o5)
282     {
283         return (ClassDecl) parse(fmt, list(o1, o2, o3, o4, o5), DECL);
284     }
285
286     /** Parse a string into a <code>ClassDecl</code> AST node,
287      * applying substitutions. */

288     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
289         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6)
290     {
291         return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6), DECL);
292     }
293
294     /** Parse a string into a <code>ClassDecl</code> AST node,
295      * applying substitutions. */

296     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
297         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7)
298     {
299         return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), DECL);
300     }
301
302     /** Parse a string into a <code>ClassDecl</code> AST node,
303      * applying substitutions. */

304     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
305         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8)
306        
307     {
308         return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), DECL);
309     }
310
311     /** Parse a string into a <code>ClassDecl</code> AST node,
312      * applying substitutions. */

313     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
314         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9)
315        
316     {
317         return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), DECL);
318     }
319
320     /** Parse a string into a <code>ClassDecl</code> AST node,
321      * applying substitutions. */

322     public ClassDecl parseDecl(String JavaDoc fmt, Object JavaDoc[] os) {
323         return (ClassDecl) parse(fmt, list(os), DECL);
324     }
325
326     /** Parse a string into a <code>ClassDecl</code> AST node,
327      * applying substitutions. */

328     public ClassDecl parseDecl(String JavaDoc fmt, List subst) {
329         return (ClassDecl) parse(fmt, subst, DECL);
330     }
331
332     /** Parse a string into a <code>ClassMember</code> AST node,
333      * applying substitutions. */

334     public ClassMember parseMember(String JavaDoc fmt) {
335         return (ClassMember) parse(fmt, list(), MEMB);
336     }
337
338     /** Parse a string into a <code>ClassMember</code> AST node,
339      * applying substitutions. */

340     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1) {
341         return (ClassMember) parse(fmt, list(o1), MEMB);
342     }
343
344     /** Parse a string into a <code>ClassMember</code> AST node,
345      * applying substitutions. */

346     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2) {
347         return (ClassMember) parse(fmt, list(o1, o2), MEMB);
348     }
349
350     /** Parse a string into a <code>ClassMember</code> AST node,
351      * applying substitutions. */

352     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
353         return (ClassMember) parse(fmt, list(o1, o2, o3), MEMB);
354     }
355
356     /** Parse a string into a <code>ClassMember</code> AST node,
357      * applying substitutions. */

358     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
359         Object JavaDoc o4)
360     {
361         return (ClassMember) parse(fmt, list(o1, o2, o3, o4), MEMB);
362     }
363
364     /** Parse a string into a <code>ClassMember</code> AST node,
365      * applying substitutions. */

366     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
367         Object JavaDoc o4, Object JavaDoc o5)
368     {
369         return (ClassMember) parse(fmt, list(o1, o2, o3, o4, o5), MEMB);
370     }
371
372     /** Parse a string into a <code>ClassMember</code> AST node,
373      * applying substitutions. */

374     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
375         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6)
376     {
377         return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6), MEMB);
378     }
379
380     /** Parse a string into a <code>ClassMember</code> AST node,
381      * applying substitutions. */

382     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
383         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7)
384     {
385         return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), MEMB);
386     }
387
388     /** Parse a string into a <code>ClassMember</code> AST node,
389      * applying substitutions. */

390     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
391         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8)
392        
393     {
394         return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), MEMB);
395     }
396
397     /** Parse a string into a <code>ClassMember</code> AST node,
398      * applying substitutions. */

399     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
400         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9)
401        
402     {
403         return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), MEMB);
404     }
405
406     /** Parse a string into a <code>ClassMember</code> AST node,
407      * applying substitutions. */

408     public ClassMember parseMember(String JavaDoc fmt, Object JavaDoc[] os) {
409         return (ClassMember) parse(fmt, list(os), MEMB);
410     }
411
412     /** Parse a string into a <code>ClassMember</code> AST node,
413      * applying substitutions. */

414     public ClassMember parseMember(String JavaDoc fmt, List subst) {
415         return (ClassMember) parse(fmt, subst, MEMB);
416     }
417
418     /** Parse a string into a <code>Expr</code> AST node,
419      * applying substitutions. */

420     public Expr parseExpr(String JavaDoc fmt) {
421         return (Expr) parse(fmt, list(), EXPR);
422     }
423
424     /** Parse a string into a <code>Expr</code> AST node,
425      * applying substitutions. */

426     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1) {
427         return (Expr) parse(fmt, list(o1), EXPR);
428     }
429
430     /** Parse a string into a <code>Expr</code> AST node,
431      * applying substitutions. */

432     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2) {
433         return (Expr) parse(fmt, list(o1, o2), EXPR);
434     }
435
436     /** Parse a string into a <code>Expr</code> AST node,
437      * applying substitutions. */

438     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
439         return (Expr) parse(fmt, list(o1, o2, o3), EXPR);
440     }
441
442     /** Parse a string into a <code>Expr</code> AST node,
443      * applying substitutions. */

444     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
445         Object JavaDoc o4)
446     {
447         return (Expr) parse(fmt, list(o1, o2, o3, o4), EXPR);
448     }
449
450     /** Parse a string into a <code>Expr</code> AST node,
451      * applying substitutions. */

452     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
453         Object JavaDoc o4, Object JavaDoc o5)
454     {
455         return (Expr) parse(fmt, list(o1, o2, o3, o4, o5), EXPR);
456     }
457
458     /** Parse a string into a <code>Expr</code> AST node,
459      * applying substitutions. */

460     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
461         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6)
462     {
463         return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6), EXPR);
464     }
465
466     /** Parse a string into a <code>Expr</code> AST node,
467      * applying substitutions. */

468     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
469         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7)
470     {
471         return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), EXPR);
472     }
473
474     /** Parse a string into a <code>Expr</code> AST node,
475      * applying substitutions. */

476     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
477         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8)
478        
479     {
480         return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), EXPR);
481     }
482
483     /** Parse a string into a <code>Expr</code> AST node,
484      * applying substitutions. */

485     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
486         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9)
487        
488     {
489         return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), EXPR);
490     }
491
492     /** Parse a string into a <code>Expr</code> AST node,
493      * applying substitutions. */

494     public Expr parseExpr(String JavaDoc fmt, Object JavaDoc[] os) {
495         return (Expr) parse(fmt, list(os), EXPR);
496     }
497
498     /** Parse a string into a <code>Expr</code> AST node,
499      * applying substitutions. */

500     public Expr parseExpr(String JavaDoc fmt, List subst) {
501         return (Expr) parse(fmt, subst, EXPR);
502     }
503
504     /** Parse a string into a <code>Stmt</code> AST node,
505      * applying substitutions. */

506     public Stmt parseStmt(String JavaDoc fmt) {
507         return (Stmt) parse(fmt, list(), STMT);
508     }
509
510     /** Parse a string into a <code>Stmt</code> AST node,
511      * applying substitutions. */

512     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1) {
513         return (Stmt) parse(fmt, list(o1), STMT);
514     }
515
516     /** Parse a string into a <code>Stmt</code> AST node,
517      * applying substitutions. */

518     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2) {
519         return (Stmt) parse(fmt, list(o1, o2), STMT);
520     }
521
522     /** Parse a string into a <code>Stmt</code> AST node,
523      * applying substitutions. */

524     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
525         return (Stmt) parse(fmt, list(o1, o2, o3), STMT);
526     }
527
528     /** Parse a string into a <code>Stmt</code> AST node,
529      * applying substitutions. */

530     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
531         Object JavaDoc o4)
532     {
533         return (Stmt) parse(fmt, list(o1, o2, o3, o4), STMT);
534     }
535
536     /** Parse a string into a <code>Stmt</code> AST node,
537      * applying substitutions. */

538     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
539         Object JavaDoc o4, Object JavaDoc o5)
540     {
541         return (Stmt) parse(fmt, list(o1, o2, o3, o4, o5), STMT);
542     }
543
544     /** Parse a string into a <code>Stmt</code> AST node,
545      * applying substitutions. */

546     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
547         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6)
548     {
549         return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6), STMT);
550     }
551
552     /** Parse a string into a <code>Stmt</code> AST node,
553      * applying substitutions. */

554     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
555         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7)
556     {
557         return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), STMT);
558     }
559
560     /** Parse a string into a <code>Stmt</code> AST node,
561      * applying substitutions. */

562     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
563         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8)
564        
565     {
566         return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), STMT);
567     }
568
569     /** Parse a string into a <code>Stmt</code> AST node,
570      * applying substitutions. */

571     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
572         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9)
573        
574     {
575         return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), STMT);
576     }
577
578     /** Parse a string into a <code>Stmt</code> AST node,
579      * applying substitutions. */

580     public Stmt parseStmt(String JavaDoc fmt, Object JavaDoc[] os) {
581         return (Stmt) parse(fmt, list(os), STMT);
582     }
583
584     /** Parse a string into a <code>Stmt</code> AST node,
585      * applying substitutions. */

586     public Stmt parseStmt(String JavaDoc fmt, List subst) {
587         return (Stmt) parse(fmt, subst, STMT);
588     }
589
590     /** Parse a string into a <code>TypeNode</code> AST node,
591      * applying substitutions. */

592     public TypeNode parseType(String JavaDoc fmt) {
593         return (TypeNode) parse(fmt, list(), TYPE);
594     }
595
596     /** Parse a string into a <code>TypeNode</code> AST node,
597      * applying substitutions. */

598     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1) {
599         return (TypeNode) parse(fmt, list(o1), TYPE);
600     }
601
602     /** Parse a string into a <code>TypeNode</code> AST node,
603      * applying substitutions. */

604     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2) {
605         return (TypeNode) parse(fmt, list(o1, o2), TYPE);
606     }
607
608     /** Parse a string into a <code>TypeNode</code> AST node,
609      * applying substitutions. */

610     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3) {
611         return (TypeNode) parse(fmt, list(o1, o2, o3), TYPE);
612     }
613
614     /** Parse a string into a <code>TypeNode</code> AST node,
615      * applying substitutions. */

616     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
617         Object JavaDoc o4)
618     {
619         return (TypeNode) parse(fmt, list(o1, o2, o3, o4), TYPE);
620     }
621
622     /** Parse a string into a <code>TypeNode</code> AST node,
623      * applying substitutions. */

624     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
625         Object JavaDoc o4, Object JavaDoc o5)
626     {
627         return (TypeNode) parse(fmt, list(o1, o2, o3, o4, o5), TYPE);
628     }
629
630     /** Parse a string into a <code>TypeNode</code> AST node,
631      * applying substitutions. */

632     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
633         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6)
634     {
635         return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6), TYPE);
636     }
637
638     /** Parse a string into a <code>TypeNode</code> AST node,
639      * applying substitutions. */

640     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
641         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7)
642     {
643         return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), TYPE);
644     }
645
646     /** Parse a string into a <code>TypeNode</code> AST node,
647      * applying substitutions. */

648     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
649         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8)
650        
651     {
652         return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), TYPE);
653     }
654
655     /** Parse a string into a <code>TypeNode</code> AST node,
656      * applying substitutions. */

657     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc o1, Object JavaDoc o2, Object JavaDoc o3,
658         Object JavaDoc o4, Object JavaDoc o5, Object JavaDoc o6, Object JavaDoc o7, Object JavaDoc o8, Object JavaDoc o9)
659        
660     {
661         return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), TYPE);
662     }
663
664     /** Parse a string into a <code>TypeNode</code> AST node,
665      * applying substitutions. */

666     public TypeNode parseType(String JavaDoc fmt, Object JavaDoc[] os) {
667         return (TypeNode) parse(fmt, list(os), TYPE);
668     }
669
670     /** Parse a string into a <code>TypeNode</code> AST node,
671      * applying substitutions. */

672     public TypeNode parseType(String JavaDoc fmt, List subst) {
673         return (TypeNode) parse(fmt, subst, TYPE);
674     }
675
676     /** Create a lexer that performs the substitutions in <code>subst</code>. */
677     protected Lexer lexer(String JavaDoc fmt, Position pos, List subst) {
678         return new polyglot.ext.jl.qq.Lexer_c(fmt, pos, subst);
679     }
680
681     /** Create a quasiquoting parser. */
682     protected QQParser parser(Lexer lexer, TypeSystem ts, NodeFactory nf, ErrorQueue eq) {
683         return new polyglot.ext.jl.qq.Grm(lexer, ts, nf, eq);
684     }
685
686     /** Parse a string into an AST node of the given type,
687      * applying substitutions. */

688     protected Node parse(String JavaDoc fmt, List subst, int kind) {
689         TypeSystem ts = ext.typeSystem();
690         NodeFactory nf = ext.nodeFactory();
691         ErrorQueue eq = ext.compiler().errorQueue();
692
693         // Replace Types with TypeNodes
694
for (ListIterator i = subst.listIterator(); i.hasNext(); ) {
695             Object JavaDoc o = i.next();
696
697             if (o instanceof Type) {
698                 Type t = (Type) o;
699                 i.set(nf.CanonicalTypeNode(t.position(), t));
700             }
701             else if (o instanceof List) {
702                 List l = (List) o;
703
704                 for (ListIterator j = l.listIterator(); j.hasNext(); ) {
705                     Object JavaDoc p = j.next();
706
707                     if (p instanceof Type) {
708                         Type t = (Type) p;
709                         j.set(nf.CanonicalTypeNode(t.position(), t));
710                     }
711                 }
712             }
713         }
714
715         Position pos = this.pos;
716
717         if (pos == Position.COMPILER_GENERATED) {
718             // this method is frame 1
719
// parseXXX is frame 2
720
// the client of QQ is frame 3
721
pos = Position.compilerGenerated(3);
722         }
723
724         polyglot.lex.Lexer lexer = lexer(fmt, pos, subst);
725         QQParser grm = parser(lexer, ts, nf, eq);
726
727         if (Report.should_report(polyglot.ext.jl.Topics.qq, 1)) {
728         Report.report(1, "qq: " + fmt);
729         Report.report(1, "subst: " + subst);
730     }
731
732         try {
733             java_cup.runtime.Symbol sym;
734
735             switch (kind) {
736                 case EXPR:
737                     sym = grm.qq_expr();
738                     break;
739                 case STMT:
740                     sym = grm.qq_stmt();
741                     break;
742                 case TYPE:
743                     sym = grm.qq_type();
744                     break;
745                 case MEMB:
746                     sym = grm.qq_member();
747                     break;
748                 case DECL:
749                     sym = grm.qq_decl();
750                     break;
751                 case FILE:
752                     sym = grm.qq_file();
753                     break;
754                 default:
755                     throw new QQError("bad quasi-quoting kind: " + kind, pos);
756             }
757
758             if (sym != null && sym.value instanceof Node) {
759                 Node n = (Node) sym.value;
760                 if (Report.should_report(polyglot.ext.jl.Topics.qq, 1))
761             Report.report(1, "result: " + n);
762                 return n;
763             }
764
765             throw new QQError("Unable to parse: \"" + fmt + "\".", pos);
766         }
767         catch (IOException e) {
768             throw new QQError("Unable to parse: \"" + fmt + "\".", pos);
769         }
770         catch (RuntimeException JavaDoc e) {
771             throw e;
772         }
773         catch (Exception JavaDoc e) {
774             // Used by cup to indicate a non-recoverable error.
775
throw new QQError("Unable to parse: \"" + fmt + "\"; " +
776                               e.getMessage(), pos);
777         }
778     }
779 }
780
Popular Tags