spex-parser 0.1.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/.github/workflows/ci.yml +37 -0
- package/.github/workflows/publish.yml +35 -0
- package/.prettierrc +8 -0
- package/LICENSE +7 -0
- package/README.md +513 -0
- package/dist/ast.d.ts +48 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +30 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +109 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +18 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +132 -0
- package/dist/parser.js.map +1 -0
- package/dist/visitor.d.ts +22 -0
- package/dist/visitor.d.ts.map +1 -0
- package/dist/visitor.js +154 -0
- package/dist/visitor.js.map +1 -0
- package/eslint.config.js +27 -0
- package/package.json +45 -0
- package/src/ast.ts +67 -0
- package/src/index.ts +13 -0
- package/src/lexer.ts +121 -0
- package/src/parser.ts +170 -0
- package/src/visitor.ts +179 -0
- package/tests/e2e.test.ts +17 -0
- package/tests/lexer.test.ts +123 -0
- package/tests/parser.test.ts +227 -0
- package/tests/props/todo.spex +83 -0
- package/tests/visitor.test.ts +463 -0
- package/tsconfig.json +47 -0
package/dist/lexer.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Lexer } from 'chevrotain';
|
|
2
|
+
export declare const WhiteSpace: import("chevrotain").TokenType;
|
|
3
|
+
export declare const CreateTok: import("chevrotain").TokenType;
|
|
4
|
+
export declare const AsTok: import("chevrotain").TokenType;
|
|
5
|
+
export declare const FromTok: import("chevrotain").TokenType;
|
|
6
|
+
export declare const SelectTok: import("chevrotain").TokenType;
|
|
7
|
+
export declare const GenerateTok: import("chevrotain").TokenType;
|
|
8
|
+
export declare const ImportTok: import("chevrotain").TokenType;
|
|
9
|
+
export declare const ExportTok: import("chevrotain").TokenType;
|
|
10
|
+
export declare const ArrowTok: import("chevrotain").TokenType;
|
|
11
|
+
export declare const LCurly: import("chevrotain").TokenType;
|
|
12
|
+
export declare const RCurly: import("chevrotain").TokenType;
|
|
13
|
+
export declare const LBracket: import("chevrotain").TokenType;
|
|
14
|
+
export declare const RBracket: import("chevrotain").TokenType;
|
|
15
|
+
export declare const LParen: import("chevrotain").TokenType;
|
|
16
|
+
export declare const RParen: import("chevrotain").TokenType;
|
|
17
|
+
export declare const Colon: import("chevrotain").TokenType;
|
|
18
|
+
export declare const Comma: import("chevrotain").TokenType;
|
|
19
|
+
export declare const Semicolon: import("chevrotain").TokenType;
|
|
20
|
+
export declare const Dot: import("chevrotain").TokenType;
|
|
21
|
+
export declare const SelectBlock: import("chevrotain").TokenType;
|
|
22
|
+
export declare const PathLiteral: import("chevrotain").TokenType;
|
|
23
|
+
export declare const StringTok: import("chevrotain").TokenType;
|
|
24
|
+
export declare const NumberTok: import("chevrotain").TokenType;
|
|
25
|
+
export declare const BoolTok: import("chevrotain").TokenType;
|
|
26
|
+
export declare const UnitTok: import("chevrotain").TokenType;
|
|
27
|
+
export declare const Identifier: import("chevrotain").TokenType;
|
|
28
|
+
export declare const allTokens: import("chevrotain").TokenType[];
|
|
29
|
+
export declare const SpexLexer: Lexer;
|
|
30
|
+
//# sourceMappingURL=lexer.d.ts.map
|
|
@@ -0,0 +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,kCA+BrB,CAAA;AAED,eAAO,MAAM,SAAS,OAAuB,CAAA"}
|
package/dist/lexer.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createToken, Lexer } from 'chevrotain';
|
|
2
|
+
export const WhiteSpace = createToken({
|
|
3
|
+
name: 'WhiteSpace',
|
|
4
|
+
pattern: /\s+/,
|
|
5
|
+
group: Lexer.SKIPPED,
|
|
6
|
+
});
|
|
7
|
+
// Keywords (case-insensitive)
|
|
8
|
+
export const CreateTok = createToken({
|
|
9
|
+
name: 'CreateTok',
|
|
10
|
+
pattern: /create\b/i,
|
|
11
|
+
});
|
|
12
|
+
export const AsTok = createToken({
|
|
13
|
+
name: 'AsTok',
|
|
14
|
+
pattern: /as\b/i,
|
|
15
|
+
});
|
|
16
|
+
export const FromTok = createToken({
|
|
17
|
+
name: 'FromTok',
|
|
18
|
+
pattern: /from\b/i,
|
|
19
|
+
});
|
|
20
|
+
export const SelectTok = createToken({
|
|
21
|
+
name: 'SelectTok',
|
|
22
|
+
pattern: /select\b/i,
|
|
23
|
+
});
|
|
24
|
+
export const GenerateTok = createToken({
|
|
25
|
+
name: 'GenerateTok',
|
|
26
|
+
pattern: /generate\b/i,
|
|
27
|
+
});
|
|
28
|
+
export const ImportTok = createToken({
|
|
29
|
+
name: 'ImportTok',
|
|
30
|
+
pattern: /import\b/i,
|
|
31
|
+
});
|
|
32
|
+
export const ExportTok = createToken({
|
|
33
|
+
name: 'ExportTok',
|
|
34
|
+
pattern: /export\b/i,
|
|
35
|
+
});
|
|
36
|
+
// Symbols
|
|
37
|
+
export const ArrowTok = createToken({ name: 'ArrowTok', pattern: /->/ });
|
|
38
|
+
export const LCurly = createToken({ name: 'LCurly', pattern: /{/ });
|
|
39
|
+
export const RCurly = createToken({ name: 'RCurly', pattern: /}/ });
|
|
40
|
+
export const LBracket = createToken({ name: 'LBracket', pattern: /\[/ });
|
|
41
|
+
export const RBracket = createToken({ name: 'RBracket', pattern: /\]/ });
|
|
42
|
+
export const LParen = createToken({ name: 'LParen', pattern: /\(/ });
|
|
43
|
+
export const RParen = createToken({ name: 'RParen', pattern: /\)/ });
|
|
44
|
+
export const Colon = createToken({ name: 'Colon', pattern: /:/ });
|
|
45
|
+
export const Comma = createToken({ name: 'Comma', pattern: /,/ });
|
|
46
|
+
export const Semicolon = createToken({ name: 'Semicolon', pattern: /;/ });
|
|
47
|
+
export const Dot = createToken({ name: 'Dot', pattern: /\./ });
|
|
48
|
+
// Brace text block (for SELECT { ... })
|
|
49
|
+
export const SelectBlock = createToken({
|
|
50
|
+
name: 'SelectBlock',
|
|
51
|
+
pattern: /\{[^}]+\}/,
|
|
52
|
+
});
|
|
53
|
+
// Literals
|
|
54
|
+
export const PathLiteral = createToken({
|
|
55
|
+
name: 'PathLiteral',
|
|
56
|
+
pattern: /"([^"\\]|\\.)*"/,
|
|
57
|
+
});
|
|
58
|
+
// Basic objects (native types)
|
|
59
|
+
export const StringTok = createToken({
|
|
60
|
+
name: 'StringTok',
|
|
61
|
+
pattern: /string\b/i,
|
|
62
|
+
});
|
|
63
|
+
export const NumberTok = createToken({
|
|
64
|
+
name: 'NumberTok',
|
|
65
|
+
pattern: /number\b/i,
|
|
66
|
+
});
|
|
67
|
+
export const BoolTok = createToken({
|
|
68
|
+
name: 'BoolTok',
|
|
69
|
+
pattern: /bool\b/i,
|
|
70
|
+
});
|
|
71
|
+
export const UnitTok = createToken({
|
|
72
|
+
name: 'UnitTok',
|
|
73
|
+
pattern: /unit\b/i,
|
|
74
|
+
});
|
|
75
|
+
// Identifiers
|
|
76
|
+
export const Identifier = createToken({
|
|
77
|
+
name: 'Identifier',
|
|
78
|
+
pattern: /[a-zA-Z_][a-zA-Z0-9_]*/,
|
|
79
|
+
});
|
|
80
|
+
export const allTokens = [
|
|
81
|
+
WhiteSpace,
|
|
82
|
+
CreateTok,
|
|
83
|
+
AsTok,
|
|
84
|
+
FromTok,
|
|
85
|
+
SelectTok,
|
|
86
|
+
GenerateTok,
|
|
87
|
+
ImportTok,
|
|
88
|
+
ExportTok,
|
|
89
|
+
ArrowTok,
|
|
90
|
+
SelectBlock,
|
|
91
|
+
LCurly,
|
|
92
|
+
RCurly,
|
|
93
|
+
LBracket,
|
|
94
|
+
RBracket,
|
|
95
|
+
LParen,
|
|
96
|
+
RParen,
|
|
97
|
+
Colon,
|
|
98
|
+
Comma,
|
|
99
|
+
Semicolon,
|
|
100
|
+
Dot,
|
|
101
|
+
PathLiteral,
|
|
102
|
+
StringTok,
|
|
103
|
+
NumberTok,
|
|
104
|
+
BoolTok,
|
|
105
|
+
UnitTok,
|
|
106
|
+
Identifier,
|
|
107
|
+
];
|
|
108
|
+
export const SpexLexer = new Lexer(allTokens);
|
|
109
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CstParser } from 'chevrotain';
|
|
2
|
+
export declare class SpexParser extends CstParser {
|
|
3
|
+
constructor();
|
|
4
|
+
spexFile: import("chevrotain").ParserMethod<[], import("chevrotain").CstNode>;
|
|
5
|
+
private declaration;
|
|
6
|
+
private objectDeclaration;
|
|
7
|
+
private objectExpression;
|
|
8
|
+
private objectOperand;
|
|
9
|
+
private namedObject;
|
|
10
|
+
private productObject;
|
|
11
|
+
private subObject;
|
|
12
|
+
private importDeclaration;
|
|
13
|
+
private namedImport;
|
|
14
|
+
private moduleImport;
|
|
15
|
+
private exportDeclaration;
|
|
16
|
+
private generateDeclaration;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA4BtC,qBAAa,UAAW,SAAQ,SAAS;;IAMhC,QAAQ,sEAIb;IAEF,OAAO,CAAC,WAAW,CAkBjB;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;CACH"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
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';
|
|
3
|
+
export class SpexParser extends CstParser {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(allTokens);
|
|
6
|
+
this.performSelfAnalysis();
|
|
7
|
+
}
|
|
8
|
+
spexFile = this.RULE('spexFile', () => {
|
|
9
|
+
this.MANY(() => {
|
|
10
|
+
this.SUBRULE(this.declaration);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
declaration = this.RULE('declaration', () => {
|
|
14
|
+
this.OR([
|
|
15
|
+
{
|
|
16
|
+
GATE: this.BACKTRACK(this.objectDeclaration),
|
|
17
|
+
ALT: () => this.SUBRULE(this.objectDeclaration),
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
GATE: this.BACKTRACK(this.importDeclaration),
|
|
21
|
+
ALT: () => this.SUBRULE(this.importDeclaration),
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
GATE: this.BACKTRACK(this.exportDeclaration),
|
|
25
|
+
ALT: () => this.SUBRULE(this.exportDeclaration),
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
ALT: () => this.SUBRULE(this.generateDeclaration),
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
});
|
|
32
|
+
objectDeclaration = this.RULE('objectDeclaration', () => {
|
|
33
|
+
this.CONSUME(CreateTok);
|
|
34
|
+
this.CONSUME(Identifier);
|
|
35
|
+
this.CONSUME(AsTok);
|
|
36
|
+
this.SUBRULE(this.objectExpression);
|
|
37
|
+
this.CONSUME(Semicolon);
|
|
38
|
+
});
|
|
39
|
+
objectExpression = this.RULE('objectExpression', () => {
|
|
40
|
+
this.SUBRULE(this.objectOperand, { LABEL: 'base' });
|
|
41
|
+
this.OPTION(() => {
|
|
42
|
+
this.CONSUME(ArrowTok);
|
|
43
|
+
this.SUBRULE2(this.objectExpression, { LABEL: 'exponent' });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
objectOperand = this.RULE('objectOperand', () => {
|
|
47
|
+
this.OR([
|
|
48
|
+
{
|
|
49
|
+
GATE: this.BACKTRACK(this.subObject),
|
|
50
|
+
ALT: () => this.SUBRULE(this.subObject),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
GATE: this.BACKTRACK(this.productObject),
|
|
54
|
+
ALT: () => this.SUBRULE(this.productObject),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
ALT: () => this.SUBRULE(this.namedObject),
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
this.MANY(() => {
|
|
61
|
+
this.CONSUME(LBracket);
|
|
62
|
+
this.CONSUME(RBracket);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
namedObject = this.RULE('namedObject', () => {
|
|
66
|
+
this.OR([
|
|
67
|
+
{ ALT: () => this.CONSUME(Identifier) },
|
|
68
|
+
{ ALT: () => this.CONSUME(StringTok) },
|
|
69
|
+
{ ALT: () => this.CONSUME(NumberTok) },
|
|
70
|
+
{ ALT: () => this.CONSUME(BoolTok) },
|
|
71
|
+
{ ALT: () => this.CONSUME(UnitTok) },
|
|
72
|
+
]);
|
|
73
|
+
this.MANY(() => {
|
|
74
|
+
this.CONSUME(Dot);
|
|
75
|
+
this.CONSUME2(Identifier);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
productObject = this.RULE('productObject', () => {
|
|
79
|
+
this.CONSUME(LParen);
|
|
80
|
+
this.MANY(() => {
|
|
81
|
+
this.CONSUME(Identifier);
|
|
82
|
+
this.CONSUME(Colon);
|
|
83
|
+
this.SUBRULE(this.objectExpression);
|
|
84
|
+
this.OPTION(() => this.CONSUME(Comma));
|
|
85
|
+
});
|
|
86
|
+
this.CONSUME(RParen);
|
|
87
|
+
});
|
|
88
|
+
subObject = this.RULE('subObject', () => {
|
|
89
|
+
this.CONSUME(FromTok);
|
|
90
|
+
this.SUBRULE(this.objectExpression, { LABEL: 'base' });
|
|
91
|
+
this.CONSUME(SelectTok);
|
|
92
|
+
this.CONSUME(SelectBlock);
|
|
93
|
+
});
|
|
94
|
+
importDeclaration = this.RULE('importDeclaration', () => {
|
|
95
|
+
this.CONSUME(ImportTok);
|
|
96
|
+
this.OR([
|
|
97
|
+
{
|
|
98
|
+
GATE: this.BACKTRACK(this.namedImport),
|
|
99
|
+
ALT: () => this.SUBRULE(this.namedImport),
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
ALT: () => this.SUBRULE(this.moduleImport),
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
this.CONSUME(Semicolon);
|
|
106
|
+
});
|
|
107
|
+
namedImport = this.RULE('namedImport', () => {
|
|
108
|
+
this.CONSUME(Identifier);
|
|
109
|
+
this.CONSUME(FromTok);
|
|
110
|
+
this.CONSUME(PathLiteral);
|
|
111
|
+
this.OPTION(() => {
|
|
112
|
+
this.CONSUME(AsTok);
|
|
113
|
+
this.CONSUME2(Identifier);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
moduleImport = this.RULE('moduleImport', () => {
|
|
117
|
+
this.CONSUME(PathLiteral);
|
|
118
|
+
this.CONSUME(AsTok);
|
|
119
|
+
this.CONSUME(Identifier);
|
|
120
|
+
});
|
|
121
|
+
exportDeclaration = this.RULE('exportDeclaration', () => {
|
|
122
|
+
this.CONSUME(ExportTok);
|
|
123
|
+
this.CONSUME(Identifier);
|
|
124
|
+
this.CONSUME(Semicolon);
|
|
125
|
+
});
|
|
126
|
+
generateDeclaration = this.RULE('generateDeclaration', () => {
|
|
127
|
+
this.CONSUME(GenerateTok);
|
|
128
|
+
this.CONSUME(Identifier);
|
|
129
|
+
this.CONSUME(Semicolon);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,SAAS,EACT,GAAG,EACH,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAA;AAEnB,MAAM,OAAO,UAAW,SAAQ,SAAS;IACvC;QACE,KAAK,CAAC,SAAS,CAAC,CAAA;QAChB,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAEM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QAClD,IAAI,CAAC,EAAE,CAAC;YACN;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAChD;YACD;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAChD;YACD;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAChD;YACD;gBACE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;aAClD;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC9D,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACnC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;QACtD,IAAI,CAAC,EAAE,CAAC;YACN;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;gBACpC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;aACxC;YACD;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;gBACxC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;aAC5C;YACD;gBACE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;aAC1C;SACF,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QAClD,IAAI,CAAC,EAAE,CAAC;YACN,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACvC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACtC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACtC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACpC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;SACrC,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACjB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACxB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC9D,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvB,IAAI,CAAC,EAAE,CAAC;YACN;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;aAC1C;YACD;gBACE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;aAC3C;SACF,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;QAClD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACrB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACnB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;QACpD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACnB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IAEM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC9D,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACvB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAClE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACzB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;CACH"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ICstVisitor } from 'chevrotain';
|
|
2
|
+
import type { SpexFile, Declaration, ObjectDeclaration, ImportDeclaration, ExportDeclaration, GenerateDeclaration, ObjectExpression, NamedObject, ProductObject, SubObject } from './ast.js';
|
|
3
|
+
declare const BaseSpexVisitor: new (...args: any[]) => ICstVisitor<any, any>;
|
|
4
|
+
export declare class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<any, any> {
|
|
5
|
+
constructor();
|
|
6
|
+
spexFile(ctx: any): SpexFile;
|
|
7
|
+
declaration(ctx: any): Declaration;
|
|
8
|
+
objectDeclaration(ctx: any): ObjectDeclaration;
|
|
9
|
+
objectExpression(ctx: any): ObjectExpression;
|
|
10
|
+
objectOperand(ctx: any): ObjectExpression;
|
|
11
|
+
namedObject(ctx: any): NamedObject;
|
|
12
|
+
productObject(ctx: any): ProductObject;
|
|
13
|
+
subObject(ctx: any): SubObject;
|
|
14
|
+
importDeclaration(ctx: any): ImportDeclaration;
|
|
15
|
+
namedImport(ctx: any): ImportDeclaration;
|
|
16
|
+
moduleImport(ctx: any): ImportDeclaration;
|
|
17
|
+
exportDeclaration(ctx: any): ExportDeclaration;
|
|
18
|
+
generateDeclaration(ctx: any): GenerateDeclaration;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseToAst(text: string): SpexFile;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=visitor.d.ts.map
|
|
@@ -0,0 +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,EAEV,MAAM,UAAU,CAAA;AAKjB,QAAA,MAAM,eAAe,+CAAgD,CAAA;AAErE,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;IAalC,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,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB;CAMnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAWjD"}
|
package/dist/visitor.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { SpexLexer } from './lexer.js';
|
|
2
|
+
import { SpexParser } from './parser.js';
|
|
3
|
+
const parserInstance = new SpexParser();
|
|
4
|
+
const BaseSpexVisitor = parserInstance.getBaseCstVisitorConstructor();
|
|
5
|
+
export class SpexParserVisitor extends BaseSpexVisitor {
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
this.validateVisitor();
|
|
9
|
+
}
|
|
10
|
+
spexFile(ctx) {
|
|
11
|
+
const declarations = ctx.declaration.map((decl) => this.visit(decl));
|
|
12
|
+
return { kind: 'SpexFile', declarations };
|
|
13
|
+
}
|
|
14
|
+
declaration(ctx) {
|
|
15
|
+
if (ctx.objectDeclaration) {
|
|
16
|
+
return this.visit(ctx.objectDeclaration);
|
|
17
|
+
}
|
|
18
|
+
if (ctx.importDeclaration) {
|
|
19
|
+
return this.visit(ctx.importDeclaration);
|
|
20
|
+
}
|
|
21
|
+
if (ctx.exportDeclaration) {
|
|
22
|
+
return this.visit(ctx.exportDeclaration);
|
|
23
|
+
}
|
|
24
|
+
return this.visit(ctx.generateDeclaration);
|
|
25
|
+
}
|
|
26
|
+
objectDeclaration(ctx) {
|
|
27
|
+
return {
|
|
28
|
+
kind: 'ObjectDeclaration',
|
|
29
|
+
name: ctx.Identifier[0].image,
|
|
30
|
+
object: this.visit(ctx.objectExpression),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
objectExpression(ctx) {
|
|
34
|
+
if (ctx.base) {
|
|
35
|
+
const exponent = this.visit(ctx.base);
|
|
36
|
+
if (ctx.exponent) {
|
|
37
|
+
return {
|
|
38
|
+
kind: 'ExponentialObject',
|
|
39
|
+
base: this.visit(ctx.exponent),
|
|
40
|
+
exponent,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return exponent;
|
|
44
|
+
}
|
|
45
|
+
throw new Error('Invalid object expression');
|
|
46
|
+
}
|
|
47
|
+
objectOperand(ctx) {
|
|
48
|
+
let expr;
|
|
49
|
+
if (ctx.subObject) {
|
|
50
|
+
expr = this.visit(ctx.subObject);
|
|
51
|
+
}
|
|
52
|
+
else if (ctx.productObject) {
|
|
53
|
+
expr = this.visit(ctx.productObject);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
expr = this.visit(ctx.namedObject);
|
|
57
|
+
}
|
|
58
|
+
if (ctx.LBracket) {
|
|
59
|
+
for (let i = 0; i < ctx.LBracket.length; i++) {
|
|
60
|
+
expr = { kind: 'ArrayObject', base: expr };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return expr;
|
|
64
|
+
}
|
|
65
|
+
namedObject(ctx) {
|
|
66
|
+
let parts;
|
|
67
|
+
if (ctx.StringTok) {
|
|
68
|
+
parts = [ctx.StringTok[0].image, ...(ctx.Identifier ?? []).map((id) => id.image)];
|
|
69
|
+
}
|
|
70
|
+
else if (ctx.NumberTok) {
|
|
71
|
+
parts = [ctx.NumberTok[0].image, ...(ctx.Identifier ?? []).map((id) => id.image)];
|
|
72
|
+
}
|
|
73
|
+
else if (ctx.BoolTok) {
|
|
74
|
+
parts = [ctx.BoolTok[0].image, ...(ctx.Identifier ?? []).map((id) => id.image)];
|
|
75
|
+
}
|
|
76
|
+
else if (ctx.UnitTok) {
|
|
77
|
+
parts = [ctx.UnitTok[0].image, ...(ctx.Identifier ?? []).map((id) => id.image)];
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
parts = ctx.Identifier.map((id) => id.image);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
kind: 'NamedObject',
|
|
84
|
+
name: parts.join('.'),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
productObject(ctx) {
|
|
88
|
+
const fields = {};
|
|
89
|
+
for (let i = 0; i < ctx.Identifier.length; i++) {
|
|
90
|
+
const name = ctx.Identifier[i].image;
|
|
91
|
+
fields[name] = this.visit(ctx.objectExpression[i]);
|
|
92
|
+
}
|
|
93
|
+
return { kind: 'ProductObject', fields };
|
|
94
|
+
}
|
|
95
|
+
subObject(ctx) {
|
|
96
|
+
const rawText = ctx.SelectBlock[0].image;
|
|
97
|
+
const constraint = rawText.slice(1, -1).trim();
|
|
98
|
+
return {
|
|
99
|
+
kind: 'SubObject',
|
|
100
|
+
base: this.visit(ctx.base),
|
|
101
|
+
constraint,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
importDeclaration(ctx) {
|
|
105
|
+
if (ctx.namedImport) {
|
|
106
|
+
return this.visit(ctx.namedImport);
|
|
107
|
+
}
|
|
108
|
+
return this.visit(ctx.moduleImport);
|
|
109
|
+
}
|
|
110
|
+
namedImport(ctx) {
|
|
111
|
+
const name = ctx.Identifier[0].image;
|
|
112
|
+
const source = ctx.PathLiteral[0].image.slice(1, -1);
|
|
113
|
+
const alias = ctx.Identifier[1] ? ctx.Identifier[1].image : null;
|
|
114
|
+
return {
|
|
115
|
+
kind: 'ImportDeclaration',
|
|
116
|
+
name,
|
|
117
|
+
source,
|
|
118
|
+
alias,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
moduleImport(ctx) {
|
|
122
|
+
const source = ctx.PathLiteral[0].image.slice(1, -1);
|
|
123
|
+
const alias = ctx.Identifier[0].image;
|
|
124
|
+
return {
|
|
125
|
+
kind: 'ImportDeclaration',
|
|
126
|
+
name: null,
|
|
127
|
+
source,
|
|
128
|
+
alias,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
exportDeclaration(ctx) {
|
|
132
|
+
return {
|
|
133
|
+
kind: 'ExportDeclaration',
|
|
134
|
+
name: ctx.Identifier[0].image,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
generateDeclaration(ctx) {
|
|
138
|
+
return {
|
|
139
|
+
kind: 'GenerateDeclaration',
|
|
140
|
+
name: ctx.Identifier[0].image,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function parseToAst(text) {
|
|
145
|
+
const lexingResult = SpexLexer.tokenize(text);
|
|
146
|
+
parserInstance.input = lexingResult.tokens;
|
|
147
|
+
const cst = parserInstance.spexFile();
|
|
148
|
+
if (parserInstance.errors.length > 0) {
|
|
149
|
+
throw new Error(`Parsing errors: ${JSON.stringify(parserInstance.errors, null, 2)}`);
|
|
150
|
+
}
|
|
151
|
+
const visitor = new SpexParserVisitor();
|
|
152
|
+
return visitor.visit(cst);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=visitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"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"}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import globals from 'globals'
|
|
2
|
+
import tsPlugin from '@typescript-eslint/eslint-plugin'
|
|
3
|
+
import tsParser from '@typescript-eslint/parser'
|
|
4
|
+
|
|
5
|
+
export default [
|
|
6
|
+
{
|
|
7
|
+
ignores: ['dist/**'],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
files: ['src/**/*.ts'],
|
|
11
|
+
languageOptions: {
|
|
12
|
+
parser: tsParser,
|
|
13
|
+
globals: {
|
|
14
|
+
...globals.node,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
plugins: {
|
|
18
|
+
'@typescript-eslint': tsPlugin,
|
|
19
|
+
},
|
|
20
|
+
rules: {
|
|
21
|
+
...tsPlugin.configs.recommended.rules,
|
|
22
|
+
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
23
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
|
24
|
+
'@typescript-eslint/no-empty-object-type': 'off',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
]
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "spex-parser",
|
|
3
|
+
"repository": "github:Freelansys/spex-parser",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "A parser for Spex, a language designed for programming with LLMs",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"lint": "eslint src --ext .ts",
|
|
18
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
19
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
20
|
+
"format:check": "prettier --check \"src/**/*.ts\""
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"spex",
|
|
24
|
+
"llm",
|
|
25
|
+
"parser",
|
|
26
|
+
"language"
|
|
27
|
+
],
|
|
28
|
+
"author": "",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"type": "module",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^25.3.3",
|
|
33
|
+
"@typescript-eslint/eslint-plugin": "^8.57.1",
|
|
34
|
+
"@typescript-eslint/parser": "^8.57.1",
|
|
35
|
+
"eslint": "^10.0.2",
|
|
36
|
+
"globals": "^17.4.0",
|
|
37
|
+
"prettier": "^3.8.1",
|
|
38
|
+
"ts-node": "^10.9.2",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"vitest": "^4.0.18"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"chevrotain": "^11.1.2"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/ast.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type SpexFile = {
|
|
2
|
+
kind: 'SpexFile'
|
|
3
|
+
declarations: Declaration[]
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export type Declaration =
|
|
7
|
+
| ObjectDeclaration
|
|
8
|
+
| ImportDeclaration
|
|
9
|
+
| ExportDeclaration
|
|
10
|
+
| GenerateDeclaration
|
|
11
|
+
|
|
12
|
+
export type ObjectDeclaration = {
|
|
13
|
+
kind: 'ObjectDeclaration'
|
|
14
|
+
name: string
|
|
15
|
+
object: ObjectExpression
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type ImportDeclaration = {
|
|
19
|
+
kind: 'ImportDeclaration'
|
|
20
|
+
name: string | null
|
|
21
|
+
source: string
|
|
22
|
+
alias: string | null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type ExportDeclaration = {
|
|
26
|
+
kind: 'ExportDeclaration'
|
|
27
|
+
name: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type GenerateDeclaration = {
|
|
31
|
+
kind: 'GenerateDeclaration'
|
|
32
|
+
name: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type ObjectExpression =
|
|
36
|
+
| NamedObject
|
|
37
|
+
| ProductObject
|
|
38
|
+
| ExponentialObject
|
|
39
|
+
| SubObject
|
|
40
|
+
| ArrayObject
|
|
41
|
+
|
|
42
|
+
export type NamedObject = {
|
|
43
|
+
kind: 'NamedObject'
|
|
44
|
+
name: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type ProductObject = {
|
|
48
|
+
kind: 'ProductObject'
|
|
49
|
+
fields: Record<string, ObjectExpression>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type ExponentialObject = {
|
|
53
|
+
kind: 'ExponentialObject'
|
|
54
|
+
base: ObjectExpression
|
|
55
|
+
exponent: ObjectExpression
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type SubObject = {
|
|
59
|
+
kind: 'SubObject'
|
|
60
|
+
base: ObjectExpression
|
|
61
|
+
constraint: string
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export type ArrayObject = {
|
|
65
|
+
kind: 'ArrayObject'
|
|
66
|
+
base: ObjectExpression
|
|
67
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { SpexLexer } from './lexer.js'
|
|
2
|
+
export { SpexParser } from './parser.js'
|
|
3
|
+
export { SpexParserVisitor, parseToAst } from './visitor.js'
|
|
4
|
+
export type {
|
|
5
|
+
SpexFile,
|
|
6
|
+
Declaration,
|
|
7
|
+
ObjectDeclaration,
|
|
8
|
+
ObjectExpression,
|
|
9
|
+
NamedObject,
|
|
10
|
+
ProductObject,
|
|
11
|
+
ExponentialObject,
|
|
12
|
+
SubObject,
|
|
13
|
+
} from './ast.js'
|