Skip to content

Commit 7e02b96

Browse files
refactor - making more use of the Char enum
1 parent 8150633 commit 7e02b96

File tree

7 files changed

+113
-111
lines changed

7 files changed

+113
-111
lines changed

assembly/nfa/characters.ts renamed to assembly/char.ts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
1-
export const enum CharClass {
1+
export const enum Char {
22
None = -1,
3-
4-
Dot = 0x2e, // "."
3+
HorizontalTab = 0x09,
4+
VerticalTab = 0x0b,
5+
FormFeed = 0x0c,
6+
CarriageReturn = 0x0d,
7+
LineFeed = 0x0a,
58
Dollar = 0x24, // "$"
6-
Caret = 0x5e, // "^"
7-
9+
LeftParenthesis = 0x28,
10+
RightParenthesis = 0x29,
11+
Asterisk = 0x2a, // "*"
12+
Comma = 0x2c, // "*"
13+
Plus = 0x2b, // "+"
14+
Dot = 0x2e, // "."
15+
Zero = 0x30,
16+
Question = 0x3f, // "?"
17+
A = 0x41,
818
D = 0x44,
919
S = 0x53,
1020
W = 0x57,
21+
LeftSquareBracket = 0x5b, // "["
22+
Backslash = 0x5c, // "\"
23+
RightSquareBracket = 0x5d, // "]"
24+
Caret = 0x5e, // "^"
25+
Underscore = 0x5f,
26+
a = 0x61,
1127
d = 0x64,
1228
f = 0x66,
1329
n = 0x6e,
@@ -16,32 +32,25 @@ export const enum CharClass {
1632
t = 0x74,
1733
v = 0x76,
1834
w = 0x77,
19-
}
20-
21-
export const enum QuantifierClass {
22-
Star = 0x2a, // "*"
23-
Plus = 0x2b, // "+"
24-
Question = 0x3f, // "?"
35+
LeftCurlyBrace = 0x7b /* { */,
36+
VerticalBar = 0x7c /* | */,
37+
RightCurlyBrace = 0x7d /* */,
2538
}
2639

2740
export function isDigit(code: u32): bool {
28-
return code - 48 < 10;
41+
return code - Char.Zero < 10;
2942
}
3043

3144
export function isLowercaseAlpha(code: u32): bool {
32-
return code - 97 < 26;
45+
return code - Char.a < 26;
3346
}
3447

3548
export function isUppercaseAlpha(code: u32): bool {
36-
return code - 65 < 26;
49+
return code - Char.A < 26;
3750
}
3851

3952
export function isAlpha(code: u32): bool {
40-
return (code | 32) - 97 < 26;
41-
}
42-
43-
export function isUnderscore(code: u32): bool {
44-
return code == 95;
53+
return (code | 32) - Char.a < 26;
4554
}
4655

4756
export function isWhitespace(code: u32): bool {

assembly/nfa/matcher.ts

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
import {
2-
isDigit,
3-
isAlpha,
4-
isUnderscore,
5-
isWhitespace,
6-
CharClass,
7-
} from "./characters";
1+
import { isDigit, isAlpha, isWhitespace, Char } from "../char";
82

93
import {
104
CharacterNode,
@@ -31,7 +25,7 @@ export abstract class Matcher {
3125
}
3226

3327
export class CharacterMatcher extends Matcher {
34-
constructor(public character: CharClass) {
28+
constructor(public character: Char) {
3529
super();
3630
}
3731

@@ -41,36 +35,41 @@ export class CharacterMatcher extends Matcher {
4135
}
4236

4337
export class CharacterClassMatcher extends Matcher {
44-
constructor(public charClass: CharClass) {
38+
constructor(public charClass: Char) {
4539
super();
4640
}
4741

4842
matches(code: u32): bool {
4943
switch (this.charClass) {
50-
case CharClass.d:
44+
case Char.d:
5145
return isDigit(code);
52-
case CharClass.D:
46+
case Char.D:
5347
return !isDigit(code);
54-
case CharClass.Dot:
55-
return code != 13 && code != 10 && code != 8232 && code != 8233;
56-
case CharClass.w:
57-
return isAlpha(code) || isUnderscore(code) || isDigit(code);
58-
case CharClass.W:
59-
return !(isAlpha(code) || isUnderscore(code) || isDigit(code));
60-
case CharClass.s:
48+
case Char.Dot:
49+
return (
50+
code != Char.CarriageReturn &&
51+
code != Char.LineFeed &&
52+
code != 8232 &&
53+
code != 8233
54+
);
55+
case Char.w:
56+
return isAlpha(code) || code == Char.Underscore || isDigit(code);
57+
case Char.W:
58+
return !(isAlpha(code) || code == Char.Underscore || isDigit(code));
59+
case Char.s:
6160
return isWhitespace(code);
62-
case CharClass.S:
61+
case Char.S:
6362
return !isWhitespace(code);
64-
case CharClass.t:
65-
return code == 9;
66-
case CharClass.r:
67-
return code == 13;
68-
case CharClass.n:
69-
return code == 10;
70-
case CharClass.v:
71-
return code == 11;
72-
case CharClass.f:
73-
return code == 12;
63+
case Char.t:
64+
return code == Char.HorizontalTab;
65+
case Char.r:
66+
return code == Char.CarriageReturn;
67+
case Char.n:
68+
return code == Char.LineFeed;
69+
case Char.v:
70+
return code == Char.VerticalTab;
71+
case Char.f:
72+
return code == Char.FormFeed;
7473

7574
default:
7675
throw new Error(

assembly/nfa/nfa.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
AssertionNode,
1212
} from "../parser/node";
1313

14-
import { QuantifierClass } from "./characters";
14+
import { Char } from "../char";
1515
import { Matcher } from "./matcher";
1616

1717
export class State {
@@ -158,11 +158,11 @@ function automataForNode(expression: Node | null): Automata {
158158
const c = expression as RepetitionNode;
159159
const auto = automataForNode(c.expression);
160160
const quantifier = c.quantifier;
161-
if (quantifier == QuantifierClass.Question) {
161+
if (quantifier == Char.Question) {
162162
return zeroOrOne(auto);
163-
} else if (quantifier == QuantifierClass.Plus) {
163+
} else if (quantifier == Char.Plus) {
164164
return oneOrMore(auto);
165-
} else if (quantifier == QuantifierClass.Star) {
165+
} else if (quantifier == Char.Asterisk) {
166166
return closure(auto);
167167
} else {
168168
throw new Error(

assembly/parser/node.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CharClass, QuantifierClass } from "../nfa/characters";
1+
import { Char } from "../char";
22
import { replaceAtIndex } from "../util";
33

44
export const enum NodeType {
@@ -107,14 +107,14 @@ export class CharacterNode extends Node {
107107
}
108108

109109
export class AssertionNode extends Node {
110-
constructor(public kind: CharClass) {
110+
constructor(public kind: Char) {
111111
super(NodeType.Assertion);
112112
}
113113

114-
static is(node: Node, kind: CharClass = CharClass.None): bool {
114+
static is(node: Node, kind: Char = Char.None): bool {
115115
return (
116116
node.type == NodeType.Assertion &&
117-
((node as AssertionNode).kind == kind || kind == CharClass.None)
117+
((node as AssertionNode).kind == kind || kind == Char.None)
118118
);
119119
}
120120

@@ -124,7 +124,7 @@ export class AssertionNode extends Node {
124124
}
125125

126126
export class CharacterClassNode extends Node {
127-
constructor(public charClass: CharClass) {
127+
constructor(public charClass: Char) {
128128
super(NodeType.CharacterClass);
129129
}
130130

@@ -138,7 +138,7 @@ export class CharacterClassNode extends Node {
138138
}
139139

140140
export class RepetitionNode extends Node {
141-
constructor(public expression: Node, public quantifier: QuantifierClass) {
141+
constructor(public expression: Node, public quantifier: Char) {
142142
super(NodeType.Repetition);
143143
}
144144

0 commit comments

Comments
 (0)