REGEX AST /^token/ { Concat() { BOL() MatchLiteral("token") } } REGEX ANNOTATED AST /^token/ { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [t] prevConsumes: [0] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /^token/ Program { source: ^token flags: numGroups: 1 numLoops: 0 instructions: { BOITest(hardFail: true) L0000: MatchLiteral(literal: "token") L0001: Succ() } } REGEX AST /(\w)?^token/ { Concat() { Loop([0-1], greedy) { DefineGroup(1) { MatchSet(positive, [0-9A-Z_a-z]) } } BOL() MatchLiteral("token") } } REGEX ANNOTATED AST /(\w)?^token/ { Concat() < features: {BOL,MatchLiteral,Concat,DefineGroup,Loop,MatchSet} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5-6] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: false isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: false isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { Loop([0-1], greedy) < features: {DefineGroup,Loop,MatchSet} firstSet: [0-9A-Z_a-z] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0-1] followConsumes: [5] isThisIrrefutable: true isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: false isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: false isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { DefineGroup(1) < features: {DefineGroup,MatchSet} firstSet: [0-9A-Z_a-z] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [1] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > { MatchSet(positive, [0-9A-Z_a-z]) < features: {MatchSet} firstSet: [0-9A-Z_a-z] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [1] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > } } BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [t] prevConsumes: [0-1] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0-1] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /(\w)?^token/ Program { source: (\w)?^token flags: numGroups: 2 numLoops: 0 instructions: { L0000: SyncToLiteralAndBackup(literal: "token" (with full map Boyer-Moore scanner), backup: [0-1]) L0001: TryMatchSet(set: [0-9A-Z_a-z], failLabel: Lffff) L0002: DefineGroupFixed(groupId: 1, length: 1, noNeedToSave: false) L0003: BOITest(hardFail: false) L0004: MatchLiteral(literal: "token") L0005: Succ() } } REGEX AST /token/ { MatchLiteral("token") } REGEX ANNOTATED AST /token/ { MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } REGEX PROGRAM /token/ Program { source: token flags: numGroups: 1 numLoops: 0 instructions: { L0000: SyncToLiteralAndConsume(literal: "token" (with full map Boyer-Moore scanner)) L0001: Succ() } } REGEX AST /^^token/ { Concat() { BOL() BOL() MatchLiteral("token") } } REGEX ANNOTATED AST /^^token/ { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [t] prevConsumes: [0] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /^^token/ Program { source: ^^token flags: numGroups: 1 numLoops: 0 instructions: { BOITest(hardFail: true) L0000: MatchLiteral(literal: "token") L0001: Succ() } } REGEX AST /token^/ { Concat() { MatchLiteral("token") BOL() } } REGEX ANNOTATED AST /token^/ { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: false isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [5] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /token^/ Program { source: token^ flags: numGroups: 1 numLoops: 0 instructions: { L0000: SyncToLiteralAndConsume(literal: "token" (with full map Boyer-Moore scanner)) L0001: BOITest(hardFail: true) L0002: Succ() } } REGEX AST /token^token/ { Concat() { MatchLiteral("token") BOL() MatchLiteral("token") } } REGEX ANNOTATED AST /token^token/ { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [10] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [t] prevConsumes: [5] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [5] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /token^token/ Program { source: token^token flags: numGroups: 1 numLoops: 0 instructions: { L0000: SyncToLiteralAndConsume(literal: "token" (with full map Boyer-Moore scanner)) L0001: BOITest(hardFail: true) L0002: MatchLiteral(literal: "token") L0003: Succ() } } REGEX AST /^token|^abc/ { Alt() { Concat() { BOL() MatchLiteral("token") } Concat() { BOL() MatchLiteral("abc") } } } REGEX ANNOTATED AST /^token|^abc/ { Alt() < features: {BOL,MatchLiteral,Concat,Alt} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3-5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: false isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: false isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [t] prevConsumes: [0] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > } Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [a] prevConsumes: [0] thisConsumes: [0] followConsumes: [3] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > MatchLiteral("abc") < features: {MatchLiteral} firstSet: [a] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: false hasInitialHardFailBOI: false > } } } REGEX PROGRAM /^token|^abc/ Program { source: ^token|^abc flags: numGroups: 1 numLoops: 0 instructions: { L0000: Try(failLabel: Lffff) L0001: BOITest(hardFail: false) L0002: MatchLiteral(literal: "token") L0003: Jump(targetLabel: Lffff) L0004: BOITest(hardFail: false) L0005: MatchLiteral(literal: "abc") L0006: Succ() } } REGEX AST /(?!token)^abc/ { Concat() { Assertion(negative) { MatchLiteral("token") } BOL() MatchLiteral("abc") } } REGEX ANNOTATED AST /(?!token)^abc/ { Concat() < features: {BOL,MatchLiteral,Concat,Assertion} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { Assertion(negative) < features: {MatchLiteral,Assertion} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [3] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: false isAtLeastOnce: true hasInitialHardFailBOI: false > } BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [a] prevConsumes: [0] thisConsumes: [0] followConsumes: [3] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > MatchLiteral("abc") < features: {MatchLiteral} firstSet: [a] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /(?!token)^abc/ Program { source: (?!token)^abc flags: numGroups: 1 numLoops: 0 instructions: { L0000: BeginAssertion(isNegation: true, nextLabel: Lffff, minBodyGroupId: 1, maxBodyGroupId: -1) L0001: MatchLiteral(literal: "token") L0002: EndAssertion() L0003: BOITest(hardFail: true) L0004: MatchLiteral(literal: "abc") L0005: Succ() } } REGEX AST /(?=^abc)/ { Assertion(positive) { Concat() { BOL() MatchLiteral("abc") } } } REGEX ANNOTATED AST /(?=^abc)/ { Assertion(positive) < features: {BOL,MatchLiteral,Concat,Assertion} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [a] prevConsumes: [0] thisConsumes: [0] followConsumes: [3-inf] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > MatchLiteral("abc") < features: {MatchLiteral} firstSet: [a] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } } REGEX PROGRAM /(?=^abc)/ Program { source: (?=^abc) flags: numGroups: 1 numLoops: 0 instructions: { L0000: BeginAssertion(isNegation: false, nextLabel: Lffff, minBodyGroupId: 1, maxBodyGroupId: -1) L0001: BOITest(hardFail: true) L0002: MatchLiteral(literal: "abc") L0003: EndAssertion() L0004: Succ() } } REGEX AST /(^token)/ { DefineGroup(1) { Concat() { BOL() MatchLiteral("token") } } } REGEX ANNOTATED AST /(^token)/ { DefineGroup(1) < features: {BOL,MatchLiteral,Concat,DefineGroup} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [t] prevConsumes: [0] thisConsumes: [0] followConsumes: [5] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > MatchLiteral("token") < features: {MatchLiteral} firstSet: [t] (exact) followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [5] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } } REGEX PROGRAM /(^token)/ Program { source: (^token) flags: numGroups: 2 numLoops: 0 instructions: { BOITest(hardFail: true) L0000: MatchLiteral(literal: "token") L0001: DefineGroupFixed(groupId: 1, length: 5, noNeedToSave: true) L0002: Succ() } } REGEX AST /(^a)+/ { Loop([1-inf], greedy) { DefineGroup(1) { Concat() { BOL() MatchChar('a') } } } } REGEX ANNOTATED AST /(^a)+/ { Loop([1-inf], greedy) < features: {BOL,MatchChar,Concat,DefineGroup,Loop} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [1-inf] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: false isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: false isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { DefineGroup(1) < features: {BOL,MatchChar,Concat,DefineGroup} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0-inf] thisConsumes: [1] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { Concat() < features: {BOL,MatchChar,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0-inf] thisConsumes: [1] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [a] prevConsumes: [0-inf] thisConsumes: [0] followConsumes: [1-inf] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > MatchChar('a') < features: {MatchChar} firstSet: [a] (exact) followSet: [\x00-\uffff] prevConsumes: [0-inf] thisConsumes: [1] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } } } REGEX PROGRAM /(^a)+/ Program { source: (^a)+ flags: numGroups: 2 numLoops: 1 instructions: { L0000: SyncToCharAndBackup(c: 'a', backup: [0-inf]) L0001: BeginLoopFixedGroupLastIteration(loopId: 0, repeats: [1-inf], exitLabel: Lffff, hasOuterLoops: false, hasInnerNondet: false, length: 1, groupId: 1, noNeedToSave: true) L0002: BOITest(hardFail: false) L0003: MatchChar(c: 'a') L0004: RepeatLoopFixedGroupLastIteration(beginLabel: Lffff) L0005: Succ() } } REGEX AST /(?=^)/ { Assertion(positive) { BOL() } } REGEX ANNOTATED AST /(?=^)/ { Assertion(positive) < features: {BOL,Assertion} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > } } REGEX PROGRAM /(?=^)/ Program { source: (?=^) flags: numGroups: 1 numLoops: 0 instructions: { L0000: BeginAssertion(isNegation: false, nextLabel: Lffff, minBodyGroupId: 1, maxBodyGroupId: -1) L0001: BOITest(hardFail: true) L0002: EndAssertion() L0003: Succ() } } REGEX AST /(^)/ { DefineGroup(1) { BOL() } } REGEX ANNOTATED AST /(^)/ { DefineGroup(1) < features: {BOL,DefineGroup} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: true > } } REGEX PROGRAM /(^)/ Program { source: (^) flags: numGroups: 2 numLoops: 0 instructions: { BOITest(hardFail: true) L0000: DefineGroupFixed(groupId: 1, length: 0, noNeedToSave: true) L0001: Succ() } } REGEX AST /(^)+/ { Loop([1-inf], greedy) { DefineGroup(1) { BOL() } } } REGEX ANNOTATED AST /(^)+/ { Loop([1-inf], greedy) < features: {BOL,DefineGroup,Loop} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: false isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: false isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { DefineGroup(1) < features: {BOL,DefineGroup} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: false isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } } REGEX PROGRAM /(^)+/ Program { source: (^)+ flags: numGroups: 2 numLoops: 1 instructions: { L0000: BeginLoop(loopId: 0, repeats: [1-inf], exitLabel: Lffff, hasOuterLoops: false, hasInnerNondet: false, minBodyGroupId: 1, maxBodyGroupId: 1, greedy: true) L0001: BOITest(hardFail: false) L0002: DefineGroupFixed(groupId: 1, length: 0, noNeedToSave: false) L0003: RepeatLoop(beginLabel: Lffff) L0004: Succ() } } REGEX AST /(?!^)/ { Assertion(negative) { BOL() } } REGEX ANNOTATED AST /(?!^)/ { Assertion(negative) < features: {BOL,Assertion} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [0] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: true isNotNegated: false isAtLeastOnce: true hasInitialHardFailBOI: false > } } REGEX PROGRAM /(?!^)/ Program { source: (?!^) flags: numGroups: 1 numLoops: 0 instructions: { L0000: BeginAssertion(isNegation: true, nextLabel: Lffff, minBodyGroupId: 1, maxBodyGroupId: -1) L0001: BOITest(hardFail: false) L0002: EndAssertion() L0003: Succ() } } REGEX AST /(?:^abc)+?/ { Loop([1-inf], non-greedy) { Concat() { BOL() MatchLiteral("abc") } } } REGEX ANNOTATED AST /(?:^abc)+?/ { Loop([1-inf], non-greedy) < features: {BOL,MatchLiteral,Concat,Loop} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0] thisConsumes: [3-inf] followConsumes: [0] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: false isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: false isNotInLoop: true isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { Concat() < features: {BOL,MatchLiteral,Concat} firstSet: [\x00-\uffff] followSet: [\x00-\uffff] prevConsumes: [0-inf] thisConsumes: [3] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > { BOL() < features: {BOL} firstSet: [\x00-\uffff] followSet: [a] prevConsumes: [0-inf] thisConsumes: [0] followConsumes: [3-inf] isThisIrrefutable: false isFollowIrrefutable: false isWord: false isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > MatchLiteral("abc") < features: {MatchLiteral} firstSet: [a] (exact) followSet: [\x00-\uffff] prevConsumes: [0-inf] thisConsumes: [3] followConsumes: [0-inf] isThisIrrefutable: false isFollowIrrefutable: true isWord: true isThisWillNotProgress: true isThisWillNotRegress: true isPrevWillNotProgress: false isPrevWillNotRegress: true isDeterministic: true isNotInLoop: false isNotNegated: true isAtLeastOnce: true hasInitialHardFailBOI: false > } } } REGEX PROGRAM /(?:^abc)+?/ Program { source: (?:^abc)+? flags: numGroups: 1 numLoops: 1 instructions: { L0000: SyncToLiteralAndBackup(literal: "abc" (with linear map Boyer-Moore scanner), backup: [0-inf]) L0001: BeginLoop(loopId: 0, repeats: [1-inf], exitLabel: Lffff, hasOuterLoops: false, hasInnerNondet: false, minBodyGroupId: 1, maxBodyGroupId: -1, greedy: false) L0002: BOITest(hardFail: true) L0003: MatchLiteral(literal: "abc") L0004: RepeatLoop(beginLabel: Lffff) L0005: Succ() } }