Skip to content

Commit

Permalink
feat: add support v flag (#82)
Browse files Browse the repository at this point in the history
  • Loading branch information
ota-meshi authored Jul 22, 2023
1 parent 773e6f9 commit 31dac9d
Show file tree
Hide file tree
Showing 62 changed files with 37,303 additions and 5,330 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,15 @@ Parse a regular expression literal.
- **Return:**
- The AST of the regular expression.

#### parser.parsePattern(source, start?, end?, uFlag?)
#### parser.parsePattern(source, start?, end?, flags?)

Parse a regular expression pattern.

- **Parameters:**
- `source` (`string`) The source code to parse. E.g. `"abc"`.
- `start?` (`number`) The start index in the source code. Default is `0`.
- `end?` (`number`) The end index in the source code. Default is `source.length`.
- `uFlag?` (`boolean`) The flag to enable Unicode mode.
- `flags?` (`{ unicode?: boolean, unicodeSets?: boolean }`) The flags to enable Unicode mode, and Unicode Set mode.
- **Return:**
- The AST of the regular expression pattern.

Expand Down Expand Up @@ -118,15 +118,15 @@ Validate a regular expression literal.
- `start?` (`number`) The start index in the source code. Default is `0`.
- `end?` (`number`) The end index in the source code. Default is `source.length`.

#### validator.validatePattern(source, start, end, uFlag)
#### validator.validatePattern(source, start, end, flags)

Validate a regular expression pattern.

- **Parameters:**
- `source` (`string`) The source code to validate.
- `start?` (`number`) The start index in the source code. Default is `0`.
- `end?` (`number`) The end index in the source code. Default is `source.length`.
- `uFlag?` (`boolean`) The flag to enable Unicode mode.
- `flags?` (`{ unicode?: boolean, unicodeSets?: boolean }`) The flags to enable Unicode mode, and Unicode Set mode.

#### validator.validateFlags(source, start, end)

Expand Down Expand Up @@ -172,6 +172,6 @@ Please use GitHub's Issues/PRs.
- `npm run watch` runs tests with `--watch` option.

[`AST.Node`]: src/ast.ts#L4
[`RegExpParser.Options`]: src/parser.ts#L539
[`RegExpValidator.Options`]: src/validator.ts#L127
[`RegExpVisitor.Handlers`]: src/visitor.ts#L204
[`RegExpParser.Options`]: src/parser.ts#L743
[`RegExpValidator.Options`]: src/validator.ts#L220
[`RegExpVisitor.Handlers`]: src/visitor.ts#L291
10 changes: 10 additions & 0 deletions scripts/update-fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,16 @@ for (const filename of Object.keys(Visitor.fixturesData)) {
onCharacterClassEnter: enter,
onCharacterClassRangeEnter: enter,
onCharacterSetEnter: enter,
onClassIntersectionEnter: enter,
onClassStringDisjunctionEnter: enter,
onClassSubtractionEnter: enter,
onExpressionCharacterClassEnter: enter,
onFlagsEnter: enter,
onGroupEnter: enter,
onPatternEnter: enter,
onQuantifierEnter: enter,
onRegExpLiteralEnter: enter,
onStringAlternativeEnter: enter,
onAlternativeLeave: leave,
onAssertionLeave: leave,
onBackreferenceLeave: leave,
Expand All @@ -60,11 +65,16 @@ for (const filename of Object.keys(Visitor.fixturesData)) {
onCharacterClassLeave: leave,
onCharacterClassRangeLeave: leave,
onCharacterSetLeave: leave,
onClassIntersectionLeave: leave,
onClassStringDisjunctionLeave: leave,
onClassSubtractionLeave: leave,
onExpressionCharacterClassLeave: leave,
onFlagsLeave: leave,
onGroupLeave: leave,
onPatternLeave: leave,
onQuantifierLeave: leave,
onRegExpLiteralLeave: leave,
onStringAlternativeLeave: leave,
})

fixture.patterns[pattern] = history
Expand Down
149 changes: 143 additions & 6 deletions src/ast.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,16 @@ export type BranchNode =
| CapturingGroup
| CharacterClass
| CharacterClassRange
| ClassIntersection
| ClassStringDisjunction
| ClassSubtraction
| ExpressionCharacterClass
| Group
| LookaroundAssertion
| Pattern
| Quantifier
| RegExpLiteral
| StringAlternative

/**
* The type which includes all leaf nodes.
Expand All @@ -41,17 +46,29 @@ export type QuantifiableElement =
| Character
| CharacterClass
| CharacterSet
| ExpressionCharacterClass
| Group
| LookaheadAssertion

/**
* The type which includes all character class atom nodes.
*/
export type CharacterClassElement =
| ClassRangesCharacterClassElement
| UnicodeSetsCharacterClassElement
export type ClassRangesCharacterClassElement =
| Character
| CharacterClassRange
| EscapeCharacterSet
| UnicodePropertyCharacterSet
export type UnicodeSetsCharacterClassElement =
| Character
| CharacterClassRange
| ClassStringDisjunction
| EscapeCharacterSet
| ExpressionCharacterClass
| UnicodePropertyCharacterSet
| UnicodeSetsCharacterClass

/**
* The type which defines common properties for all node types.
Expand Down Expand Up @@ -166,12 +183,35 @@ export interface Quantifier extends NodeBase {
* The character class.
* E.g. `[ab]`, `[^ab]`
*/
export interface CharacterClass extends NodeBase {
export type CharacterClass =
| ClassRangesCharacterClass
| UnicodeSetsCharacterClass
interface BaseCharacterClass extends NodeBase {
type: "CharacterClass"
parent: Alternative | Quantifier
parent:
| Alternative
| ExpressionCharacterClass
| Quantifier
| UnicodeSetsCharacterClass
unicodeSets: boolean
negate: boolean
elements: CharacterClassElement[]
}
export interface ClassRangesCharacterClass extends BaseCharacterClass {
parent: Alternative | Quantifier
unicodeSets: false
elements: ClassRangesCharacterClassElement[]
}
/** UnicodeSetsCharacterClass is the CharacterClass when in Unicode sets mode. So it may contain strings. */
export interface UnicodeSetsCharacterClass extends BaseCharacterClass {
parent:
| Alternative
| ExpressionCharacterClass
| Quantifier
| UnicodeSetsCharacterClass
unicodeSets: true
elements: UnicodeSetsCharacterClassElement[]
}

/**
* The character class.
Expand Down Expand Up @@ -239,7 +279,12 @@ export interface AnyCharacterSet extends NodeBase {
*/
export interface EscapeCharacterSet extends NodeBase {
type: "CharacterSet"
parent: Alternative | CharacterClass | Quantifier
parent:
| Alternative
| CharacterClass
| ClassIntersection
| ClassSubtraction
| Quantifier
kind: "digit" | "space" | "word"
negate: boolean
}
Expand All @@ -248,14 +293,98 @@ export interface EscapeCharacterSet extends NodeBase {
* The unicode property escape.
* E.g. `\p{ASCII}`, `\P{ASCII}`, `\p{Script=Hiragana}`
*/
export interface UnicodePropertyCharacterSet extends NodeBase {
export type UnicodePropertyCharacterSet =
| CharacterUnicodePropertyCharacterSet
| StringsUnicodePropertyCharacterSet
interface BaseUnicodePropertyCharacterSet extends NodeBase {
type: "CharacterSet"
parent: Alternative | CharacterClass | Quantifier
parent:
| Alternative
| CharacterClass
| ClassIntersection
| ClassSubtraction
| Quantifier
kind: "property"
strings: boolean
key: string
value: string | null
negate: boolean
}
export interface CharacterUnicodePropertyCharacterSet
extends BaseUnicodePropertyCharacterSet {
strings: false
value: string | null
negate: boolean
}
/** StringsUnicodePropertyCharacterSet is Unicode property escape with property of strings. */
export interface StringsUnicodePropertyCharacterSet
extends BaseUnicodePropertyCharacterSet {
strings: true
value: null
negate: false
}

/**
* The expression character class.
* E.g. `[a--b]`, `[a&&b]`,`[^a--b]`, `[^a&&b]`
*/
export interface ExpressionCharacterClass extends NodeBase {
type: "ExpressionCharacterClass"
parent:
| Alternative
| ExpressionCharacterClass
| Quantifier
| UnicodeSetsCharacterClass
negate: boolean
expression: ClassIntersection | ClassSubtraction
}

export type ClassSetOperand =
| Character
| ClassStringDisjunction
| EscapeCharacterSet
| ExpressionCharacterClass
| UnicodePropertyCharacterSet
| UnicodeSetsCharacterClass

/**
* The character class intersection.
* E.g. `a&&b`
*/
export interface ClassIntersection extends NodeBase {
type: "ClassIntersection"
parent: ClassIntersection | ExpressionCharacterClass
left: ClassIntersection | ClassSetOperand
right: ClassSetOperand
}

/**
* The character class subtraction.
* E.g. `a--b`
*/
export interface ClassSubtraction extends NodeBase {
type: "ClassSubtraction"
parent: ClassSubtraction | ExpressionCharacterClass
left: ClassSetOperand | ClassSubtraction
right: ClassSetOperand
}

/**
* The character class string disjunction.
* E.g. `\q{a|b}`
*/
export interface ClassStringDisjunction extends NodeBase {
type: "ClassStringDisjunction"
parent: ClassIntersection | ClassSubtraction | UnicodeSetsCharacterClass
alternatives: StringAlternative[]
}

/** StringAlternative is only used for `\q{alt}`({@link ClassStringDisjunction}). */
export interface StringAlternative extends NodeBase {
type: "StringAlternative"
parent: ClassStringDisjunction
elements: Character[]
}

/**
* The character.
Expand All @@ -264,7 +393,14 @@ export interface UnicodePropertyCharacterSet extends NodeBase {
*/
export interface Character extends NodeBase {
type: "Character"
parent: Alternative | CharacterClass | CharacterClassRange | Quantifier
parent:
| Alternative
| CharacterClass
| CharacterClassRange
| ClassIntersection
| ClassSubtraction
| Quantifier
| StringAlternative
value: number // a code point.
}

Expand Down Expand Up @@ -292,4 +428,5 @@ export interface Flags extends NodeBase {
multiline: boolean
sticky: boolean
unicode: boolean
unicodeSets: boolean
}
2 changes: 2 additions & 0 deletions src/ecma-versions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ export type EcmaVersion =
| 2021
| 2022
| 2023
| 2024
export const latestEcmaVersion = 2024
Loading

0 comments on commit 31dac9d

Please sign in to comment.