spex-parser 0.1.2 → 0.1.4
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/.github/workflows/ci.yml +1 -1
- package/.github/workflows/publish.yml +9 -21
- package/README.md +57 -24
- package/dist/ast.d.ts +22 -2
- package/dist/ast.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lexer.d.ts +3 -0
- package/dist/lexer.d.ts.map +1 -1
- package/dist/lexer.js +15 -0
- package/dist/lexer.js.map +1 -1
- package/dist/parser.d.ts +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +13 -1
- package/dist/parser.js.map +1 -1
- package/dist/visitor.d.ts +4 -1
- package/dist/visitor.d.ts.map +1 -1
- package/dist/visitor.js +31 -2
- package/dist/visitor.js.map +1 -1
- package/package.json +1 -1
- package/src/ast.ts +10 -0
- package/src/index.ts +6 -0
- package/src/lexer.ts +15 -0
- package/src/parser.ts +16 -0
- package/src/visitor.ts +14 -0
- package/tests/e2e.test.ts +1 -1
- package/tests/lexer.test.ts +14 -4
- package/tests/parser.test.ts +63 -0
- package/tests/props/todo.spex +3 -1
- package/tests/visitor.test.ts +89 -0
package/.github/workflows/ci.yml
CHANGED
|
@@ -5,33 +5,21 @@ on:
|
|
|
5
5
|
types: [published]
|
|
6
6
|
|
|
7
7
|
permissions:
|
|
8
|
+
id-token: write # Required for OIDC
|
|
8
9
|
contents: read
|
|
9
|
-
id-token: write
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
12
|
publish:
|
|
13
|
-
name: Publish to npm
|
|
14
13
|
runs-on: ubuntu-latest
|
|
15
|
-
|
|
16
14
|
steps:
|
|
17
|
-
-
|
|
18
|
-
uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/checkout@v6
|
|
19
16
|
|
|
20
|
-
-
|
|
21
|
-
uses: actions/setup-node@v4
|
|
17
|
+
- uses: actions/setup-node@v6
|
|
22
18
|
with:
|
|
23
|
-
node-version: '
|
|
19
|
+
node-version: '24'
|
|
24
20
|
registry-url: 'https://registry.npmjs.org'
|
|
25
|
-
cache:
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- name: Build
|
|
31
|
-
run: npm run build
|
|
32
|
-
|
|
33
|
-
- name: Run tests
|
|
34
|
-
run: npm test
|
|
35
|
-
|
|
36
|
-
- name: Publish to npm
|
|
37
|
-
run: npm publish --access public
|
|
21
|
+
package-manager-cache: false # never use caching in release builds
|
|
22
|
+
- run: npm ci
|
|
23
|
+
- run: npm run build --if-present
|
|
24
|
+
- run: npm test
|
|
25
|
+
- run: npm publish
|
package/README.md
CHANGED
|
@@ -10,18 +10,18 @@ In particular, Spex aims to solve the following problems:
|
|
|
10
10
|
- Chat interfaces do not integrate well with existing software engineering tools such as version control systems.
|
|
11
11
|
- Referencing objects in the code base requires repetitive and verbose prompts.
|
|
12
12
|
- Because architecture and design are not persisted, AI agents must constantly read and reason about multiple files, leading to inefficient token usage.
|
|
13
|
-
- Reusability in chat interfaces is extremely limited and abstraction is arbitrary.
|
|
13
|
+
- Reusability in chat interfaces is extremely limited and abstraction is arbitrary.
|
|
14
14
|
|
|
15
15
|
The idea behind chat interfaces in AI coding tools is that _everyone_ should be able to code. While admirable, this approach often makes the tools inadequate for professional developers.
|
|
16
16
|
|
|
17
17
|
Spex acknowledges that in serious software projects it is neither wise nor feasible to replace programmers with machines. Instead, Spex integrates with the mental model and ecosystem of professional programmers, enabling them to be significantly more efficient. For this reason, Spex is probably not suited to someone that is not familiar with programming. This is a conscious decision made to cater to the needs of professional programmers and not the general public.
|
|
18
18
|
|
|
19
|
-
For this reason, Spex syntax is intentionally close to common languages such as TypeScript and SQL. Instead of manually implementing software, developers describe
|
|
19
|
+
For this reason, Spex syntax is intentionally close to common languages such as TypeScript and SQL. Instead of manually implementing software, developers describe _spaces of valid implementations_ using familiar programming abstractions such as:
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
- objects
|
|
22
|
+
- functions
|
|
23
|
+
- dependencies
|
|
24
|
+
- constraints
|
|
25
25
|
|
|
26
26
|
The Spex runtime synthesizes concrete implementations based on these specifications.
|
|
27
27
|
|
|
@@ -31,9 +31,9 @@ The Spex runtime synthesizes concrete implementations based on these specificati
|
|
|
31
31
|
|
|
32
32
|
In Spex:
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
- a type represents a space of possible implementations
|
|
35
|
+
- constraints refine that space
|
|
36
|
+
- reusable abstractions are represented as subtypes
|
|
37
37
|
|
|
38
38
|
For example:
|
|
39
39
|
|
|
@@ -56,10 +56,10 @@ Developers can build on top of these abstractions instead of repeatedly specifyi
|
|
|
56
56
|
|
|
57
57
|
Spex is designed to:
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
- feel familiar to software developers
|
|
60
|
+
- resemble SQL-style declarative programming
|
|
61
|
+
- support compositional software synthesis
|
|
62
|
+
- enable reusable architectural abstractions
|
|
63
63
|
|
|
64
64
|
---
|
|
65
65
|
|
|
@@ -124,6 +124,7 @@ string -> number
|
|
|
124
124
|
string -> unit
|
|
125
125
|
unit -> string
|
|
126
126
|
```
|
|
127
|
+
|
|
127
128
|
`string -> unit` represents all functions that take a string as input and do not return anything. `unit -> string` on the other hand, is a function that takes nothing as input, but returns a string.
|
|
128
129
|
|
|
129
130
|
## Subobjects
|
|
@@ -142,7 +143,7 @@ SELECT {
|
|
|
142
143
|
}
|
|
143
144
|
```
|
|
144
145
|
|
|
145
|
-
Subobjects are themselves objects so they could be subobjected as well. A good heuristic for writing constraints is to make the expression read as:
|
|
146
|
+
Subobjects are themselves objects so they could be subobjected as well. A good heuristic for writing constraints is to make the expression read as:
|
|
146
147
|
|
|
147
148
|
> "from `object` select those that `{constraint}`".
|
|
148
149
|
|
|
@@ -204,6 +205,13 @@ SELECT {
|
|
|
204
205
|
|
|
205
206
|
This forms an explicit software dependency graph between objects.
|
|
206
207
|
|
|
208
|
+
The parser automatically extracts references from constraints into structured AST nodes, making it easy to analyze dependencies programmatically. Each constraint is parsed into a sequence of text segments and reference nodes:
|
|
209
|
+
|
|
210
|
+
```spex
|
|
211
|
+
"call @LoadTodos using @path"
|
|
212
|
+
→ [text: "call ", ref: LoadTodos, text: " using ", ref: path]
|
|
213
|
+
```
|
|
214
|
+
|
|
207
215
|
Use `.` to reference a member of a product object:
|
|
208
216
|
|
|
209
217
|
```spex
|
|
@@ -296,15 +304,40 @@ Generation of some object naturally triggers generation of it's dependencies as
|
|
|
296
304
|
|
|
297
305
|
---
|
|
298
306
|
|
|
307
|
+
# Packaging Code
|
|
308
|
+
|
|
309
|
+
To specify how generated code should be packaged, use the `PACKAGE` declaration:
|
|
310
|
+
|
|
311
|
+
```spex
|
|
312
|
+
PACKAGE EXECUTABLE <name> AS <object>
|
|
313
|
+
PACKAGE MODULE <name> AS <object>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
`EXECUTABLE` packages the object as a standalone application entry point. `MODULE` packages it as a library or module that can be imported by other code.
|
|
317
|
+
|
|
318
|
+
```spex
|
|
319
|
+
PACKAGE EXECUTABLE myapp AS Main;
|
|
320
|
+
PACKAGE MODULE mylib AS utils;
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
The object can be any valid Spex expression:
|
|
324
|
+
|
|
325
|
+
```spex
|
|
326
|
+
PACKAGE EXECUTABLE cli AS (path: string) -> unit;
|
|
327
|
+
PACKAGE MODULE mylib AS app.handlers;
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
299
332
|
# Why SQL?
|
|
300
333
|
|
|
301
334
|
Spex uses SQL-inspired syntax because developers already understand:
|
|
302
335
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
336
|
+
- schemas
|
|
337
|
+
- views
|
|
338
|
+
- refinement through selection
|
|
339
|
+
- declarative programming
|
|
340
|
+
- dependency relationships
|
|
308
341
|
|
|
309
342
|
This dramatically reduces the learning curve.
|
|
310
343
|
|
|
@@ -314,10 +347,10 @@ This dramatically reduces the learning curve.
|
|
|
314
347
|
|
|
315
348
|
Spex aims to provide:
|
|
316
349
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
350
|
+
- reusable semantic software abstractions
|
|
351
|
+
- compositional AI-assisted programming
|
|
352
|
+
- declarative architecture specification
|
|
353
|
+
- implementation synthesis guided by constraints
|
|
321
354
|
|
|
322
355
|
Instead of prompting LLMs directly, developers work with structured software semantics that can be analyzed, refined, verified, and synthesized.
|
|
323
356
|
|
|
@@ -507,7 +540,7 @@ SELECT {
|
|
|
507
540
|
## Code Generation
|
|
508
541
|
|
|
509
542
|
```spex
|
|
510
|
-
|
|
543
|
+
package executable MyTodo as Main;
|
|
511
544
|
```
|
|
512
545
|
|
|
513
546
|
This triggers generation of the complete CLI application and all required dependencies.
|
package/dist/ast.d.ts
CHANGED
|
@@ -2,7 +2,14 @@ export type SpexFile = {
|
|
|
2
2
|
kind: 'SpexFile';
|
|
3
3
|
declarations: Declaration[];
|
|
4
4
|
};
|
|
5
|
-
export type Declaration = ObjectDeclaration | ImportDeclaration | ExportDeclaration | GenerateDeclaration;
|
|
5
|
+
export type Declaration = ObjectDeclaration | ImportDeclaration | ExportDeclaration | GenerateDeclaration | PackageDeclaration;
|
|
6
|
+
export type PackageKind = 'EXECUTABLE' | 'MODULE';
|
|
7
|
+
export type PackageDeclaration = {
|
|
8
|
+
kind: 'PackageDeclaration';
|
|
9
|
+
packageType: PackageKind;
|
|
10
|
+
name: string;
|
|
11
|
+
objectName: ObjectExpression;
|
|
12
|
+
};
|
|
6
13
|
export type ObjectDeclaration = {
|
|
7
14
|
kind: 'ObjectDeclaration';
|
|
8
15
|
name: string;
|
|
@@ -36,10 +43,23 @@ export type ExponentialObject = {
|
|
|
36
43
|
base: ObjectExpression;
|
|
37
44
|
exponent: ObjectExpression;
|
|
38
45
|
};
|
|
46
|
+
export type ConstraintReference = {
|
|
47
|
+
kind: 'ConstraintReference';
|
|
48
|
+
name: string;
|
|
49
|
+
};
|
|
50
|
+
export type ConstraintText = {
|
|
51
|
+
kind: 'ConstraintText';
|
|
52
|
+
text: string;
|
|
53
|
+
};
|
|
54
|
+
export type ConstraintPart = ConstraintReference | ConstraintText;
|
|
55
|
+
export type Constraint = {
|
|
56
|
+
raw: string;
|
|
57
|
+
parts: ConstraintPart[];
|
|
58
|
+
};
|
|
39
59
|
export type SubObject = {
|
|
40
60
|
kind: 'SubObject';
|
|
41
61
|
base: ObjectExpression;
|
|
42
|
-
constraint:
|
|
62
|
+
constraint: Constraint;
|
|
43
63
|
};
|
|
44
64
|
export type ArrayObject = {
|
|
45
65
|
kind: 'ArrayObject';
|
package/dist/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,EAAE,WAAW,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,EAAE,WAAW,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,CAAA;AAEtB,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,WAAW,EAAE,WAAW,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,gBAAgB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,aAAa,GACb,iBAAiB,GACjB,SAAS,GACT,WAAW,CAAA;AAEf,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,gBAAgB,CAAA;IACtB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,gBAAgB,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,cAAc,CAAA;AAEjE,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,cAAc,EAAE,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,gBAAgB,CAAA;CACvB,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { SpexLexer } from './lexer.js';
|
|
2
2
|
export { SpexParser } from './parser.js';
|
|
3
3
|
export { SpexParserVisitor, parseToAst } from './visitor.js';
|
|
4
|
-
export type { SpexFile, Declaration, ObjectDeclaration, ObjectExpression, NamedObject, ProductObject, ExponentialObject, SubObject, } from './ast.js';
|
|
4
|
+
export type { SpexFile, Declaration, ObjectDeclaration, ImportDeclaration, ExportDeclaration, ObjectExpression, NamedObject, ProductObject, ExponentialObject, SubObject, ArrayObject, PackageDeclaration, GenerateDeclaration, PackageKind, Constraint, ConstraintPart, ConstraintReference, ConstraintText, } from './ast.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,YAAY,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,YAAY,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,UAAU,CAAA"}
|
package/dist/lexer.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export declare const SelectTok: import("chevrotain").TokenType;
|
|
|
7
7
|
export declare const GenerateTok: import("chevrotain").TokenType;
|
|
8
8
|
export declare const ImportTok: import("chevrotain").TokenType;
|
|
9
9
|
export declare const ExportTok: import("chevrotain").TokenType;
|
|
10
|
+
export declare const PackageTok: import("chevrotain").TokenType;
|
|
11
|
+
export declare const ExecutableTok: import("chevrotain").TokenType;
|
|
12
|
+
export declare const ModuleTok: import("chevrotain").TokenType;
|
|
10
13
|
export declare const ArrowTok: import("chevrotain").TokenType;
|
|
11
14
|
export declare const LCurly: import("chevrotain").TokenType;
|
|
12
15
|
export declare const RCurly: import("chevrotain").TokenType;
|
package/dist/lexer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,UAAU,gCAIrB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,KAAK,gCAGhB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AAGF,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,SAAS,gCAAmD,CAAA;AACzE,eAAO,MAAM,GAAG,gCAA8C,CAAA;AAG9D,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AAGF,eAAO,MAAM,UAAU,gCAGrB,CAAA;AAEF,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,UAAU,gCAIrB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,KAAK,gCAGhB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,UAAU,gCAGrB,CAAA;AACF,eAAO,MAAM,aAAa,gCAGxB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AAGF,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,SAAS,gCAAmD,CAAA;AACzE,eAAO,MAAM,GAAG,gCAA8C,CAAA;AAG9D,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AAGF,eAAO,MAAM,UAAU,gCAGrB,CAAA;AAEF,eAAO,MAAM,SAAS,kCAkCrB,CAAA;AAED,eAAO,MAAM,SAAS,OAAuB,CAAA"}
|
package/dist/lexer.js
CHANGED
|
@@ -33,6 +33,18 @@ export const ExportTok = createToken({
|
|
|
33
33
|
name: 'ExportTok',
|
|
34
34
|
pattern: /export\b/i,
|
|
35
35
|
});
|
|
36
|
+
export const PackageTok = createToken({
|
|
37
|
+
name: 'PackageTok',
|
|
38
|
+
pattern: /package\b/i,
|
|
39
|
+
});
|
|
40
|
+
export const ExecutableTok = createToken({
|
|
41
|
+
name: 'ExecutableTok',
|
|
42
|
+
pattern: /executable\b/i,
|
|
43
|
+
});
|
|
44
|
+
export const ModuleTok = createToken({
|
|
45
|
+
name: 'ModuleTok',
|
|
46
|
+
pattern: /module\b/i,
|
|
47
|
+
});
|
|
36
48
|
// Symbols
|
|
37
49
|
export const ArrowTok = createToken({ name: 'ArrowTok', pattern: /->/ });
|
|
38
50
|
export const LCurly = createToken({ name: 'LCurly', pattern: /{/ });
|
|
@@ -86,6 +98,9 @@ export const allTokens = [
|
|
|
86
98
|
GenerateTok,
|
|
87
99
|
ImportTok,
|
|
88
100
|
ExportTok,
|
|
101
|
+
PackageTok,
|
|
102
|
+
ExecutableTok,
|
|
103
|
+
ModuleTok,
|
|
89
104
|
ArrowTok,
|
|
90
105
|
SelectBlock,
|
|
91
106
|
LCurly,
|
package/dist/lexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
CHANGED
package/dist/parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA+BtC,qBAAa,UAAW,SAAQ,SAAS;;IAMhC,QAAQ,sEAIb;IAEF,OAAO,CAAC,WAAW,CAsBjB;IAEF,OAAO,CAAC,iBAAiB,CAMvB;IAEF,OAAO,CAAC,gBAAgB,CAMtB;IAEF,OAAO,CAAC,aAAa,CAkBnB;IAEF,OAAO,CAAC,WAAW,CAYjB;IAEF,OAAO,CAAC,aAAa,CASnB;IAEF,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,iBAAiB,CAYvB;IAEF,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,YAAY,CAIlB;IAEF,OAAO,CAAC,iBAAiB,CAIvB;IAEF,OAAO,CAAC,mBAAmB,CAIzB;IAEF,OAAO,CAAC,kBAAkB,CAOxB;CACH"}
|
package/dist/parser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CstParser } from 'chevrotain';
|
|
2
|
-
import { allTokens, CreateTok, AsTok, FromTok, SelectTok, GenerateTok, ImportTok, ExportTok, ArrowTok, SelectBlock, LBracket, RBracket, LParen, RParen, Colon, Comma, Semicolon, Dot, Identifier, PathLiteral, StringTok, NumberTok, BoolTok, UnitTok, } from './lexer.js';
|
|
2
|
+
import { allTokens, CreateTok, AsTok, FromTok, SelectTok, GenerateTok, ImportTok, ExportTok, PackageTok, ExecutableTok, ModuleTok, ArrowTok, SelectBlock, LBracket, RBracket, LParen, RParen, Colon, Comma, Semicolon, Dot, Identifier, PathLiteral, StringTok, NumberTok, BoolTok, UnitTok, } from './lexer.js';
|
|
3
3
|
export class SpexParser extends CstParser {
|
|
4
4
|
constructor() {
|
|
5
5
|
super(allTokens);
|
|
@@ -12,6 +12,10 @@ export class SpexParser extends CstParser {
|
|
|
12
12
|
});
|
|
13
13
|
declaration = this.RULE('declaration', () => {
|
|
14
14
|
this.OR([
|
|
15
|
+
{
|
|
16
|
+
GATE: this.BACKTRACK(this.packageDeclaration),
|
|
17
|
+
ALT: () => this.SUBRULE(this.packageDeclaration),
|
|
18
|
+
},
|
|
15
19
|
{
|
|
16
20
|
GATE: this.BACKTRACK(this.objectDeclaration),
|
|
17
21
|
ALT: () => this.SUBRULE(this.objectDeclaration),
|
|
@@ -128,5 +132,13 @@ export class SpexParser extends CstParser {
|
|
|
128
132
|
this.CONSUME(Identifier);
|
|
129
133
|
this.CONSUME(Semicolon);
|
|
130
134
|
});
|
|
135
|
+
packageDeclaration = this.RULE('packageDeclaration', () => {
|
|
136
|
+
this.CONSUME(PackageTok);
|
|
137
|
+
this.OR([{ ALT: () => this.CONSUME(ExecutableTok) }, { ALT: () => this.CONSUME(ModuleTok) }]);
|
|
138
|
+
this.CONSUME(Identifier);
|
|
139
|
+
this.CONSUME(AsTok);
|
|
140
|
+
this.SUBRULE(this.objectExpression);
|
|
141
|
+
this.CONSUME(Semicolon);
|
|
142
|
+
});
|
|
131
143
|
}
|
|
132
144
|
//# sourceMappingURL=parser.js.map
|
package/dist/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/visitor.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ICstVisitor } from 'chevrotain';
|
|
2
|
-
import type { SpexFile, Declaration, ObjectDeclaration, ImportDeclaration, ExportDeclaration, GenerateDeclaration, ObjectExpression, NamedObject, ProductObject, SubObject } from './ast.js';
|
|
2
|
+
import type { SpexFile, Declaration, ObjectDeclaration, ImportDeclaration, ExportDeclaration, GenerateDeclaration, PackageDeclaration, ObjectExpression, NamedObject, ProductObject, SubObject, Constraint } from './ast.js';
|
|
3
3
|
declare const BaseSpexVisitor: new (...args: any[]) => ICstVisitor<any, any>;
|
|
4
|
+
export declare const REFERENCE_PATTERN: RegExp;
|
|
5
|
+
export declare function parseConstraint(raw: string): Constraint;
|
|
4
6
|
export declare class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<any, any> {
|
|
5
7
|
constructor();
|
|
6
8
|
spexFile(ctx: any): SpexFile;
|
|
@@ -15,6 +17,7 @@ export declare class SpexParserVisitor extends BaseSpexVisitor implements ICstVi
|
|
|
15
17
|
namedImport(ctx: any): ImportDeclaration;
|
|
16
18
|
moduleImport(ctx: any): ImportDeclaration;
|
|
17
19
|
exportDeclaration(ctx: any): ExportDeclaration;
|
|
20
|
+
packageDeclaration(ctx: any): PackageDeclaration;
|
|
18
21
|
generateDeclaration(ctx: any): GenerateDeclaration;
|
|
19
22
|
}
|
|
20
23
|
export declare function parseToAst(text: string): SpexFile;
|
package/dist/visitor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,SAAS,
|
|
1
|
+
{"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,SAAS,EAET,UAAU,EAGX,MAAM,UAAU,CAAA;AAKjB,QAAA,MAAM,eAAe,+CAAgD,CAAA;AAErE,eAAO,MAAM,iBAAiB,QAA4C,CAAA;AAE1E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAkBvD;AAED,qBAAa,iBAAkB,SAAQ,eAAgB,YAAW,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;;IAMrF,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ;IAK5B,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAgBlC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAQ9C,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB;IAe5C,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB;IAiBzC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAmBlC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa;IAStC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS;IAU9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAO9C,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAYxC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAWzC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAO9C,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,kBAAkB;IAUhD,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB;CAMnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAWjD"}
|
package/dist/visitor.js
CHANGED
|
@@ -2,6 +2,23 @@ import { SpexLexer } from './lexer.js';
|
|
|
2
2
|
import { SpexParser } from './parser.js';
|
|
3
3
|
const parserInstance = new SpexParser();
|
|
4
4
|
const BaseSpexVisitor = parserInstance.getBaseCstVisitorConstructor();
|
|
5
|
+
export const REFERENCE_PATTERN = /@([a-zA-Z_][\w]*(?:\.[a-zA-Z_][\w]*)*)/g;
|
|
6
|
+
export function parseConstraint(raw) {
|
|
7
|
+
const parts = [];
|
|
8
|
+
let lastIndex = 0;
|
|
9
|
+
let match;
|
|
10
|
+
while ((match = REFERENCE_PATTERN.exec(raw)) !== null) {
|
|
11
|
+
if (match.index > lastIndex) {
|
|
12
|
+
parts.push({ kind: 'ConstraintText', text: raw.slice(lastIndex, match.index) });
|
|
13
|
+
}
|
|
14
|
+
parts.push({ kind: 'ConstraintReference', name: match[1] });
|
|
15
|
+
lastIndex = match.index + match[0].length;
|
|
16
|
+
}
|
|
17
|
+
if (lastIndex < raw.length) {
|
|
18
|
+
parts.push({ kind: 'ConstraintText', text: raw.slice(lastIndex) });
|
|
19
|
+
}
|
|
20
|
+
return { raw, parts };
|
|
21
|
+
}
|
|
5
22
|
export class SpexParserVisitor extends BaseSpexVisitor {
|
|
6
23
|
constructor() {
|
|
7
24
|
super();
|
|
@@ -12,6 +29,9 @@ export class SpexParserVisitor extends BaseSpexVisitor {
|
|
|
12
29
|
return { kind: 'SpexFile', declarations };
|
|
13
30
|
}
|
|
14
31
|
declaration(ctx) {
|
|
32
|
+
if (ctx.packageDeclaration) {
|
|
33
|
+
return this.visit(ctx.packageDeclaration);
|
|
34
|
+
}
|
|
15
35
|
if (ctx.objectDeclaration) {
|
|
16
36
|
return this.visit(ctx.objectDeclaration);
|
|
17
37
|
}
|
|
@@ -94,11 +114,11 @@ export class SpexParserVisitor extends BaseSpexVisitor {
|
|
|
94
114
|
}
|
|
95
115
|
subObject(ctx) {
|
|
96
116
|
const rawText = ctx.SelectBlock[0].image;
|
|
97
|
-
const
|
|
117
|
+
const rawConstraint = rawText.slice(1, -1).trim();
|
|
98
118
|
return {
|
|
99
119
|
kind: 'SubObject',
|
|
100
120
|
base: this.visit(ctx.base),
|
|
101
|
-
constraint,
|
|
121
|
+
constraint: parseConstraint(rawConstraint),
|
|
102
122
|
};
|
|
103
123
|
}
|
|
104
124
|
importDeclaration(ctx) {
|
|
@@ -134,6 +154,15 @@ export class SpexParserVisitor extends BaseSpexVisitor {
|
|
|
134
154
|
name: ctx.Identifier[0].image,
|
|
135
155
|
};
|
|
136
156
|
}
|
|
157
|
+
packageDeclaration(ctx) {
|
|
158
|
+
const packageType = ctx.ExecutableTok ? 'EXECUTABLE' : 'MODULE';
|
|
159
|
+
return {
|
|
160
|
+
kind: 'PackageDeclaration',
|
|
161
|
+
packageType,
|
|
162
|
+
name: ctx.Identifier[0].image,
|
|
163
|
+
objectName: this.visit(ctx.objectExpression),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
137
166
|
generateDeclaration(ctx) {
|
|
138
167
|
return {
|
|
139
168
|
kind: 'GenerateDeclaration',
|
package/dist/visitor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/ast.ts
CHANGED
|
@@ -8,6 +8,16 @@ export type Declaration =
|
|
|
8
8
|
| ImportDeclaration
|
|
9
9
|
| ExportDeclaration
|
|
10
10
|
| GenerateDeclaration
|
|
11
|
+
| PackageDeclaration
|
|
12
|
+
|
|
13
|
+
export type PackageKind = 'EXECUTABLE' | 'MODULE'
|
|
14
|
+
|
|
15
|
+
export type PackageDeclaration = {
|
|
16
|
+
kind: 'PackageDeclaration'
|
|
17
|
+
packageType: PackageKind
|
|
18
|
+
name: string
|
|
19
|
+
objectName: ObjectExpression
|
|
20
|
+
}
|
|
11
21
|
|
|
12
22
|
export type ObjectDeclaration = {
|
|
13
23
|
kind: 'ObjectDeclaration'
|
package/src/index.ts
CHANGED
|
@@ -5,11 +5,17 @@ export type {
|
|
|
5
5
|
SpexFile,
|
|
6
6
|
Declaration,
|
|
7
7
|
ObjectDeclaration,
|
|
8
|
+
ImportDeclaration,
|
|
9
|
+
ExportDeclaration,
|
|
8
10
|
ObjectExpression,
|
|
9
11
|
NamedObject,
|
|
10
12
|
ProductObject,
|
|
11
13
|
ExponentialObject,
|
|
12
14
|
SubObject,
|
|
15
|
+
ArrayObject,
|
|
16
|
+
PackageDeclaration,
|
|
17
|
+
GenerateDeclaration,
|
|
18
|
+
PackageKind,
|
|
13
19
|
Constraint,
|
|
14
20
|
ConstraintPart,
|
|
15
21
|
ConstraintReference,
|
package/src/lexer.ts
CHANGED
|
@@ -35,6 +35,18 @@ export const ExportTok = createToken({
|
|
|
35
35
|
name: 'ExportTok',
|
|
36
36
|
pattern: /export\b/i,
|
|
37
37
|
})
|
|
38
|
+
export const PackageTok = createToken({
|
|
39
|
+
name: 'PackageTok',
|
|
40
|
+
pattern: /package\b/i,
|
|
41
|
+
})
|
|
42
|
+
export const ExecutableTok = createToken({
|
|
43
|
+
name: 'ExecutableTok',
|
|
44
|
+
pattern: /executable\b/i,
|
|
45
|
+
})
|
|
46
|
+
export const ModuleTok = createToken({
|
|
47
|
+
name: 'ModuleTok',
|
|
48
|
+
pattern: /module\b/i,
|
|
49
|
+
})
|
|
38
50
|
|
|
39
51
|
// Symbols
|
|
40
52
|
export const ArrowTok = createToken({ name: 'ArrowTok', pattern: /->/ })
|
|
@@ -95,6 +107,9 @@ export const allTokens = [
|
|
|
95
107
|
GenerateTok,
|
|
96
108
|
ImportTok,
|
|
97
109
|
ExportTok,
|
|
110
|
+
PackageTok,
|
|
111
|
+
ExecutableTok,
|
|
112
|
+
ModuleTok,
|
|
98
113
|
|
|
99
114
|
ArrowTok,
|
|
100
115
|
SelectBlock,
|
package/src/parser.ts
CHANGED
|
@@ -8,6 +8,9 @@ import {
|
|
|
8
8
|
GenerateTok,
|
|
9
9
|
ImportTok,
|
|
10
10
|
ExportTok,
|
|
11
|
+
PackageTok,
|
|
12
|
+
ExecutableTok,
|
|
13
|
+
ModuleTok,
|
|
11
14
|
ArrowTok,
|
|
12
15
|
SelectBlock,
|
|
13
16
|
LBracket,
|
|
@@ -40,6 +43,10 @@ export class SpexParser extends CstParser {
|
|
|
40
43
|
|
|
41
44
|
private declaration = this.RULE('declaration', () => {
|
|
42
45
|
this.OR([
|
|
46
|
+
{
|
|
47
|
+
GATE: this.BACKTRACK(this.packageDeclaration),
|
|
48
|
+
ALT: () => this.SUBRULE(this.packageDeclaration),
|
|
49
|
+
},
|
|
43
50
|
{
|
|
44
51
|
GATE: this.BACKTRACK(this.objectDeclaration),
|
|
45
52
|
ALT: () => this.SUBRULE(this.objectDeclaration),
|
|
@@ -167,4 +174,13 @@ export class SpexParser extends CstParser {
|
|
|
167
174
|
this.CONSUME(Identifier)
|
|
168
175
|
this.CONSUME(Semicolon)
|
|
169
176
|
})
|
|
177
|
+
|
|
178
|
+
private packageDeclaration = this.RULE('packageDeclaration', () => {
|
|
179
|
+
this.CONSUME(PackageTok)
|
|
180
|
+
this.OR([{ ALT: () => this.CONSUME(ExecutableTok) }, { ALT: () => this.CONSUME(ModuleTok) }])
|
|
181
|
+
this.CONSUME(Identifier)
|
|
182
|
+
this.CONSUME(AsTok)
|
|
183
|
+
this.SUBRULE(this.objectExpression)
|
|
184
|
+
this.CONSUME(Semicolon)
|
|
185
|
+
})
|
|
170
186
|
}
|
package/src/visitor.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
ImportDeclaration,
|
|
7
7
|
ExportDeclaration,
|
|
8
8
|
GenerateDeclaration,
|
|
9
|
+
PackageDeclaration,
|
|
9
10
|
ObjectExpression,
|
|
10
11
|
NamedObject,
|
|
11
12
|
ProductObject,
|
|
@@ -55,6 +56,9 @@ export class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<an
|
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
declaration(ctx: any): Declaration {
|
|
59
|
+
if (ctx.packageDeclaration) {
|
|
60
|
+
return this.visit(ctx.packageDeclaration)
|
|
61
|
+
}
|
|
58
62
|
if (ctx.objectDeclaration) {
|
|
59
63
|
return this.visit(ctx.objectDeclaration)
|
|
60
64
|
}
|
|
@@ -182,6 +186,16 @@ export class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<an
|
|
|
182
186
|
}
|
|
183
187
|
}
|
|
184
188
|
|
|
189
|
+
packageDeclaration(ctx: any): PackageDeclaration {
|
|
190
|
+
const packageType = ctx.ExecutableTok ? ('EXECUTABLE' as const) : ('MODULE' as const)
|
|
191
|
+
return {
|
|
192
|
+
kind: 'PackageDeclaration',
|
|
193
|
+
packageType,
|
|
194
|
+
name: ctx.Identifier[0].image,
|
|
195
|
+
objectName: this.visit(ctx.objectExpression),
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
185
199
|
generateDeclaration(ctx: any): GenerateDeclaration {
|
|
186
200
|
return {
|
|
187
201
|
kind: 'GenerateDeclaration',
|
package/tests/e2e.test.ts
CHANGED
|
@@ -12,6 +12,6 @@ describe('end-to-end', () => {
|
|
|
12
12
|
const code = readFileSync(join(__dirname, 'props/todo.spex'), 'utf-8')
|
|
13
13
|
const ast = parseToAst(code)
|
|
14
14
|
expect(ast.kind).toBe('SpexFile')
|
|
15
|
-
expect(ast.declarations.length).toBe(
|
|
15
|
+
expect(ast.declarations.length).toBe(15)
|
|
16
16
|
})
|
|
17
17
|
})
|
package/tests/lexer.test.ts
CHANGED
|
@@ -4,7 +4,9 @@ import { SpexLexer } from '../src/lexer.js'
|
|
|
4
4
|
describe('SpexLexer', () => {
|
|
5
5
|
describe('tokenization', () => {
|
|
6
6
|
it('should tokenize keywords', () => {
|
|
7
|
-
const result = SpexLexer.tokenize(
|
|
7
|
+
const result = SpexLexer.tokenize(
|
|
8
|
+
'create as from select generate import export package executable module'
|
|
9
|
+
)
|
|
8
10
|
expect(result.errors).toHaveLength(0)
|
|
9
11
|
expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
|
|
10
12
|
'CreateTok',
|
|
@@ -14,11 +16,16 @@ describe('SpexLexer', () => {
|
|
|
14
16
|
'GenerateTok',
|
|
15
17
|
'ImportTok',
|
|
16
18
|
'ExportTok',
|
|
19
|
+
'PackageTok',
|
|
20
|
+
'ExecutableTok',
|
|
21
|
+
'ModuleTok',
|
|
17
22
|
])
|
|
18
23
|
})
|
|
19
24
|
|
|
20
25
|
it('should tokenize keywords case-insensitively', () => {
|
|
21
|
-
const result = SpexLexer.tokenize(
|
|
26
|
+
const result = SpexLexer.tokenize(
|
|
27
|
+
'CREATE AS FROM SELECT GENERATE IMPORT EXPORT PACKAGE EXECUTABLE MODULE'
|
|
28
|
+
)
|
|
22
29
|
expect(result.errors).toHaveLength(0)
|
|
23
30
|
expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
|
|
24
31
|
'CreateTok',
|
|
@@ -28,6 +35,9 @@ describe('SpexLexer', () => {
|
|
|
28
35
|
'GenerateTok',
|
|
29
36
|
'ImportTok',
|
|
30
37
|
'ExportTok',
|
|
38
|
+
'PackageTok',
|
|
39
|
+
'ExecutableTok',
|
|
40
|
+
'ModuleTok',
|
|
31
41
|
])
|
|
32
42
|
})
|
|
33
43
|
|
|
@@ -79,10 +89,10 @@ describe('SpexLexer', () => {
|
|
|
79
89
|
|
|
80
90
|
it('should handle keywords with word boundary', () => {
|
|
81
91
|
const result = SpexLexer.tokenize(
|
|
82
|
-
'createfoo foocreate asfoo fooas fooselect selectfoo foofrom fromfoo generatefoo foogenerate importfoo fooimport exportfoo fooexport'
|
|
92
|
+
'createfoo foocreate asfoo fooas fooselect selectfoo foofrom fromfoo generatefoo foogenerate importfoo fooimport exportfoo fooexport packagefoo fopackage executablefoo foexecutable modulefoo fomodule'
|
|
83
93
|
)
|
|
84
94
|
expect(result.errors).toHaveLength(0)
|
|
85
|
-
expect(result.tokens.map((t) => t.tokenType.name)).toEqual(Array(
|
|
95
|
+
expect(result.tokens.map((t) => t.tokenType.name)).toEqual(Array(20).fill('Identifier'))
|
|
86
96
|
})
|
|
87
97
|
|
|
88
98
|
it('should tokenize the text between braces', () => {
|
package/tests/parser.test.ts
CHANGED
|
@@ -212,6 +212,69 @@ describe('SpexParser', () => {
|
|
|
212
212
|
})
|
|
213
213
|
})
|
|
214
214
|
|
|
215
|
+
describe('package declaration', () => {
|
|
216
|
+
it('should parse package executable declaration', () => {
|
|
217
|
+
const testCase = 'package executable myapp as Main;'
|
|
218
|
+
const { parser } = parseInput(testCase)
|
|
219
|
+
expect(parser.errors).toHaveLength(0)
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
it('should parse package module declaration', () => {
|
|
223
|
+
const testCase = 'package module mylib as utils;'
|
|
224
|
+
const { parser } = parseInput(testCase)
|
|
225
|
+
expect(parser.errors).toHaveLength(0)
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
it('should parse package executable with exponential object', () => {
|
|
229
|
+
const testCase = 'package executable cli as (path: string) -> unit;'
|
|
230
|
+
const { parser } = parseInput(testCase)
|
|
231
|
+
expect(parser.errors).toHaveLength(0)
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
it('should parse package executable with dotted name', () => {
|
|
235
|
+
const testCase = 'package executable myapp as app.Main;'
|
|
236
|
+
const { parser } = parseInput(testCase)
|
|
237
|
+
expect(parser.errors).toHaveLength(0)
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
it('should parse package module with array type', () => {
|
|
241
|
+
const testCase = 'package module mylib as string[];'
|
|
242
|
+
const { parser } = parseInput(testCase)
|
|
243
|
+
expect(parser.errors).toHaveLength(0)
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
it('should parse package executable with product type', () => {
|
|
247
|
+
const testCase = 'package module mylib as (name: string, count: number);'
|
|
248
|
+
const { parser } = parseInput(testCase)
|
|
249
|
+
expect(parser.errors).toHaveLength(0)
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
it('should parse package executable with subobject', () => {
|
|
253
|
+
const testCase = 'package executable myapp as from string select { is a valid command };'
|
|
254
|
+
const { parser } = parseInput(testCase)
|
|
255
|
+
expect(parser.errors).toHaveLength(0)
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
it('should parse package declaration case-insensitively', () => {
|
|
259
|
+
const testCase = 'PACKAGE EXECUTABLE myapp AS Main;'
|
|
260
|
+
const { parser } = parseInput(testCase)
|
|
261
|
+
expect(parser.errors).toHaveLength(0)
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
it('should parse mixed package and generate declarations', () => {
|
|
265
|
+
const testCase = 'package executable myapp as Main;\ngenerate Main;'
|
|
266
|
+
const { parser } = parseInput(testCase)
|
|
267
|
+
expect(parser.errors).toHaveLength(0)
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
it('should parse package declaration with complex nested type', () => {
|
|
271
|
+
const testCase =
|
|
272
|
+
'package module mylib as from (x: number, y: number) -> number select { computes distance };'
|
|
273
|
+
const { parser } = parseInput(testCase)
|
|
274
|
+
expect(parser.errors).toHaveLength(0)
|
|
275
|
+
})
|
|
276
|
+
})
|
|
277
|
+
|
|
215
278
|
describe('multiple declarations', () => {
|
|
216
279
|
it('should parse multiple declarations', () => {
|
|
217
280
|
const testCase = `
|
package/tests/props/todo.spex
CHANGED
package/tests/visitor.test.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ImportDeclaration,
|
|
6
6
|
ExportDeclaration,
|
|
7
7
|
GenerateDeclaration,
|
|
8
|
+
PackageDeclaration,
|
|
8
9
|
Constraint,
|
|
9
10
|
} from '../src/ast.js'
|
|
10
11
|
|
|
@@ -594,4 +595,92 @@ describe('SpexParserVisitor', () => {
|
|
|
594
595
|
expect(result.raw).toBe(' @foo ')
|
|
595
596
|
})
|
|
596
597
|
})
|
|
598
|
+
|
|
599
|
+
describe('package declaration', () => {
|
|
600
|
+
it('should convert package executable declaration to AST', () => {
|
|
601
|
+
const testCase = 'package executable myapp as Main;'
|
|
602
|
+
const ast = parseToAst(testCase)
|
|
603
|
+
const decl = ast.declarations[0] as PackageDeclaration
|
|
604
|
+
expect(decl).toEqual({
|
|
605
|
+
kind: 'PackageDeclaration',
|
|
606
|
+
packageType: 'EXECUTABLE',
|
|
607
|
+
name: 'myapp',
|
|
608
|
+
objectName: { kind: 'NamedObject', name: 'Main' },
|
|
609
|
+
})
|
|
610
|
+
})
|
|
611
|
+
|
|
612
|
+
it('should convert package module declaration to AST', () => {
|
|
613
|
+
const testCase = 'package module mylib as utils;'
|
|
614
|
+
const ast = parseToAst(testCase)
|
|
615
|
+
const decl = ast.declarations[0] as PackageDeclaration
|
|
616
|
+
expect(decl).toEqual({
|
|
617
|
+
kind: 'PackageDeclaration',
|
|
618
|
+
packageType: 'MODULE',
|
|
619
|
+
name: 'mylib',
|
|
620
|
+
objectName: { kind: 'NamedObject', name: 'utils' },
|
|
621
|
+
})
|
|
622
|
+
})
|
|
623
|
+
|
|
624
|
+
it('should convert package executable with complex object to AST', () => {
|
|
625
|
+
const testCase = 'package executable cli as (path: string) -> unit;'
|
|
626
|
+
const ast = parseToAst(testCase)
|
|
627
|
+
const decl = ast.declarations[0] as PackageDeclaration
|
|
628
|
+
expect(decl).toEqual({
|
|
629
|
+
kind: 'PackageDeclaration',
|
|
630
|
+
packageType: 'EXECUTABLE',
|
|
631
|
+
name: 'cli',
|
|
632
|
+
objectName: {
|
|
633
|
+
kind: 'ExponentialObject',
|
|
634
|
+
exponent: {
|
|
635
|
+
kind: 'ProductObject',
|
|
636
|
+
fields: { path: { kind: 'NamedObject', name: 'string' } },
|
|
637
|
+
},
|
|
638
|
+
base: { kind: 'NamedObject', name: 'unit' },
|
|
639
|
+
},
|
|
640
|
+
})
|
|
641
|
+
})
|
|
642
|
+
|
|
643
|
+
it('should convert package executable with dotted name to AST', () => {
|
|
644
|
+
const testCase = 'package executable myapp as app.Main;'
|
|
645
|
+
const ast = parseToAst(testCase)
|
|
646
|
+
const decl = ast.declarations[0] as PackageDeclaration
|
|
647
|
+
expect(decl).toEqual({
|
|
648
|
+
kind: 'PackageDeclaration',
|
|
649
|
+
packageType: 'EXECUTABLE',
|
|
650
|
+
name: 'myapp',
|
|
651
|
+
objectName: { kind: 'NamedObject', name: 'app.Main' },
|
|
652
|
+
})
|
|
653
|
+
})
|
|
654
|
+
|
|
655
|
+
it('should convert package executable with array type to AST', () => {
|
|
656
|
+
const testCase = 'package module mylib as string[];'
|
|
657
|
+
const ast = parseToAst(testCase)
|
|
658
|
+
const decl = ast.declarations[0] as PackageDeclaration
|
|
659
|
+
expect(decl).toEqual({
|
|
660
|
+
kind: 'PackageDeclaration',
|
|
661
|
+
packageType: 'MODULE',
|
|
662
|
+
name: 'mylib',
|
|
663
|
+
objectName: { kind: 'ArrayObject', base: { kind: 'NamedObject', name: 'string' } },
|
|
664
|
+
})
|
|
665
|
+
})
|
|
666
|
+
|
|
667
|
+
it('should convert mixed declarations with package to AST', () => {
|
|
668
|
+
const testCase = 'create Main as Number;\npackage executable myapp as Main;'
|
|
669
|
+
const ast = parseToAst(testCase)
|
|
670
|
+
expect(ast.declarations).toHaveLength(2)
|
|
671
|
+
const createDecl = ast.declarations[0] as ObjectDeclaration
|
|
672
|
+
expect(createDecl).toEqual({
|
|
673
|
+
kind: 'ObjectDeclaration',
|
|
674
|
+
name: 'Main',
|
|
675
|
+
object: { kind: 'NamedObject', name: 'Number' },
|
|
676
|
+
})
|
|
677
|
+
const packageDecl = ast.declarations[1] as PackageDeclaration
|
|
678
|
+
expect(packageDecl).toEqual({
|
|
679
|
+
kind: 'PackageDeclaration',
|
|
680
|
+
packageType: 'EXECUTABLE',
|
|
681
|
+
name: 'myapp',
|
|
682
|
+
objectName: { kind: 'NamedObject', name: 'Main' },
|
|
683
|
+
})
|
|
684
|
+
})
|
|
685
|
+
})
|
|
597
686
|
})
|