< prev index next >

src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Parser.java

Print this page
rev 52890 : 8223904: Improve Nashorn matching
Reviewed-by: jlaskey, sundar, mschoene, rhalade


 435         final Node target = parseSubExp(term);
 436 
 437         if (node.getType() == NodeType.ANCHOR) {
 438             final AnchorNode an = (AnchorNode) node;
 439             an.setTarget(target);
 440         } else {
 441             final EncloseNode en = (EncloseNode)node;
 442             en.setTarget(target);
 443             if (en.type == EncloseType.MEMORY) {
 444                 /* Don't move this to previous of parse_subexp() */
 445                 env.setMemNode(en.regNum, node);
 446             }
 447         }
 448         returnCode = 0;
 449         return node; // ??
 450     }
 451 
 452     private Node parseExp(final TokenType term) {
 453         if (token.type == term)
 454          {
 455             return StringNode.EMPTY; // goto end_of_token
 456         }
 457 
 458         Node node = null;
 459         boolean group = false;
 460 
 461         switch(token.type) {
 462         case ALT:
 463         case EOT:
 464             return StringNode.EMPTY; // end_of_token:, node_new_empty
 465 
 466         case SUBEXP_OPEN:
 467             node = parseEnclose(TokenType.SUBEXP_CLOSE);
 468             if (returnCode == 1) {
 469                 group = true;
 470             } else if (returnCode == 2) { /* option only */
 471                 final int prev = env.option;
 472                 final EncloseNode en = (EncloseNode)node;
 473                 env.option = en.option;
 474                 fetchToken();
 475                 final Node target = parseSubExp(term);
 476                 env.option = prev;
 477                 en.setTarget(target);
 478                 return node;
 479             }
 480             break;
 481         case SUBEXP_CLOSE:
 482             if (!syntax.allowUnmatchedCloseSubexp()) {
 483                 throw new SyntaxException(ERR_UNMATCHED_CLOSE_PARENTHESIS);
 484             }


 552             final QuantifierNode qn = new QuantifierNode(0, QuantifierNode.REPEAT_INFINITE, false);
 553             qn.setTarget(node);
 554             node = qn;
 555             break;
 556 
 557         case BACKREF:
 558             final int backRef = token.getBackrefRef();
 559             node = new BackRefNode(backRef, env);
 560             break;
 561 
 562         case ANCHOR:
 563             node = new AnchorNode(token.getAnchor()); // possible bug in oniguruma
 564             break;
 565 
 566         case OP_REPEAT:
 567         case INTERVAL:
 568             if (syntax.contextIndepRepeatOps()) {
 569                 if (syntax.contextInvalidRepeatOps()) {
 570                     throw new SyntaxException(ERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED);
 571                 }
 572                 node = StringNode.EMPTY; // node_new_empty
 573             } else {
 574                 return parseExpTkByte(group); // goto tk_byte
 575             }
 576             break;
 577 
 578         default:
 579             throw new InternalException(ERR_PARSER_BUG);
 580         } //switch
 581 
 582         //targetp = node;
 583 
 584         fetchToken(); // re_entry:
 585 
 586         return parseExpRepeat(node, group); // repeat:
 587     }
 588 
 589     private Node parseExpTkByte(final boolean group) {
 590         final StringNode node = new StringNode(chars, token.backP, p); // tk_byte:
 591         while (true) {
 592             fetchToken();




 435         final Node target = parseSubExp(term);
 436 
 437         if (node.getType() == NodeType.ANCHOR) {
 438             final AnchorNode an = (AnchorNode) node;
 439             an.setTarget(target);
 440         } else {
 441             final EncloseNode en = (EncloseNode)node;
 442             en.setTarget(target);
 443             if (en.type == EncloseType.MEMORY) {
 444                 /* Don't move this to previous of parse_subexp() */
 445                 env.setMemNode(en.regNum, node);
 446             }
 447         }
 448         returnCode = 0;
 449         return node; // ??
 450     }
 451 
 452     private Node parseExp(final TokenType term) {
 453         if (token.type == term)
 454          {
 455             return StringNode.createEmpty(); // goto end_of_token
 456         }
 457 
 458         Node node = null;
 459         boolean group = false;
 460 
 461         switch(token.type) {
 462         case ALT:
 463         case EOT:
 464             return StringNode.createEmpty(); // end_of_token:, node_new_empty
 465 
 466         case SUBEXP_OPEN:
 467             node = parseEnclose(TokenType.SUBEXP_CLOSE);
 468             if (returnCode == 1) {
 469                 group = true;
 470             } else if (returnCode == 2) { /* option only */
 471                 final int prev = env.option;
 472                 final EncloseNode en = (EncloseNode)node;
 473                 env.option = en.option;
 474                 fetchToken();
 475                 final Node target = parseSubExp(term);
 476                 env.option = prev;
 477                 en.setTarget(target);
 478                 return node;
 479             }
 480             break;
 481         case SUBEXP_CLOSE:
 482             if (!syntax.allowUnmatchedCloseSubexp()) {
 483                 throw new SyntaxException(ERR_UNMATCHED_CLOSE_PARENTHESIS);
 484             }


 552             final QuantifierNode qn = new QuantifierNode(0, QuantifierNode.REPEAT_INFINITE, false);
 553             qn.setTarget(node);
 554             node = qn;
 555             break;
 556 
 557         case BACKREF:
 558             final int backRef = token.getBackrefRef();
 559             node = new BackRefNode(backRef, env);
 560             break;
 561 
 562         case ANCHOR:
 563             node = new AnchorNode(token.getAnchor()); // possible bug in oniguruma
 564             break;
 565 
 566         case OP_REPEAT:
 567         case INTERVAL:
 568             if (syntax.contextIndepRepeatOps()) {
 569                 if (syntax.contextInvalidRepeatOps()) {
 570                     throw new SyntaxException(ERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED);
 571                 }
 572                 node = StringNode.createEmpty(); // node_new_empty
 573             } else {
 574                 return parseExpTkByte(group); // goto tk_byte
 575             }
 576             break;
 577 
 578         default:
 579             throw new InternalException(ERR_PARSER_BUG);
 580         } //switch
 581 
 582         //targetp = node;
 583 
 584         fetchToken(); // re_entry:
 585 
 586         return parseExpRepeat(node, group); // repeat:
 587     }
 588 
 589     private Node parseExpTkByte(final boolean group) {
 590         final StringNode node = new StringNode(chars, token.backP, p); // tk_byte:
 591         while (true) {
 592             fetchToken();


< prev index next >