private void fetchEscapedValue() { if (!left()) newSyntaxException(END_PATTERN_AT_ESCAPE); fetch(); if (!left()) newSyntaxException(END_PATTERN_AT_META); fetch(); if (c != '-') newSyntaxException(META_CODE_SYNTAX); if (!left()) newSyntaxException(END_PATTERN_AT_META); fetch(); if (c == syntax.metaCharTable.esc) fetchEscapedValue(); c = ((c & 0xff) | 0x80); } else { fetchEscapedValueBackSlash(); if (!left()) newSyntaxException(END_PATTERN_AT_CONTROL); fetch(); if (c != '-') newSyntaxException(CONTROL_CODE_SYNTAX); fetchEscapedValueControl(); } else { fetchEscapedValueBackSlash(); fetchEscapedValueControl(); fetchEscapedValueBackSlash();
private int fetchNameTeardown(int src, int endCode, int nameEnd, String err) { while (left()) { nameEnd = p; fetch(); if (c == endCode || c == ')') break; } if (!left()) nameEnd = stop; return fetchNameErr(src, nameEnd, err); }
protected final int fetchName(int startCode, boolean ref) { if (Config.USE_NAMED_GROUP) { return fetchNameForNamedGroup(startCode, ref); } else { return fetchNameForNoNamedGroup(startCode, ref); } }
private void fetchTokenFor_NamedBackref() { if (Config.USE_NAMED_GROUP) { if (syntax.op2EscKNamedBackref() && left()) { fetch(); if (c =='<' || c == '\'') { fetchNamedBackrefToken(); } else { unfetch(); syntaxWarn("invalid back reference"); } } } }
private void fetchEscapedValueControl() { if (!left()) { if (syntax.op3OptionECMAScript()) { return; } else { newSyntaxException(END_PATTERN_AT_CONTROL); } } fetch(); if (c == '?') { c = 0177; } else { if (c == syntax.metaCharTable.esc) fetchEscapedValue(); c &= 0x9f; } }
if (!left()) { token.type = TokenType.EOT; return; fetch(); if (!left()) newSyntaxException(END_PATTERN_AT_ESCAPE); fetch(); if (syntax.opEscAsteriskZeroInf()) fetchTokenFor_repeat(0, QuantifierNode.REPEAT_INFINITE); break; case '+': if (syntax.opEscPlusOneInf()) fetchTokenFor_repeat(1, QuantifierNode.REPEAT_INFINITE); break; case '?': if (syntax.opEscQMarkZeroOne()) fetchTokenFor_repeat(0, 1); break; case '{': if (syntax.opEscBraceInterval()) fetchTokenFor_openBrace(); break; case '|': break; case 'w': if (syntax.opEscWWord()) fetchTokenInCCFor_charType(false, CharacterType.WORD); break; case 'W': if (syntax.opEscWWord()) fetchTokenInCCFor_charType(true, CharacterType.WORD);
protected final TokenType fetchTokenInCC() { if (!left()) { token.type = TokenType.EOT; return token.type; fetch(); token.type = TokenType.CHAR; token.base = 0; } else if (c == syntax.metaCharTable.esc) { if (!syntax.backSlashEscapeInCC()) return token.type; if (!left()) newSyntaxException(END_PATTERN_AT_ESCAPE); fetch(); token.escaped = true; token.setC(c); fetchTokenInCCFor_charType(false, CharacterType.WORD); break; case 'W': fetchTokenInCCFor_charType(true, CharacterType.WORD); break; case 'd': fetchTokenInCCFor_charType(false, CharacterType.DIGIT); break; case 'D': fetchTokenInCCFor_charType(true, CharacterType.DIGIT); break; case 's': fetchTokenInCCFor_charType(false, CharacterType.SPACE); break;
int endCode = nameEndCodePoint(startCode); int pnumHead = p; int nameEnd = stop; if (!left()) { newValueException(EMPTY_GROUP_NAME); } else { fetch(); if (c == endCode) newValueException(EMPTY_GROUP_NAME); while(left()) { nameEnd = p; fetch(); if (c == endCode || c == ')') break; if (!enc.isDigit(c)) err = INVALID_CHAR_IN_GROUP_NAME; mark(); p = pnumHead; int backNum = scanUnsignedNumber(); restore(); if (backNum < 0) { newValueException(TOO_BIG_NUMBER); } else if (backNum == 0){ newValueException(INVALID_GROUP_NAME, src, nameEnd); return backNum; } else { newValueException(err, src, nameEnd);
private void fetchTokenFor_subexpCall() { if (Config.USE_NAMED_GROUP) { if (syntax.op2EscGBraceBackref() && left()) { fetch(); if (c == '{') { fetchNamedBackrefToken(); } else { unfetch(); if (syntax.op2EscGSubexpCall() && left()) { fetch(); if (c == '<' || c == '\'') { int gNum = -1; boolean rel = false; int cnext = peek(); int nameEnd = 0; if (cnext == '0') { inc(); if (peekIs(nameEndCodePoint(c))) { /* \g<0>, \g'0' */ inc(); nameEnd = p; gNum = 0; inc(); rel = true; gNum = fetchName(c, true); nameEnd = value; token.setCallRel(rel);
mark(); boolean synAllow = syntax.allowInvalidInterval(); if (!left()) { if (synAllow) { return 1; /* "....{" : OK! */ } else { newSyntaxException(END_PATTERN_AT_LEFT_BRACE); c = peek(); if (c == ')' || c == '(' || c == '|') { newSyntaxException(END_PATTERN_AT_LEFT_BRACE); int low = scanUnsignedNumber(); if (low < 0) newSyntaxException(ErrorMessages.TOO_BIG_NUMBER_FOR_REPEAT_RANGE); if (low > Config.MAX_REPEAT_NUM) newSyntaxException(ErrorMessages.TOO_BIG_NUMBER_FOR_REPEAT_RANGE); nonLow = true; } else { return invalidRangeQuantifier(synAllow); if (!left()) return invalidRangeQuantifier(synAllow); fetch(); int up; int ret = 0; if (c == ',') { int prev = p; // ??? last up = scanUnsignedNumber();
int endCode = nameEndCodePoint(startCode); int pnumHead = p; int nameEnd = stop; if (!left()) { newValueException(EMPTY_GROUP_NAME); } else { fetch(); if (c == endCode) newValueException(EMPTY_GROUP_NAME); if (enc.isDigit(c)) { if (ref) { while (left()) { nameEnd = p; fetch(); if (c == endCode || c == ')') { if (isNum == 2) { err = INVALID_GROUP_NAME; return fetchNameTeardown(src, endCode, nameEnd, err); return fetchNameTeardown(src, endCode, nameEnd, err); err = INVALID_GROUP_NAME; nameEnd = stop; return fetchNameErr(src, nameEnd, err); mark(); p = pnumHead; backNum = scanUnsignedNumber();
private void fetchTokenFor_charProperty() { if (peekIs('{') && syntax.op2EscPBraceCharProperty()) { inc(); token.type = TokenType.CHAR_PROPERTY; token.setPropNot(c == 'P'); if (syntax.op2EscPBraceCircumflexNot()) { fetch(); if (c == '^') { token.setPropNot(!token.getPropNot()); } else { unfetch(); } } } else { syntaxWarn("invalid Unicode Property \\<%n>", (char)c); } }
private void greedyCheck() { if (left() && peekIs('?') && syntax.opQMarkNonGreedy()) { fetch(); token.setRepeatGreedy(false); token.setRepeatPossessive(false); } else { possessiveCheck(); } }
protected final int fetchCharPropertyToCType() { mark(); while (left()) { int last = p; fetch(); if (c == '}') { return enc.propertyNameToCType(bytes, _p, last); } else if (c == '(' || c == ')' || c == '{' || c == '|') { throw new CharacterPropertyException(EncodingError.ERR_INVALID_CHAR_PROPERTY_NAME, bytes, _p, last); } } newInternalException(PARSER_BUG); return 0; // not reached }
Ptr rbackNum = new Ptr(); Ptr rlevel = new Ptr(); token.setBackrefExistLevel(fetchNameWithLevel(c, rbackNum, rlevel)); token.setBackrefLevel(rlevel.p); backNum = rbackNum.p; } else { backNum = fetchName(c, true); backNum = backrefRelToAbs(backNum); if (backNum <= 0) newValueException(INVALID_BACKREF); newValueException(INVALID_BACKREF); } else { NameEntry e = regex.nameToGroupNumbers(bytes, last, nameEnd); if (e == null) newValueException(UNDEFINED_NAME_REFERENCE, last, nameEnd); if (e.backRef1 > env.numMem || env.memNodes == null || env.memNodes[e.backRef1] == null) newValueException(INVALID_BACKREF); } else { for (int i=0; i<e.backNum; i++) { if (e.backRefs[i] > env.numMem || env.memNodes == null || env.memNodes[e.backRefs[i]] == null) newValueException(INVALID_BACKREF);
private void possessiveCheck() { if (left() && peekIs('+') && (syntax.op2PlusPossessiveRepeat() && token.type != TokenType.INTERVAL || syntax.op2PlusPossessiveInterval() && token.type == TokenType.INTERVAL)) { fetch(); token.setRepeatGreedy(true); token.setRepeatPossessive(true); } else { token.setRepeatGreedy(true); token.setRepeatPossessive(false); } }
if (!left()) { token.type = TokenType.EOT; return; fetch(); if (!left()) newSyntaxException(END_PATTERN_AT_ESCAPE); fetch(); if (syntax.opEscAsteriskZeroInf()) fetchTokenFor_repeat(0, QuantifierNode.REPEAT_INFINITE); break; case '+': if (syntax.opEscPlusOneInf()) fetchTokenFor_repeat(1, QuantifierNode.REPEAT_INFINITE); break; case '?': if (syntax.opEscQMarkZeroOne()) fetchTokenFor_repeat(0, 1); break; case '{': if (syntax.opEscBraceInterval()) fetchTokenFor_openBrace(); break; case '|': break; case 'w': if (syntax.opEscWWord()) fetchTokenInCCFor_charType(false, CharacterType.WORD); break; case 'W': if (syntax.opEscWWord()) fetchTokenInCCFor_charType(true, CharacterType.WORD);
protected final TokenType fetchTokenInCC() { if (!left()) { token.type = TokenType.EOT; return token.type; fetch(); token.type = TokenType.CHAR; token.base = 0; } else if (c == syntax.metaCharTable.esc) { if (!syntax.backSlashEscapeInCC()) return token.type; if (!left()) newSyntaxException(END_PATTERN_AT_ESCAPE); fetch(); token.escaped = true; token.setC(c); fetchTokenInCCFor_charType(false, CharacterType.WORD); break; case 'W': fetchTokenInCCFor_charType(true, CharacterType.WORD); break; case 'd': fetchTokenInCCFor_charType(false, CharacterType.DIGIT); break; case 'D': fetchTokenInCCFor_charType(true, CharacterType.DIGIT); break; case 's': fetchTokenInCCFor_charType(false, CharacterType.SPACE); break;
int endCode = nameEndCodePoint(startCode); int pnumHead = p; int nameEnd = stop; if (!left()) { newValueException(EMPTY_GROUP_NAME); } else { fetch(); if (c == endCode) newValueException(EMPTY_GROUP_NAME); while(left()) { nameEnd = p; fetch(); if (c == endCode || c == ')') break; if (!enc.isDigit(c)) err = INVALID_CHAR_IN_GROUP_NAME; mark(); p = pnumHead; int backNum = scanUnsignedNumber(); restore(); if (backNum < 0) { newValueException(TOO_BIG_NUMBER); } else if (backNum == 0){ newValueException(INVALID_GROUP_NAME, src, nameEnd); return backNum; } else { newValueException(err, src, nameEnd);
private void fetchTokenFor_subexpCall() { if (Config.USE_NAMED_GROUP) { if (syntax.op2EscGBraceBackref() && left()) { fetch(); if (c == '{') { fetchNamedBackrefToken(); } else { unfetch(); if (syntax.op2EscGSubexpCall() && left()) { fetch(); if (c == '<' || c == '\'') { int gNum = -1; boolean rel = false; int cnext = peek(); int nameEnd = 0; if (cnext == '0') { inc(); if (peekIs(nameEndCodePoint(c))) { /* \g<0>, \g'0' */ inc(); nameEnd = p; gNum = 0; inc(); rel = true; gNum = fetchName(c, true); nameEnd = value; token.setCallRel(rel);