Added ability to parse nested character classes while using v flag.

This commit is contained in:
Napalys
2025-03-02 17:14:08 +01:00
parent de6f3b1d04
commit 2333c538d9
2 changed files with 114 additions and 146 deletions

View File

@@ -545,6 +545,7 @@ public class RegExpParser {
}
private RegExpTerm parseCharacterClass() {
if (flags != null && flags.contains("v")) return parseNestedCharacterClass();
SourceLocation loc = new SourceLocation(pos());
List<RegExpTerm> elements = new ArrayList<>();
@@ -560,6 +561,28 @@ public class RegExpParser {
return this.finishTerm(new CharacterClass(loc, elements, inverted));
}
// ECMA 2024 `v` flag allows nested character classes.
private RegExpTerm parseNestedCharacterClass() {
SourceLocation loc = new SourceLocation(pos());
List<RegExpTerm> elements = new ArrayList<>();
this.match("[");
boolean inverted = this.match("^");
while (!this.match("]")) {
if (this.atEOS()) {
this.error(Error.EXPECTED_RBRACKET);
break;
}
if (lookahead("[")) {
elements.add(parseNestedCharacterClass());
}
else {
elements.add(this.parseCharacterClassElement());
}
}
return this.finishTerm(new CharacterClass(loc, elements, inverted));
}
private static final List<String> escapeClasses = Arrays.asList("d", "D", "s", "S", "w", "W");
private RegExpTerm parseCharacterClassElement() {