clarity-pattern-parser 4.0.3 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -1
- package/TODO.md +22 -2
- package/dist/ast/Node.d.ts +43 -11
- package/dist/ast/Visitor.d.ts +31 -31
- package/dist/index.browser.js +1248 -1495
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +12 -17
- package/dist/index.esm.js +1218 -1460
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1217 -1464
- package/dist/index.js.map +1 -1
- package/dist/patterns/And.d.ts +37 -24
- package/dist/patterns/Cursor.d.ts +35 -0
- package/dist/patterns/CursorHistory.d.ts +30 -0
- package/dist/patterns/Literal.d.ts +36 -19
- package/dist/patterns/Not.d.ts +26 -11
- package/dist/patterns/Or.d.ts +31 -22
- package/dist/patterns/ParseError.d.ts +6 -8
- package/dist/patterns/ParseResult.d.ts +6 -0
- package/dist/patterns/Pattern.d.ts +17 -26
- package/dist/patterns/Reference.d.ts +31 -12
- package/dist/patterns/Regex.d.ts +42 -21
- package/dist/patterns/Repeat.d.ts +38 -20
- package/dist/patterns/clonePatterns.d.ts +2 -0
- package/dist/patterns/filterOutNull.d.ts +2 -0
- package/dist/patterns/findPattern.d.ts +2 -0
- package/dist/patterns/getNextPattern.d.ts +2 -0
- package/jest.config.js +2 -1
- package/package.json +4 -5
- package/rollup.config.js +1 -1
- package/src/ast/Node.test.ts +254 -0
- package/src/ast/Node.ts +171 -23
- package/src/index.ts +11 -24
- package/src/intellisense/AutoComplete.test.ts +72 -0
- package/src/intellisense/AutoComplete.ts +146 -0
- package/src/intellisense/Suggestion.ts +13 -0
- package/src/intellisense/SuggestionOption.ts +4 -0
- package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
- package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
- package/src/intellisense/css/hex.ts +6 -0
- package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
- package/src/intellisense/css/name.ts +5 -0
- package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
- package/src/intellisense/css/spaces.ts +6 -0
- package/src/intellisense/css/unit.ts +10 -0
- package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
- package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
- package/src/intellisense/javascript/Javascript.test.ts +203 -0
- package/src/intellisense/javascript/arrayLiteral.ts +25 -0
- package/src/intellisense/javascript/deleteStatement.ts +14 -0
- package/src/intellisense/javascript/escapedCharacter.ts +50 -0
- package/src/intellisense/javascript/exponent.ts +26 -0
- package/src/intellisense/javascript/expression.ts +87 -0
- package/src/intellisense/javascript/expressionStatement.ts +29 -0
- package/src/intellisense/javascript/fraction.ts +13 -0
- package/src/intellisense/javascript/infixOperator.ts +36 -0
- package/src/intellisense/javascript/integer.ts +7 -0
- package/src/intellisense/javascript/invocation.ts +28 -0
- package/src/intellisense/javascript/literal.ts +14 -0
- package/src/intellisense/javascript/name.ts +3 -0
- package/src/intellisense/javascript/numberLiteral.ts +10 -0
- package/src/intellisense/javascript/objectLiteral.ts +30 -0
- package/src/intellisense/javascript/optionalSpaces.ts +3 -0
- package/src/intellisense/javascript/parameters.ts +20 -0
- package/src/intellisense/javascript/prefixOperator.ts +13 -0
- package/src/intellisense/javascript/propertyAccess.ts +23 -0
- package/src/intellisense/javascript/stringLiteral.ts +28 -0
- package/src/patterns/And.test.ts +299 -0
- package/src/patterns/And.ts +222 -119
- package/src/patterns/Cursor.test.ts +93 -0
- package/src/patterns/Cursor.ts +130 -0
- package/src/patterns/CursorHistory.test.ts +54 -0
- package/src/patterns/CursorHistory.ts +95 -0
- package/src/patterns/Literal.test.ts +134 -0
- package/src/patterns/Literal.ts +151 -61
- package/src/patterns/Not.test.ts +88 -0
- package/src/patterns/Not.ts +74 -33
- package/src/patterns/Or.test.ts +105 -0
- package/src/patterns/Or.ts +106 -98
- package/src/patterns/ParseError.ts +3 -7
- package/src/patterns/ParseResult.ts +7 -0
- package/src/patterns/Pattern.ts +18 -150
- package/src/patterns/Reference.test.ts +104 -0
- package/src/patterns/Reference.ts +94 -94
- package/src/patterns/Regex.test.ts +101 -0
- package/src/patterns/Regex.ts +129 -60
- package/src/patterns/Repeat.test.ts +196 -0
- package/src/patterns/Repeat.ts +208 -104
- package/src/patterns/clonePatterns.ts +5 -0
- package/src/patterns/filterOutNull.ts +13 -0
- package/src/patterns/findPattern.ts +25 -0
- package/src/patterns/getNextPattern.test.ts +39 -0
- package/src/patterns/getNextPattern.ts +18 -0
- package/src/Cursor.ts +0 -141
- package/src/CursorHistory.ts +0 -146
- package/src/TextSuggester.ts +0 -317
- package/src/ast/Visitor.ts +0 -271
- package/src/patterns/LookAhead.ts +0 -32
- package/src/patterns/Recursive.ts +0 -92
- package/src/tests/And.test.ts +0 -180
- package/src/tests/ComplexExamples.test.ts +0 -86
- package/src/tests/CssPatterns.test.ts +0 -90
- package/src/tests/CursorHistory.test.ts +0 -107
- package/src/tests/Cusor.test.ts +0 -174
- package/src/tests/HtmlPatterns.test.ts +0 -34
- package/src/tests/Literal.test.ts +0 -79
- package/src/tests/LookAhead.test.ts +0 -44
- package/src/tests/Not.test.ts +0 -51
- package/src/tests/Or.test.ts +0 -113
- package/src/tests/Pattern.test.ts +0 -290
- package/src/tests/Recursive.test.ts +0 -64
- package/src/tests/Reference.test.ts +0 -16
- package/src/tests/Repeat.test.ts +0 -75
- package/src/tests/SpeedTest.test.ts +0 -31
- package/src/tests/TextSuggester.test.ts +0 -297
- package/src/tests/Visitor.test.ts +0 -331
- package/src/tests/cssPatterns/hex.ts +0 -5
- package/src/tests/cssPatterns/name.ts +0 -5
- package/src/tests/cssPatterns/number.ts +0 -8
- package/src/tests/cssPatterns/spaces.ts +0 -5
- package/src/tests/cssPatterns/unit.ts +0 -8
- package/src/tests/htmlPatterns/element.ts +0 -49
- package/src/tests/javascriptPatterns/boolean.ts +0 -10
- package/src/tests/javascriptPatterns/json.ts +0 -67
- package/src/tests/javascriptPatterns/name.ts +0 -5
- package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
- package/src/tests/javascriptPatterns/string.ts +0 -84
- package/src/tests/javascriptPatterns/unit.ts +0 -8
- package/src/tests/javascriptPatterns/whitespace.ts +0 -44
- package/src/tests/naturalLanguage/filter.ts +0 -37
- package/src/tests/patterns/sentence.ts +0 -37
- /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { escapedCharacter } from "./escapedCharacter";
|
|
2
|
+
import { exponent } from "./exponent";
|
|
3
|
+
import { expression } from "./expression";
|
|
4
|
+
import { expressionStatement } from "./expressionStatement";
|
|
5
|
+
import { infixOperator } from "./infixOperator";
|
|
6
|
+
import { integer } from "./integer";
|
|
7
|
+
import { name } from "./name";
|
|
8
|
+
import { parameters } from "./parameters";
|
|
9
|
+
import { prefixOperator } from "./prefixOperator";
|
|
10
|
+
|
|
11
|
+
describe("Ecmascript 3", () => {
|
|
12
|
+
test("Escaped Character", () => {
|
|
13
|
+
let result = escapedCharacter.parseText(`\\"`);
|
|
14
|
+
expect(result.ast?.value).toBe(`\\"`)
|
|
15
|
+
|
|
16
|
+
result = escapedCharacter.parseText(`\\'`)
|
|
17
|
+
expect(result.ast?.value).toBe(`\\'`)
|
|
18
|
+
|
|
19
|
+
result = escapedCharacter.parseText(`\\\\`)
|
|
20
|
+
expect(result.ast?.value).toBe(`\\\\`)
|
|
21
|
+
|
|
22
|
+
result = escapedCharacter.parseText(`\\/`)
|
|
23
|
+
expect(result.ast?.value).toBe(`\\/`)
|
|
24
|
+
|
|
25
|
+
result = escapedCharacter.parseText(`\\f`)
|
|
26
|
+
expect(result.ast?.value).toBe(`\\f`)
|
|
27
|
+
|
|
28
|
+
result = escapedCharacter.parseText(`\\t`)
|
|
29
|
+
expect(result.ast?.value).toBe(`\\t`)
|
|
30
|
+
|
|
31
|
+
result = escapedCharacter.parseText(`\\u00E9`)
|
|
32
|
+
expect(result.ast?.value).toBe(`\\u00E9`)
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("Exponent", () => {
|
|
36
|
+
let result = exponent.parseText("e+1");
|
|
37
|
+
expect(result.ast?.value).toBe("e+1")
|
|
38
|
+
|
|
39
|
+
result = exponent.parseText("e-1");
|
|
40
|
+
expect(result.ast?.value).toBe("e-1")
|
|
41
|
+
|
|
42
|
+
result = exponent.parseText("E+1");
|
|
43
|
+
expect(result.ast?.value).toBe("E+1")
|
|
44
|
+
|
|
45
|
+
result = exponent.parseText("E-1");
|
|
46
|
+
expect(result.ast?.value).toBe("E-1")
|
|
47
|
+
|
|
48
|
+
result = exponent.parseText("e+11");
|
|
49
|
+
expect(result.ast?.value).toBe("e+11")
|
|
50
|
+
|
|
51
|
+
result = exponent.parseText("11");
|
|
52
|
+
expect(result.ast).toBeNull()
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("Integer", () => {
|
|
56
|
+
let result = integer.parseText("0");
|
|
57
|
+
expect(result.ast?.value).toBe("0");
|
|
58
|
+
|
|
59
|
+
result = integer.parseText("1");
|
|
60
|
+
expect(result.ast?.value).toBe("1");
|
|
61
|
+
|
|
62
|
+
result = integer.parseText("100");
|
|
63
|
+
expect(result.ast?.value).toBe("100");
|
|
64
|
+
|
|
65
|
+
result = integer.parseText(".1");
|
|
66
|
+
expect(result.ast).toBeNull();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("Infix Operator", () => {
|
|
70
|
+
let result = infixOperator.parseText("*");
|
|
71
|
+
expect(result.ast?.value).toBe("*");
|
|
72
|
+
|
|
73
|
+
result = infixOperator.parseText("/");
|
|
74
|
+
expect(result.ast?.value).toBe("/");
|
|
75
|
+
|
|
76
|
+
result = infixOperator.parseText("%");
|
|
77
|
+
expect(result.ast?.value).toBe("%");
|
|
78
|
+
|
|
79
|
+
result = infixOperator.parseText("+");
|
|
80
|
+
expect(result.ast?.value).toBe("+");
|
|
81
|
+
|
|
82
|
+
result = infixOperator.parseText("-");
|
|
83
|
+
expect(result.ast?.value).toBe("-");
|
|
84
|
+
|
|
85
|
+
result = infixOperator.parseText(">=");
|
|
86
|
+
expect(result.ast?.value).toBe(">=");
|
|
87
|
+
|
|
88
|
+
result = infixOperator.parseText("<=");
|
|
89
|
+
expect(result.ast?.value).toBe("<=");
|
|
90
|
+
|
|
91
|
+
result = infixOperator.parseText(">");
|
|
92
|
+
expect(result.ast?.value).toBe(">");
|
|
93
|
+
|
|
94
|
+
result = infixOperator.parseText("<");
|
|
95
|
+
expect(result.ast?.value).toBe("<");
|
|
96
|
+
|
|
97
|
+
result = infixOperator.parseText("===");
|
|
98
|
+
expect(result.ast?.value).toBe("===");
|
|
99
|
+
|
|
100
|
+
result = infixOperator.parseText("!==");
|
|
101
|
+
expect(result.ast?.value).toBe("!==");
|
|
102
|
+
|
|
103
|
+
result = infixOperator.parseText("||");
|
|
104
|
+
expect(result.ast?.value).toBe("||");
|
|
105
|
+
|
|
106
|
+
result = infixOperator.parseText("&&");
|
|
107
|
+
expect(result.ast?.value).toBe("&&");
|
|
108
|
+
|
|
109
|
+
result = infixOperator.parseText("bad");
|
|
110
|
+
expect(result.ast).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
test("Name", () => {
|
|
115
|
+
let result = name.parseText("p_0");
|
|
116
|
+
expect(result.ast?.value).toBe("p_0");
|
|
117
|
+
|
|
118
|
+
result = name.parseText("_0");
|
|
119
|
+
expect(result.ast?.value).toBe("_0");
|
|
120
|
+
|
|
121
|
+
result = name.parseText("0");
|
|
122
|
+
expect(result.ast).toBeNull();
|
|
123
|
+
|
|
124
|
+
result = name.parseText("_");
|
|
125
|
+
expect(result.ast?.value).toBe("_");
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("Parameters", () => {
|
|
129
|
+
let result = parameters.parseText("(param1)");
|
|
130
|
+
expect(result.ast?.value).toBe("(param1)");
|
|
131
|
+
|
|
132
|
+
result = parameters.parseText("(param1, param2)");
|
|
133
|
+
expect(result.ast?.value).toBe("(param1, param2)");
|
|
134
|
+
|
|
135
|
+
result = parameters.parseText("(param1, param2,)");
|
|
136
|
+
expect(result.ast).toBeNull();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("Prefix Operator", () => {
|
|
140
|
+
let result = prefixOperator.parseText("typeof ");
|
|
141
|
+
expect(result.ast?.value).toBe("typeof ");
|
|
142
|
+
|
|
143
|
+
result = prefixOperator.parseText("+");
|
|
144
|
+
expect(result.ast?.value).toBe("+");
|
|
145
|
+
|
|
146
|
+
result = prefixOperator.parseText("-");
|
|
147
|
+
expect(result.ast?.value).toBe("-");
|
|
148
|
+
|
|
149
|
+
result = prefixOperator.parseText("!");
|
|
150
|
+
expect(result.ast?.value).toBe("!");
|
|
151
|
+
|
|
152
|
+
result = prefixOperator.parseText("a");
|
|
153
|
+
expect(result.ast).toBeNull();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("Object Literal", () => {
|
|
157
|
+
let result = expression.parseText(`{}`)
|
|
158
|
+
expect(result.ast?.value).toBe("{}");
|
|
159
|
+
|
|
160
|
+
result = expression.parseText(`{prop:{}}`)
|
|
161
|
+
expect(result.ast?.value).toBe("{prop:{}}");
|
|
162
|
+
|
|
163
|
+
result = expression.parseText(`{prop:"value"}`)
|
|
164
|
+
expect(result.ast?.value).toBe(`{prop:"value"}`);
|
|
165
|
+
|
|
166
|
+
result = expression.parseText(`{prop:0.9}`)
|
|
167
|
+
expect(result.ast?.value).toBe(`{prop:0.9}`);
|
|
168
|
+
|
|
169
|
+
result = expression.parseText(`{prop:1}`)
|
|
170
|
+
expect(result.ast?.value).toBe(`{prop:1}`);
|
|
171
|
+
|
|
172
|
+
result = expression.parseText(`{"prop":1}`)
|
|
173
|
+
expect(result.ast?.value).toBe(`{"prop":1}`);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("Array Literal", () => {
|
|
177
|
+
let result = expression.parseText("[]")
|
|
178
|
+
expect(result.ast?.value).toBe("[]");
|
|
179
|
+
|
|
180
|
+
result = expression.parseText("[{}, 9, 0.9e-10, [1, 2]]")
|
|
181
|
+
expect(result.ast?.value).toBe("[{}, 9, 0.9e-10, [1, 2]]");
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("Expression Statement", () => {
|
|
185
|
+
let result = expressionStatement.parseText(`name = "John"`);
|
|
186
|
+
expect(result.ast?.value).toBe(`name = "John"`);
|
|
187
|
+
|
|
188
|
+
result = expressionStatement.parseText(`name = othername = "John"`)
|
|
189
|
+
expect(result.ast?.value).toBe(`name = othername = "John"`);
|
|
190
|
+
|
|
191
|
+
result = expressionStatement.parseText(`name = othername.prop = "John"`)
|
|
192
|
+
expect(result.ast?.value).toBe(`name = othername.prop = "John"`);
|
|
193
|
+
|
|
194
|
+
result = expressionStatement.parseText(`name = othername.prop += 2`)
|
|
195
|
+
expect(result.ast?.value).toBe(`name = othername.prop += 2`);
|
|
196
|
+
|
|
197
|
+
result = expressionStatement.parseText(`name.prop().method(blah) = blah.prop()`)
|
|
198
|
+
expect(result.ast?.value).toBe(`name.prop().method(blah) = blah.prop()`);
|
|
199
|
+
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Reference } from "../../patterns/Reference";
|
|
5
|
+
import { Regex } from "../../patterns/Regex";
|
|
6
|
+
import { Repeat } from "../../patterns/Repeat";
|
|
7
|
+
import { optionalSpaces } from "./optionalSpaces";
|
|
8
|
+
|
|
9
|
+
const divider = new Regex("array-divider", "\\s*,\\s*");
|
|
10
|
+
const arrayItems = new Repeat("array-items", new Reference("expression"), divider, true);
|
|
11
|
+
|
|
12
|
+
export const arrayLiteral = new Or("array-literal",
|
|
13
|
+
[new And("empty-array-literal", [
|
|
14
|
+
new Literal("open-square-bracket", "["),
|
|
15
|
+
optionalSpaces,
|
|
16
|
+
new Literal("close-square-bracket", "]"),
|
|
17
|
+
]),
|
|
18
|
+
new And("array-literal", [
|
|
19
|
+
new Literal("open-square-bracket", "["),
|
|
20
|
+
optionalSpaces,
|
|
21
|
+
arrayItems,
|
|
22
|
+
optionalSpaces,
|
|
23
|
+
new Literal("close-square-bracket", "]"),
|
|
24
|
+
])
|
|
25
|
+
]);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Regex } from "../../patterns/Regex";
|
|
4
|
+
import { expression } from "./expression";
|
|
5
|
+
import { propertyAccess } from "./propertyAccess";
|
|
6
|
+
|
|
7
|
+
const space = new Regex("space", "\\s+");
|
|
8
|
+
export const deleteStatement = new And("delete-statement", [
|
|
9
|
+
new Literal("delete-keyword", "delete"),
|
|
10
|
+
space,
|
|
11
|
+
expression,
|
|
12
|
+
propertyAccess
|
|
13
|
+
]);
|
|
14
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Regex } from "../../patterns/Regex";
|
|
5
|
+
|
|
6
|
+
const backslash = new Literal("backslash", "\\");
|
|
7
|
+
const doubleQuote = new Literal("double-quote", "\"");
|
|
8
|
+
const singleQuote = new Literal("single-quote", "'");
|
|
9
|
+
const slash = new Literal("slash", "/");
|
|
10
|
+
const backspace = new Literal("backspace", "b");
|
|
11
|
+
const formFeed = new Literal("form-feed", "f");
|
|
12
|
+
const newLine = new Literal("new-line", "n");
|
|
13
|
+
const carriageReturn = new Literal("carriage-return", "r");
|
|
14
|
+
const tab = new Literal("tab", "t");
|
|
15
|
+
const hexDigit = new Regex("hex-digit", "[0-9a-fA-F]");
|
|
16
|
+
|
|
17
|
+
hexDigit.setTokens([
|
|
18
|
+
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
|
19
|
+
"a", "b", "c", "d", "e", "f",
|
|
20
|
+
"A", "B", "C", "D", "E", "F",
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
const unicode = new And("hex", [
|
|
24
|
+
new Literal("u", "u"),
|
|
25
|
+
hexDigit,
|
|
26
|
+
hexDigit,
|
|
27
|
+
hexDigit,
|
|
28
|
+
hexDigit
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
const specialCharacter = new Or("special-character", [
|
|
32
|
+
doubleQuote,
|
|
33
|
+
singleQuote,
|
|
34
|
+
backslash,
|
|
35
|
+
slash,
|
|
36
|
+
backspace,
|
|
37
|
+
formFeed,
|
|
38
|
+
newLine,
|
|
39
|
+
carriageReturn,
|
|
40
|
+
tab,
|
|
41
|
+
unicode,
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
const escapedCharacter = new And("escaped-character", [backslash, specialCharacter])
|
|
45
|
+
escapedCharacter.enableAstReduction();
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
escapedCharacter
|
|
49
|
+
}
|
|
50
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Regex } from "../../patterns/Regex";
|
|
5
|
+
|
|
6
|
+
const e = new Or("e", [
|
|
7
|
+
new Literal("e", "e"),
|
|
8
|
+
new Literal("e", "E")
|
|
9
|
+
]);
|
|
10
|
+
|
|
11
|
+
const optionalSign = new Or("sign", [
|
|
12
|
+
new Literal("plus", "+"),
|
|
13
|
+
new Literal("minus", "-")
|
|
14
|
+
], true);
|
|
15
|
+
|
|
16
|
+
const digit = new Regex("digit", "\\d+");
|
|
17
|
+
|
|
18
|
+
const exponent = new And("exponent", [
|
|
19
|
+
e,
|
|
20
|
+
optionalSign,
|
|
21
|
+
digit,
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
exponent.enableAstReduction();
|
|
25
|
+
|
|
26
|
+
export { exponent }
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Regex } from "../..";
|
|
2
|
+
import { And } from "../../patterns/And";
|
|
3
|
+
import { Literal } from "../../patterns/Literal";
|
|
4
|
+
import { Or } from "../../patterns/Or";
|
|
5
|
+
import { Reference } from "../../patterns/Reference";
|
|
6
|
+
import { Repeat } from "../../patterns/Repeat";
|
|
7
|
+
import { infixOperator } from "./infixOperator";
|
|
8
|
+
import { invocation } from "./invocation";
|
|
9
|
+
import { literal } from "./literal";
|
|
10
|
+
import { name } from "./name";
|
|
11
|
+
import { optionalSpaces } from "./optionalSpaces";
|
|
12
|
+
import { prefixOperator } from "./prefixOperator";
|
|
13
|
+
import { propertyAccess } from "./propertyAccess";
|
|
14
|
+
|
|
15
|
+
const space = new Regex("space", "\\s+")
|
|
16
|
+
const newKeyword = new Literal("new-keyword", "new");
|
|
17
|
+
const deleteKeyword = new Literal("delete-keyword", "delete");
|
|
18
|
+
|
|
19
|
+
const newExpression = new And("new-expression", [
|
|
20
|
+
newKeyword,
|
|
21
|
+
space,
|
|
22
|
+
new Reference("expression")
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
const deleteExpression = new And("delete-expression", [
|
|
26
|
+
deleteKeyword,
|
|
27
|
+
space,
|
|
28
|
+
new Reference("expression")
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
const groupExpression = new And("group-expression", [
|
|
32
|
+
new Literal("open-paren", "("),
|
|
33
|
+
optionalSpaces,
|
|
34
|
+
new Reference("expression"),
|
|
35
|
+
optionalSpaces,
|
|
36
|
+
new Literal("close-paren", ")")
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
const prefixExpression = new And("prefix-expression", [
|
|
40
|
+
prefixOperator,
|
|
41
|
+
new Reference("expression")
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
const optionalInfix = new And("infix-expression", [
|
|
45
|
+
infixOperator,
|
|
46
|
+
optionalSpaces,
|
|
47
|
+
new Reference("expression"),
|
|
48
|
+
], true);
|
|
49
|
+
|
|
50
|
+
const optionalTernary = new And("ternary", [
|
|
51
|
+
new Literal("question-mark", "?"),
|
|
52
|
+
optionalSpaces,
|
|
53
|
+
new Reference("expression"),
|
|
54
|
+
optionalSpaces,
|
|
55
|
+
new Literal("colon", ":"),
|
|
56
|
+
optionalSpaces,
|
|
57
|
+
new Reference("expression")
|
|
58
|
+
], true);
|
|
59
|
+
|
|
60
|
+
const optionalMemberAccesses = new Repeat("object-member-accesses",
|
|
61
|
+
new Or("object-member-access", [
|
|
62
|
+
invocation,
|
|
63
|
+
propertyAccess,
|
|
64
|
+
]),
|
|
65
|
+
undefined, true
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
var variableName = name.clone("variable-name");
|
|
69
|
+
|
|
70
|
+
const expressions = new Or("expressions", [
|
|
71
|
+
newExpression,
|
|
72
|
+
deleteExpression,
|
|
73
|
+
groupExpression,
|
|
74
|
+
prefixExpression,
|
|
75
|
+
literal,
|
|
76
|
+
variableName,
|
|
77
|
+
]);
|
|
78
|
+
|
|
79
|
+
const expression = new And("expression", [
|
|
80
|
+
expressions,
|
|
81
|
+
optionalInfix,
|
|
82
|
+
optionalTernary,
|
|
83
|
+
optionalMemberAccesses
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
export { expression }
|
|
87
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Repeat } from "../../patterns/Repeat";
|
|
5
|
+
import { expression } from "./expression";
|
|
6
|
+
import { optionalSpaces } from "./optionalSpaces";
|
|
7
|
+
|
|
8
|
+
const assignmentOperators = new Or("assignment-operators", [
|
|
9
|
+
new Literal("assign", "="),
|
|
10
|
+
new Literal("addition-assign", "+="),
|
|
11
|
+
new Literal("subtraction-assign", "-="),
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
const assignment = new And("assignment", [
|
|
15
|
+
expression,
|
|
16
|
+
optionalSpaces,
|
|
17
|
+
assignmentOperators,
|
|
18
|
+
optionalSpaces,
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
const expressionStatement = new And("expressionStatement", [
|
|
22
|
+
new Repeat("assignments",
|
|
23
|
+
assignment),
|
|
24
|
+
optionalSpaces,
|
|
25
|
+
expression
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
export { expressionStatement }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Regex } from "../../patterns/Regex";
|
|
4
|
+
|
|
5
|
+
const period = new Literal("period", ".");
|
|
6
|
+
const digit = new Regex("digit", "\\d+");
|
|
7
|
+
const fraction = new And("fraction", [period, digit]);
|
|
8
|
+
|
|
9
|
+
fraction.enableAstReduction();
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
fraction
|
|
13
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Literal } from "../../patterns/Literal"
|
|
2
|
+
import { Or } from "../../patterns/Or";
|
|
3
|
+
|
|
4
|
+
const multiply = new Literal("multiply", "*");
|
|
5
|
+
const divide = new Literal("divide", "/");
|
|
6
|
+
const remainder = new Literal("remainder", "%");
|
|
7
|
+
const add = new Literal("add", "+");
|
|
8
|
+
const subtract = new Literal("subtract", "-");
|
|
9
|
+
const greaterOrEqual = new Literal("greater-or-equal", ">=");
|
|
10
|
+
const lessOrEqual = new Literal("less-or-equal", "<=");
|
|
11
|
+
const greater = new Literal("greater", ">");
|
|
12
|
+
const less = new Literal("less", "<");
|
|
13
|
+
const equal = new Literal("equal", "===");
|
|
14
|
+
const notEqual = new Literal("not-equal", "!==");
|
|
15
|
+
const logicalOr = new Literal("logical-or", "||");
|
|
16
|
+
const logicalAnd = new Literal("logical-and", "&&");
|
|
17
|
+
|
|
18
|
+
const infixOperator = new Or("infix-operator", [
|
|
19
|
+
multiply,
|
|
20
|
+
divide,
|
|
21
|
+
remainder,
|
|
22
|
+
add,
|
|
23
|
+
subtract,
|
|
24
|
+
greaterOrEqual,
|
|
25
|
+
lessOrEqual,
|
|
26
|
+
greater,
|
|
27
|
+
less,
|
|
28
|
+
equal,
|
|
29
|
+
notEqual,
|
|
30
|
+
logicalOr,
|
|
31
|
+
logicalAnd
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
export { infixOperator }
|
|
35
|
+
|
|
36
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Reference } from "../../patterns/Reference";
|
|
5
|
+
import { Regex } from "../../patterns/Regex";
|
|
6
|
+
import { Repeat } from "../../patterns/Repeat";
|
|
7
|
+
import { optionalSpaces } from "./optionalSpaces";
|
|
8
|
+
|
|
9
|
+
const divider = new Regex("invocation-divider", "\\s*,\\s*");
|
|
10
|
+
|
|
11
|
+
const invocationWithArguments = new And("invocation-with-arguments", [
|
|
12
|
+
new Literal("open-paren", "("),
|
|
13
|
+
optionalSpaces,
|
|
14
|
+
new Repeat("expressions", new Reference("expression"), divider, true),
|
|
15
|
+
optionalSpaces,
|
|
16
|
+
new Literal("close-paren", ")"),
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
const emptyInvocation = new And("empty-invocation", [
|
|
20
|
+
new Literal("open-paren", "("),
|
|
21
|
+
optionalSpaces,
|
|
22
|
+
new Literal("close-paren", ")"),
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
export const invocation = new Or("invocation", [
|
|
26
|
+
emptyInvocation,
|
|
27
|
+
invocationWithArguments
|
|
28
|
+
])
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Or } from "../../patterns/Or";
|
|
2
|
+
import { arrayLiteral } from "./arrayLiteral";
|
|
3
|
+
import { numberLiteral } from "./numberLiteral";
|
|
4
|
+
import { objectLiteral } from "./objectLiteral";
|
|
5
|
+
import { stringLiteral } from "./stringLiteral";
|
|
6
|
+
|
|
7
|
+
const literal = new Or("literal", [
|
|
8
|
+
numberLiteral,
|
|
9
|
+
stringLiteral,
|
|
10
|
+
arrayLiteral,
|
|
11
|
+
objectLiteral,
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
export { literal }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { exponent } from "./exponent";
|
|
3
|
+
import { fraction } from "./fraction";
|
|
4
|
+
import { integer } from "./integer";
|
|
5
|
+
|
|
6
|
+
export const numberLiteral = new And("number-literal", [
|
|
7
|
+
integer,
|
|
8
|
+
fraction.clone("number-fraction", true),
|
|
9
|
+
exponent.clone("number-exponent", true)
|
|
10
|
+
]);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Reference } from "../../patterns/Reference";
|
|
5
|
+
import { Regex } from "../../patterns/Regex";
|
|
6
|
+
import { Repeat } from "../../patterns/Repeat";
|
|
7
|
+
import { name } from "./name";
|
|
8
|
+
import { optionalSpaces } from "./optionalSpaces";
|
|
9
|
+
import { stringLiteral } from "./stringLiteral";
|
|
10
|
+
|
|
11
|
+
const propertyName = new Or("property-name", [stringLiteral, name]);
|
|
12
|
+
const property = new And("property", [
|
|
13
|
+
propertyName,
|
|
14
|
+
optionalSpaces,
|
|
15
|
+
new Literal("colon", ":"),
|
|
16
|
+
optionalSpaces,
|
|
17
|
+
new Reference("expression"),
|
|
18
|
+
]);
|
|
19
|
+
const divider = new Regex("property-divider", "\\s*,\\s*");
|
|
20
|
+
const properties = new Repeat("properties", property, divider, true);
|
|
21
|
+
|
|
22
|
+
const objectLiteral = new And("object-literal", [
|
|
23
|
+
new Literal("open-curly-bracket", "{"),
|
|
24
|
+
optionalSpaces,
|
|
25
|
+
properties,
|
|
26
|
+
optionalSpaces,
|
|
27
|
+
new Literal("close-curly-bracket", "}"),
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
export { objectLiteral }
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Regex } from "../../patterns/Regex";
|
|
4
|
+
import { Repeat } from "../../patterns/Repeat";
|
|
5
|
+
import { name } from "./name";
|
|
6
|
+
|
|
7
|
+
const divider = new Regex(",", "\\s*[,]\\s*");
|
|
8
|
+
divider.setTokens([", "]);
|
|
9
|
+
|
|
10
|
+
const optionalSpace = new Regex("optional-space", "\\s", true)
|
|
11
|
+
|
|
12
|
+
const parameters = new And("parameters", [
|
|
13
|
+
new Literal("open-paren", "("),
|
|
14
|
+
optionalSpace,
|
|
15
|
+
new Repeat("arguments", name, divider),
|
|
16
|
+
optionalSpace,
|
|
17
|
+
new Literal("close-paren", ")"),
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
export { parameters }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Literal } from "../../patterns/Literal";
|
|
2
|
+
import { Or } from "../../patterns/Or";
|
|
3
|
+
import { Regex } from "../../patterns/Regex";
|
|
4
|
+
|
|
5
|
+
const prefixOperator = new Or("prefix-operator", [
|
|
6
|
+
new Literal("typeof", "typeof "),
|
|
7
|
+
new Literal("to-number", "+"),
|
|
8
|
+
new Literal("negate", "-"),
|
|
9
|
+
new Literal("logical-not", "!"),
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
export { prefixOperator }
|
|
13
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { And } from "../../patterns/And";
|
|
2
|
+
import { Literal } from "../../patterns/Literal";
|
|
3
|
+
import { Or } from "../../patterns/Or";
|
|
4
|
+
import { Reference } from "../../patterns/Reference";
|
|
5
|
+
import { name } from "./name";
|
|
6
|
+
|
|
7
|
+
const dotPropertyAccess = new And("dot-property-access", [
|
|
8
|
+
new Literal("period", "."),
|
|
9
|
+
name
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
const bracketPropertyAccess = new And("bracket-property-access", [
|
|
13
|
+
new Literal("open-square-bracket", "["),
|
|
14
|
+
new Reference("expression"),
|
|
15
|
+
new Literal("close-square-bracket", "]"),
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
const propertyAccess = new Or("property-access", [
|
|
19
|
+
dotPropertyAccess,
|
|
20
|
+
bracketPropertyAccess,
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
export { propertyAccess }
|