125 lines
2.8 KiB
TypeScript
125 lines
2.8 KiB
TypeScript
|
export as namespace regexpToAst
|
||
|
|
||
|
export const VERSION: number
|
||
|
|
||
|
export class RegExpParser {
|
||
|
pattern: (input: string) => RegExpPattern
|
||
|
}
|
||
|
|
||
|
export interface IRegExpAST {
|
||
|
type: string
|
||
|
loc: { begin: number; end: number }
|
||
|
}
|
||
|
|
||
|
export interface RegExpPattern extends IRegExpAST {
|
||
|
type: "Pattern"
|
||
|
flags: RegExpFlags
|
||
|
value: Disjunction
|
||
|
}
|
||
|
|
||
|
export interface RegExpFlags extends IRegExpAST {
|
||
|
type: "Flags"
|
||
|
global: boolean
|
||
|
ignoreCase: boolean
|
||
|
multiLine: boolean
|
||
|
unicode: boolean
|
||
|
sticky: boolean
|
||
|
}
|
||
|
|
||
|
export interface Disjunction extends IRegExpAST {
|
||
|
type: "Disjunction"
|
||
|
value: Alternative[]
|
||
|
}
|
||
|
|
||
|
export interface Alternative extends IRegExpAST {
|
||
|
type: "Alternative"
|
||
|
value: Term[]
|
||
|
}
|
||
|
|
||
|
export type Term = Atom | Assertion
|
||
|
|
||
|
export interface Assertion extends IRegExpAST {
|
||
|
type:
|
||
|
| "StartAnchor"
|
||
|
| "EndAnchor"
|
||
|
| "WordBoundary"
|
||
|
| "NonWordBoundary"
|
||
|
| "Lookahead"
|
||
|
| "NegativeLookahead"
|
||
|
|
||
|
value?: Disjunction
|
||
|
}
|
||
|
|
||
|
export type Atom = Character | Set | Group | GroupBackReference
|
||
|
|
||
|
export interface Character extends IRegExpAST {
|
||
|
type: "Character"
|
||
|
value: number
|
||
|
quantifier?: Quantifier
|
||
|
}
|
||
|
|
||
|
export type Range = { from: number; to: number }
|
||
|
|
||
|
export interface Set extends IRegExpAST {
|
||
|
type: "Set"
|
||
|
complement: boolean
|
||
|
value: (number | Range)[]
|
||
|
quantifier?: Quantifier
|
||
|
}
|
||
|
|
||
|
export interface Group extends IRegExpAST {
|
||
|
type: "Group"
|
||
|
value: Disjunction
|
||
|
capturing: boolean
|
||
|
idx?: number
|
||
|
quantifier?: Quantifier
|
||
|
}
|
||
|
|
||
|
export interface GroupBackReference extends IRegExpAST {
|
||
|
type: "GroupBackReference"
|
||
|
value: number
|
||
|
quantifier?: Quantifier
|
||
|
}
|
||
|
|
||
|
export interface Quantifier extends IRegExpAST {
|
||
|
type: "Quantifier"
|
||
|
atLeast: number
|
||
|
atMost: number
|
||
|
greedy: boolean
|
||
|
}
|
||
|
|
||
|
export class BaseRegExpVisitor {
|
||
|
/**
|
||
|
* The entry point visitor method.
|
||
|
* This will dispatch to the specific visitor method.
|
||
|
*/
|
||
|
visit(node: IRegExpAST)
|
||
|
|
||
|
/**
|
||
|
* The entry point for visiting the children of a node.
|
||
|
* Override this to filter the types of children visited
|
||
|
* or to support new types of children in extended ASTs.
|
||
|
*/
|
||
|
visitChildren(node: IRegExpAST)
|
||
|
|
||
|
/**
|
||
|
* The specific visitor methods
|
||
|
* Override some of these of create custom visitors.
|
||
|
*/
|
||
|
visitPattern(node: RegExpPattern)
|
||
|
visitFlags(node: RegExpFlags)
|
||
|
visitDisjunction(node: Disjunction)
|
||
|
visitAlternative(node: Alternative)
|
||
|
visitStartAnchor(node: Assertion)
|
||
|
visitEndAnchor(node: Assertion)
|
||
|
visitWordBoundary(node: Assertion)
|
||
|
visitNonWordBoundary(node: Assertion)
|
||
|
visitLookahead(node: Assertion)
|
||
|
visitNegativeLookahead(node: Assertion)
|
||
|
visitCharacter(node: Character)
|
||
|
visitSet(node: Set)
|
||
|
visitGroup(Node: Group)
|
||
|
visitGroupBackReference(Node: GroupBackReference)
|
||
|
visitQuantifier(Node: Quantifier)
|
||
|
}
|