spex-parser 0.1.4 → 0.1.5
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/dist/lexer.d.ts +2 -0
- package/dist/lexer.d.ts.map +1 -1
- package/dist/lexer.js +13 -0
- package/dist/lexer.js.map +1 -1
- package/package.json +1 -1
- package/src/lexer.ts +14 -0
- package/tests/lexer.test.ts +61 -0
- package/tests/parser.test.ts +51 -0
- package/tests/props/todo.spex +9 -0
package/dist/lexer.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Lexer } from 'chevrotain';
|
|
2
2
|
export declare const WhiteSpace: import("chevrotain").TokenType;
|
|
3
|
+
export declare const LineComment: import("chevrotain").TokenType;
|
|
4
|
+
export declare const BlockComment: import("chevrotain").TokenType;
|
|
3
5
|
export declare const CreateTok: import("chevrotain").TokenType;
|
|
4
6
|
export declare const AsTok: import("chevrotain").TokenType;
|
|
5
7
|
export declare const FromTok: 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;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,
|
|
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,WAAW,gCAItB,CAAA;AACF,eAAO,MAAM,YAAY,gCAIvB,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,kCAoCrB,CAAA;AAED,eAAO,MAAM,SAAS,OAAuB,CAAA"}
|
package/dist/lexer.js
CHANGED
|
@@ -4,6 +4,17 @@ export const WhiteSpace = createToken({
|
|
|
4
4
|
pattern: /\s+/,
|
|
5
5
|
group: Lexer.SKIPPED,
|
|
6
6
|
});
|
|
7
|
+
// Comments (SQL-style)
|
|
8
|
+
export const LineComment = createToken({
|
|
9
|
+
name: 'LineComment',
|
|
10
|
+
pattern: /--[^\r\n]*/,
|
|
11
|
+
group: Lexer.SKIPPED,
|
|
12
|
+
});
|
|
13
|
+
export const BlockComment = createToken({
|
|
14
|
+
name: 'BlockComment',
|
|
15
|
+
pattern: /\/\*[\s\S]*?\*\//,
|
|
16
|
+
group: Lexer.SKIPPED,
|
|
17
|
+
});
|
|
7
18
|
// Keywords (case-insensitive)
|
|
8
19
|
export const CreateTok = createToken({
|
|
9
20
|
name: 'CreateTok',
|
|
@@ -91,6 +102,8 @@ export const Identifier = createToken({
|
|
|
91
102
|
});
|
|
92
103
|
export const allTokens = [
|
|
93
104
|
WhiteSpace,
|
|
105
|
+
LineComment,
|
|
106
|
+
BlockComment,
|
|
94
107
|
CreateTok,
|
|
95
108
|
AsTok,
|
|
96
109
|
FromTok,
|
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/package.json
CHANGED
package/src/lexer.ts
CHANGED
|
@@ -6,6 +6,18 @@ export const WhiteSpace = createToken({
|
|
|
6
6
|
group: Lexer.SKIPPED,
|
|
7
7
|
})
|
|
8
8
|
|
|
9
|
+
// Comments (SQL-style)
|
|
10
|
+
export const LineComment = createToken({
|
|
11
|
+
name: 'LineComment',
|
|
12
|
+
pattern: /--[^\r\n]*/,
|
|
13
|
+
group: Lexer.SKIPPED,
|
|
14
|
+
})
|
|
15
|
+
export const BlockComment = createToken({
|
|
16
|
+
name: 'BlockComment',
|
|
17
|
+
pattern: /\/\*[\s\S]*?\*\//,
|
|
18
|
+
group: Lexer.SKIPPED,
|
|
19
|
+
})
|
|
20
|
+
|
|
9
21
|
// Keywords (case-insensitive)
|
|
10
22
|
export const CreateTok = createToken({
|
|
11
23
|
name: 'CreateTok',
|
|
@@ -99,6 +111,8 @@ export const Identifier = createToken({
|
|
|
99
111
|
|
|
100
112
|
export const allTokens = [
|
|
101
113
|
WhiteSpace,
|
|
114
|
+
LineComment,
|
|
115
|
+
BlockComment,
|
|
102
116
|
|
|
103
117
|
CreateTok,
|
|
104
118
|
AsTok,
|
package/tests/lexer.test.ts
CHANGED
|
@@ -123,6 +123,67 @@ describe('SpexLexer', () => {
|
|
|
123
123
|
})
|
|
124
124
|
})
|
|
125
125
|
|
|
126
|
+
describe('comments', () => {
|
|
127
|
+
it('should skip single-line comments', () => {
|
|
128
|
+
const result = SpexLexer.tokenize('create Foo as string; -- a comment')
|
|
129
|
+
expect(result.errors).toHaveLength(0)
|
|
130
|
+
expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
|
|
131
|
+
'CreateTok',
|
|
132
|
+
'Identifier',
|
|
133
|
+
'AsTok',
|
|
134
|
+
'StringTok',
|
|
135
|
+
'Semicolon',
|
|
136
|
+
])
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
it('should skip single-line comment with no trailing newline', () => {
|
|
140
|
+
const result = SpexLexer.tokenize('-- a comment')
|
|
141
|
+
expect(result.errors).toHaveLength(0)
|
|
142
|
+
expect(result.tokens).toHaveLength(0)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('should skip inline block comments', () => {
|
|
146
|
+
const result = SpexLexer.tokenize('create /* inline */ Foo as string;')
|
|
147
|
+
expect(result.errors).toHaveLength(0)
|
|
148
|
+
expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
|
|
149
|
+
'CreateTok',
|
|
150
|
+
'Identifier',
|
|
151
|
+
'AsTok',
|
|
152
|
+
'StringTok',
|
|
153
|
+
'Semicolon',
|
|
154
|
+
])
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
it('should skip multi-line block comments', () => {
|
|
158
|
+
const result = SpexLexer.tokenize('/* line 1\nline 2 */ create Foo as string;')
|
|
159
|
+
expect(result.errors).toHaveLength(0)
|
|
160
|
+
expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
|
|
161
|
+
'CreateTok',
|
|
162
|
+
'Identifier',
|
|
163
|
+
'AsTok',
|
|
164
|
+
'StringTok',
|
|
165
|
+
'Semicolon',
|
|
166
|
+
])
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
it('should skip block comments containing token-like content', () => {
|
|
170
|
+
const result = SpexLexer.tokenize('/* create Bar as Number; */ create Foo as string;')
|
|
171
|
+
expect(result.errors).toHaveLength(0)
|
|
172
|
+
expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
|
|
173
|
+
'CreateTok',
|
|
174
|
+
'Identifier',
|
|
175
|
+
'AsTok',
|
|
176
|
+
'StringTok',
|
|
177
|
+
'Semicolon',
|
|
178
|
+
])
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
it('should produce an error for an unclosed block comment', () => {
|
|
182
|
+
const result = SpexLexer.tokenize('create Foo as string; /* unclosed')
|
|
183
|
+
expect(result.errors).not.toHaveLength(0)
|
|
184
|
+
})
|
|
185
|
+
})
|
|
186
|
+
|
|
126
187
|
describe('error handling', () => {
|
|
127
188
|
it('should return empty tokens for empty input', () => {
|
|
128
189
|
const result = SpexLexer.tokenize('')
|
package/tests/parser.test.ts
CHANGED
|
@@ -275,6 +275,57 @@ describe('SpexParser', () => {
|
|
|
275
275
|
})
|
|
276
276
|
})
|
|
277
277
|
|
|
278
|
+
describe('comments', () => {
|
|
279
|
+
it('should parse declarations separated by single-line comments', () => {
|
|
280
|
+
const testCase = `
|
|
281
|
+
-- domain model
|
|
282
|
+
create Todo as (id: string, title: string);
|
|
283
|
+
-- create a new todo
|
|
284
|
+
create CreateTodo as (title: string) -> Todo;
|
|
285
|
+
`
|
|
286
|
+
const { parser } = parseInput(testCase)
|
|
287
|
+
expect(parser.errors).toHaveLength(0)
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
it('should parse declarations separated by block comments', () => {
|
|
291
|
+
const testCase = `
|
|
292
|
+
/* storage layer */
|
|
293
|
+
create LoadTodos as (path: string) -> Todo[];
|
|
294
|
+
/* entry point */
|
|
295
|
+
create Main as string[] -> unit;
|
|
296
|
+
`
|
|
297
|
+
const { parser } = parseInput(testCase)
|
|
298
|
+
expect(parser.errors).toHaveLength(0)
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
it('should parse inline block comments within a product declaration', () => {
|
|
302
|
+
const testCase = 'create Config as (name: string /* the name */, count: number);'
|
|
303
|
+
const { parser } = parseInput(testCase)
|
|
304
|
+
expect(parser.errors).toHaveLength(0)
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
it('should parse a file containing only comments', () => {
|
|
308
|
+
const testCase = `
|
|
309
|
+
-- this file is intentionally empty
|
|
310
|
+
/* apart from these comments */
|
|
311
|
+
`
|
|
312
|
+
const { parser } = parseInput(testCase)
|
|
313
|
+
expect(parser.errors).toHaveLength(0)
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
it('should parse a block comment spanning a single-line comment', () => {
|
|
317
|
+
const testCase = `
|
|
318
|
+
create Foo as string;
|
|
319
|
+
/* comment one
|
|
320
|
+
-- not a real comment, still part of the block
|
|
321
|
+
comment two */
|
|
322
|
+
generate Main;
|
|
323
|
+
`
|
|
324
|
+
const { parser } = parseInput(testCase)
|
|
325
|
+
expect(parser.errors).toHaveLength(0)
|
|
326
|
+
})
|
|
327
|
+
})
|
|
328
|
+
|
|
278
329
|
describe('multiple declarations', () => {
|
|
279
330
|
it('should parse multiple declarations', () => {
|
|
280
331
|
const testCase = `
|
package/tests/props/todo.spex
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
-- A Todo CLI application written in Spex.
|
|
2
|
+
|
|
3
|
+
/* The domain model: */
|
|
1
4
|
create Todo as (
|
|
2
5
|
id: string,
|
|
3
6
|
title: string,
|
|
@@ -18,11 +21,13 @@ create TodoId as from string select {
|
|
|
18
21
|
are valid UUIDs
|
|
19
22
|
};
|
|
20
23
|
|
|
24
|
+
/* The CLI argument structure. */
|
|
21
25
|
create CliArgs as (
|
|
22
26
|
command: string,
|
|
23
27
|
arguments: string[]
|
|
24
28
|
);
|
|
25
29
|
|
|
30
|
+
-- Storage layer:
|
|
26
31
|
create LoadTodos as from (path: TodoFilePath) -> Todo[] select {
|
|
27
32
|
1. read the JSON file at @path
|
|
28
33
|
2. return an empty list if the file does not exist
|
|
@@ -35,12 +40,14 @@ create SaveTodos as from (path: TodoFilePath, todos: Todo[]) -> unit select {
|
|
|
35
40
|
2. write the JSON to @path
|
|
36
41
|
};
|
|
37
42
|
|
|
43
|
+
-- Todo creation:
|
|
38
44
|
create CreateTodo as from (title: TodoTitle) -> Todo select {
|
|
39
45
|
1. generate a UUID for the todo id
|
|
40
46
|
2. create a todo with completed set to false
|
|
41
47
|
3. return the created todo
|
|
42
48
|
};
|
|
43
49
|
|
|
50
|
+
-- Commands:
|
|
44
51
|
create AddTodo as from (path: TodoFilePath, title: TodoTitle) -> Todo select {
|
|
45
52
|
1. call @LoadTodos using @path
|
|
46
53
|
2. call @CreateTodo using @title
|
|
@@ -71,6 +78,7 @@ create ParseCliArgs as from string[] -> CliArgs select {
|
|
|
71
78
|
3. extract the command arguments
|
|
72
79
|
};
|
|
73
80
|
|
|
81
|
+
/* Entry point. */
|
|
74
82
|
create Main as from string[] -> unit select {
|
|
75
83
|
1. parse process arguments using @ParseCliArgs
|
|
76
84
|
2. if the command is "add": call @AddTodo
|
|
@@ -80,6 +88,7 @@ create Main as from string[] -> unit select {
|
|
|
80
88
|
6. print user-friendly error messages for exceptions
|
|
81
89
|
};
|
|
82
90
|
|
|
91
|
+
-- Code generation:
|
|
83
92
|
generate TodoTitle;
|
|
84
93
|
|
|
85
94
|
package executable MyTodo as Main;
|