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();
|