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 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 73 public QQ(ExtensionInfo ext) { 74 this(ext, Position.COMPILER_GENERATED); 75 } 76 77 80 public QQ(ExtensionInfo ext, Position pos) { 81 this.ext = ext; 82 this.pos = pos; 83 } 84 85 86 private List list() { return Collections.EMPTY_LIST; } 87 88 89 private List list(Object o1) { 90 return list(new Object [] { o1 }); 91 } 92 93 94 private List list(Object o1, Object o2) { 95 return list(new Object [] { o1, o2 }); 96 } 97 98 99 private List list(Object o1, Object o2, Object o3) { 100 return list(new Object [] { o1, o2, o3 }); 101 } 102 103 104 private List list(Object o1, Object o2, Object o3, Object o4) { 105 return list(new Object [] { o1, o2, o3, o4 }); 106 } 107 108 109 private List list(Object o1, Object o2, Object o3, Object o4, Object o5) { 110 return list(new Object [] { o1, o2, o3, o4, o5 }); 111 } 112 113 114 private List list(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6) { 115 return list(new Object [] { o1, o2, o3, o4, o5, o6 }); 116 } 117 118 119 private List list(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7) { 120 return list(new Object [] { o1, o2, o3, o4, o5, o6, o7 }); 121 } 122 123 124 private List list(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8) { 125 return list(new Object [] { o1, o2, o3, o4, o5, o6, o7, o8 }); 126 } 127 128 129 private List list(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) { 130 return list(new Object [] { o1, o2, o3, o4, o5, o6, o7, o8, o9 }); 131 } 132 133 134 private List list(Object [] os) { 135 return Arrays.asList(os); 136 } 137 138 142 public SourceFile parseFile(String fmt) { 143 return (SourceFile) parse(fmt, list(), FILE); 144 } 145 146 150 public SourceFile parseFile(String fmt, Object o1) { 151 return (SourceFile) parse(fmt, list(o1), FILE); 152 } 153 154 158 public SourceFile parseFile(String fmt, Object o1, Object o2) { 159 return (SourceFile) parse(fmt, list(o1, o2), FILE); 160 } 161 162 166 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3) { 167 return (SourceFile) parse(fmt, list(o1, o2, o3), FILE); 168 } 169 170 174 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3, 175 Object o4) 176 { 177 return (SourceFile) parse(fmt, list(o1, o2, o3, o4), FILE); 178 } 179 180 184 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3, 185 Object o4, Object o5) 186 { 187 return (SourceFile) parse(fmt, list(o1, o2, o3, o4, o5), FILE); 188 } 189 190 194 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3, 195 Object o4, Object o5, Object o6) 196 { 197 return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6), FILE); 198 } 199 200 204 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3, 205 Object o4, Object o5, Object o6, Object o7) 206 { 207 return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), FILE); 208 } 209 210 214 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3, 215 Object o4, Object o5, Object o6, Object o7, Object o8) 216 { 217 return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), FILE); 218 } 219 220 224 public SourceFile parseFile(String fmt, Object o1, Object o2, Object o3, 225 Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) 226 { 227 return (SourceFile) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), FILE); 228 } 229 230 234 public SourceFile parseFile(String fmt, Object [] os) { 235 return (SourceFile) parse(fmt, list(os), FILE); 236 } 237 238 242 public SourceFile parseFile(String fmt, List subst) { 243 return (SourceFile) parse(fmt, subst, FILE); 244 } 245 246 248 public ClassDecl parseDecl(String fmt) { 249 return (ClassDecl) parse(fmt, list(), DECL); 250 } 251 252 254 public ClassDecl parseDecl(String fmt, Object o1) { 255 return (ClassDecl) parse(fmt, list(o1), DECL); 256 } 257 258 260 public ClassDecl parseDecl(String fmt, Object o1, Object o2) { 261 return (ClassDecl) parse(fmt, list(o1, o2), DECL); 262 } 263 264 266 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3) { 267 return (ClassDecl) parse(fmt, list(o1, o2, o3), DECL); 268 } 269 270 272 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3, 273 Object o4) 274 { 275 return (ClassDecl) parse(fmt, list(o1, o2, o3, o4), DECL); 276 } 277 278 280 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3, 281 Object o4, Object o5) 282 { 283 return (ClassDecl) parse(fmt, list(o1, o2, o3, o4, o5), DECL); 284 } 285 286 288 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3, 289 Object o4, Object o5, Object o6) 290 { 291 return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6), DECL); 292 } 293 294 296 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3, 297 Object o4, Object o5, Object o6, Object o7) 298 { 299 return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), DECL); 300 } 301 302 304 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3, 305 Object o4, Object o5, Object o6, Object o7, Object o8) 306 307 { 308 return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), DECL); 309 } 310 311 313 public ClassDecl parseDecl(String fmt, Object o1, Object o2, Object o3, 314 Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) 315 316 { 317 return (ClassDecl) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), DECL); 318 } 319 320 322 public ClassDecl parseDecl(String fmt, Object [] os) { 323 return (ClassDecl) parse(fmt, list(os), DECL); 324 } 325 326 328 public ClassDecl parseDecl(String fmt, List subst) { 329 return (ClassDecl) parse(fmt, subst, DECL); 330 } 331 332 334 public ClassMember parseMember(String fmt) { 335 return (ClassMember) parse(fmt, list(), MEMB); 336 } 337 338 340 public ClassMember parseMember(String fmt, Object o1) { 341 return (ClassMember) parse(fmt, list(o1), MEMB); 342 } 343 344 346 public ClassMember parseMember(String fmt, Object o1, Object o2) { 347 return (ClassMember) parse(fmt, list(o1, o2), MEMB); 348 } 349 350 352 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3) { 353 return (ClassMember) parse(fmt, list(o1, o2, o3), MEMB); 354 } 355 356 358 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3, 359 Object o4) 360 { 361 return (ClassMember) parse(fmt, list(o1, o2, o3, o4), MEMB); 362 } 363 364 366 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3, 367 Object o4, Object o5) 368 { 369 return (ClassMember) parse(fmt, list(o1, o2, o3, o4, o5), MEMB); 370 } 371 372 374 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3, 375 Object o4, Object o5, Object o6) 376 { 377 return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6), MEMB); 378 } 379 380 382 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3, 383 Object o4, Object o5, Object o6, Object o7) 384 { 385 return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), MEMB); 386 } 387 388 390 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3, 391 Object o4, Object o5, Object o6, Object o7, Object o8) 392 393 { 394 return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), MEMB); 395 } 396 397 399 public ClassMember parseMember(String fmt, Object o1, Object o2, Object o3, 400 Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) 401 402 { 403 return (ClassMember) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), MEMB); 404 } 405 406 408 public ClassMember parseMember(String fmt, Object [] os) { 409 return (ClassMember) parse(fmt, list(os), MEMB); 410 } 411 412 414 public ClassMember parseMember(String fmt, List subst) { 415 return (ClassMember) parse(fmt, subst, MEMB); 416 } 417 418 420 public Expr parseExpr(String fmt) { 421 return (Expr) parse(fmt, list(), EXPR); 422 } 423 424 426 public Expr parseExpr(String fmt, Object o1) { 427 return (Expr) parse(fmt, list(o1), EXPR); 428 } 429 430 432 public Expr parseExpr(String fmt, Object o1, Object o2) { 433 return (Expr) parse(fmt, list(o1, o2), EXPR); 434 } 435 436 438 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3) { 439 return (Expr) parse(fmt, list(o1, o2, o3), EXPR); 440 } 441 442 444 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3, 445 Object o4) 446 { 447 return (Expr) parse(fmt, list(o1, o2, o3, o4), EXPR); 448 } 449 450 452 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3, 453 Object o4, Object o5) 454 { 455 return (Expr) parse(fmt, list(o1, o2, o3, o4, o5), EXPR); 456 } 457 458 460 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3, 461 Object o4, Object o5, Object o6) 462 { 463 return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6), EXPR); 464 } 465 466 468 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3, 469 Object o4, Object o5, Object o6, Object o7) 470 { 471 return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), EXPR); 472 } 473 474 476 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3, 477 Object o4, Object o5, Object o6, Object o7, Object o8) 478 479 { 480 return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), EXPR); 481 } 482 483 485 public Expr parseExpr(String fmt, Object o1, Object o2, Object o3, 486 Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) 487 488 { 489 return (Expr) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), EXPR); 490 } 491 492 494 public Expr parseExpr(String fmt, Object [] os) { 495 return (Expr) parse(fmt, list(os), EXPR); 496 } 497 498 500 public Expr parseExpr(String fmt, List subst) { 501 return (Expr) parse(fmt, subst, EXPR); 502 } 503 504 506 public Stmt parseStmt(String fmt) { 507 return (Stmt) parse(fmt, list(), STMT); 508 } 509 510 512 public Stmt parseStmt(String fmt, Object o1) { 513 return (Stmt) parse(fmt, list(o1), STMT); 514 } 515 516 518 public Stmt parseStmt(String fmt, Object o1, Object o2) { 519 return (Stmt) parse(fmt, list(o1, o2), STMT); 520 } 521 522 524 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3) { 525 return (Stmt) parse(fmt, list(o1, o2, o3), STMT); 526 } 527 528 530 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3, 531 Object o4) 532 { 533 return (Stmt) parse(fmt, list(o1, o2, o3, o4), STMT); 534 } 535 536 538 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3, 539 Object o4, Object o5) 540 { 541 return (Stmt) parse(fmt, list(o1, o2, o3, o4, o5), STMT); 542 } 543 544 546 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3, 547 Object o4, Object o5, Object o6) 548 { 549 return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6), STMT); 550 } 551 552 554 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3, 555 Object o4, Object o5, Object o6, Object o7) 556 { 557 return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), STMT); 558 } 559 560 562 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3, 563 Object o4, Object o5, Object o6, Object o7, Object o8) 564 565 { 566 return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), STMT); 567 } 568 569 571 public Stmt parseStmt(String fmt, Object o1, Object o2, Object o3, 572 Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) 573 574 { 575 return (Stmt) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), STMT); 576 } 577 578 580 public Stmt parseStmt(String fmt, Object [] os) { 581 return (Stmt) parse(fmt, list(os), STMT); 582 } 583 584 586 public Stmt parseStmt(String fmt, List subst) { 587 return (Stmt) parse(fmt, subst, STMT); 588 } 589 590 592 public TypeNode parseType(String fmt) { 593 return (TypeNode) parse(fmt, list(), TYPE); 594 } 595 596 598 public TypeNode parseType(String fmt, Object o1) { 599 return (TypeNode) parse(fmt, list(o1), TYPE); 600 } 601 602 604 public TypeNode parseType(String fmt, Object o1, Object o2) { 605 return (TypeNode) parse(fmt, list(o1, o2), TYPE); 606 } 607 608 610 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3) { 611 return (TypeNode) parse(fmt, list(o1, o2, o3), TYPE); 612 } 613 614 616 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3, 617 Object o4) 618 { 619 return (TypeNode) parse(fmt, list(o1, o2, o3, o4), TYPE); 620 } 621 622 624 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3, 625 Object o4, Object o5) 626 { 627 return (TypeNode) parse(fmt, list(o1, o2, o3, o4, o5), TYPE); 628 } 629 630 632 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3, 633 Object o4, Object o5, Object o6) 634 { 635 return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6), TYPE); 636 } 637 638 640 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3, 641 Object o4, Object o5, Object o6, Object o7) 642 { 643 return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7), TYPE); 644 } 645 646 648 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3, 649 Object o4, Object o5, Object o6, Object o7, Object o8) 650 651 { 652 return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8), TYPE); 653 } 654 655 657 public TypeNode parseType(String fmt, Object o1, Object o2, Object o3, 658 Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) 659 660 { 661 return (TypeNode) parse(fmt, list(o1, o2 , o3, o4, o5, o6, o7, o8, o9), TYPE); 662 } 663 664 666 public TypeNode parseType(String fmt, Object [] os) { 667 return (TypeNode) parse(fmt, list(os), TYPE); 668 } 669 670 672 public TypeNode parseType(String fmt, List subst) { 673 return (TypeNode) parse(fmt, subst, TYPE); 674 } 675 676 677 protected Lexer lexer(String fmt, Position pos, List subst) { 678 return new polyglot.ext.jl.qq.Lexer_c(fmt, pos, subst); 679 } 680 681 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 688 protected Node parse(String fmt, List subst, int kind) { 689 TypeSystem ts = ext.typeSystem(); 690 NodeFactory nf = ext.nodeFactory(); 691 ErrorQueue eq = ext.compiler().errorQueue(); 692 693 for (ListIterator i = subst.listIterator(); i.hasNext(); ) { 695 Object 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 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 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 e) { 771 throw e; 772 } 773 catch (Exception e) { 774 throw new QQError("Unable to parse: \"" + fmt + "\"; " + 776 e.getMessage(), pos); 777 } 778 } 779 } 780 | Popular Tags |