Skip to content

Commit

Permalink
Support \p 1-char char classes without curly braces
Browse files Browse the repository at this point in the history
  • Loading branch information
haozhun committed Mar 19, 2015
1 parent 005b574 commit 804f09c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 7 deletions.
21 changes: 15 additions & 6 deletions src/org/joni/Lexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,10 @@ private void fetchTokenFor_charProperty() {
unfetch();
}
}
} else if (syntax.op2EscPCharCharProperty()) {
token.type = TokenType.CHAR_PROPERTY;
token.setPropNot(c == 'P');
token.setPropSingleChar(true);
} else {
syntaxWarn(Warnings.INVALID_UNICODE_PROPERTY, (char)c);
}
Expand Down Expand Up @@ -1252,13 +1256,18 @@ private void possessiveCheck() {
protected final int fetchCharPropertyToCType() {
mark();

while (left()) {
int last = p;
if (token.getPropSingleChar()) {
fetch();
if (c == '}') {
return enc.propertyNameToCType(bytes, _p, last);
} else if (c == '(' || c == ')' || c == '{' || c == '|') {
throw new CharacterPropertyException(ERR_INVALID_CHAR_PROPERTY_NAME, bytes, _p, last);
return enc.propertyNameToCType(bytes, _p, p);
} else {
while (left()) {
int last = p;
fetch();
if (c == '}') {
return enc.propertyNameToCType(bytes, _p, last);
} else if (c == '(' || c == ')' || c == '{' || c == '|') {
throw new CharacterPropertyException(ERR_INVALID_CHAR_PROPERTY_NAME, bytes, _p, last);
}
}
}
newInternalException(ERR_PARSER_BUG);
Expand Down
8 changes: 7 additions & 1 deletion src/org/joni/Syntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,11 @@ public boolean op2OptionECMAScript() {
return isOp2(OP2_OPTION_ECMASCRIPT);
}

public boolean op2EscPCharCharProperty()
{
return isOp2(OP2_ESC_P_BRACE_CHAR_PROPERTY);
}

/**
* BEHAVIOR
*
Expand Down Expand Up @@ -535,7 +540,8 @@ public boolean warnReduntantNestedRepeat() {
OP2_OPTION_PERL | OP2_PLUS_POSSESSIVE_REPEAT |
OP2_PLUS_POSSESSIVE_INTERVAL | OP2_CCLASS_SET_OP |
OP2_ESC_V_VTAB | OP2_ESC_U_HEX4 |
OP2_ESC_P_BRACE_CHAR_PROPERTY ),
OP2_ESC_P_BRACE_CHAR_PROPERTY |
OP2_ESC_P_CHAR_CHAR_PROPERTY),

( GNU_REGEX_BV | DIFFERENT_LEN_ALT_LOOK_BEHIND ),

Expand Down
7 changes: 7 additions & 0 deletions src/org/joni/Token.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,11 @@ boolean getPropNot() {
void setPropNot(boolean not) {
INT2 = not ? 1 : 0;
}

boolean getPropSingleChar() {
return INT3 != 0;
}
void setPropSingleChar(boolean singleChar) {
INT3 = singleChar ? 1 : 0;
}
}
1 change: 1 addition & 0 deletions src/org/joni/constants/SyntaxProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public interface SyntaxProperties {
final int OP2_ESC_H_XDIGIT = (1<<19); /* \h, \H */
final int OP2_INEFFECTIVE_ESCAPE = (1<<20); /* \ */
final int OP2_OPTION_ECMASCRIPT = (1<<21); /* EcmaScript quirks */
final int OP2_ESC_P_CHAR_CHAR_PROPERTY = (1<<22); /* \pX, \PX */

/* syntax (behavior); */
final int CONTEXT_INDEP_ANCHORS = (1<<31); /* not implemented */
Expand Down

0 comments on commit 804f09c

Please sign in to comment.