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.
@@ -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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"}
@@ -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":"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"}
@@ -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"}
@@ -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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"}
@@ -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'