plum
git clone https://git.pyrossh.dev/plum
A statically typed, imperative programming language inspired by rust, python
54c4365
— Peter John
2022-11-07T23:33:51+05:30
update names
Generated files not shown: src/parser.c
- grammar.js +11 -7
- src/grammar.json +37 -8
- src/node-types.json +35 -8
- test/corpus/class_definitions.txt +38 -25
- test/corpus/enum_definitions.txt +12 -12
grammar.js
CHANGED
|
@@ -42,7 +42,7 @@ module.exports = grammar({
|
|
|
42
42
|
|
|
43
43
|
class_definition: $ => seq(
|
|
44
44
|
'class',
|
|
45
|
-
field('name', $.
|
|
45
|
+
field('name', $.definition_name),
|
|
46
46
|
field('generics', optional($.generic_list)),
|
|
47
47
|
field('traits', optional($.trait_list)),
|
|
48
48
|
':',
|
|
@@ -54,7 +54,7 @@ module.exports = grammar({
|
|
|
54
54
|
|
|
55
55
|
enum_definition: $ => seq(
|
|
56
56
|
'enum',
|
|
57
|
-
field('name', $.
|
|
57
|
+
field('name', $.definition_name),
|
|
58
58
|
field('types', $.type_list),
|
|
59
59
|
':',
|
|
60
60
|
field('fields', seq($._indent, seq(
|
|
@@ -63,6 +63,8 @@ module.exports = grammar({
|
|
|
63
63
|
))),
|
|
64
64
|
),
|
|
65
65
|
|
|
66
|
+
type: $ => seq($.definition_name, optional('?')),
|
|
67
|
+
|
|
66
68
|
type_list: $ => seq(
|
|
67
69
|
'(',
|
|
68
70
|
commaSep1($.identifier),
|
|
@@ -82,12 +84,12 @@ module.exports = grammar({
|
|
|
82
84
|
),
|
|
83
85
|
|
|
84
86
|
class_field: $ => seq(
|
|
85
|
-
field('
|
|
87
|
+
field('name', $.variable_name),
|
|
86
88
|
':',
|
|
87
|
-
field('
|
|
89
|
+
field('type', $.type)
|
|
88
90
|
),
|
|
89
91
|
|
|
90
|
-
enum_field: $ => seq($.
|
|
92
|
+
enum_field: $ => seq($.enum_field_name, '(', commaSep1($._primary_expression), ')'),
|
|
91
93
|
|
|
92
94
|
_primary_expression: $ => choice(
|
|
93
95
|
$._literal_constant,
|
|
@@ -97,7 +99,9 @@ module.exports = grammar({
|
|
|
97
99
|
url: $ => sep1(/[a-zA-Z_][a-zA-Z_0-9]*/, '/'),
|
|
98
100
|
package: $ => $.identifier,
|
|
99
101
|
identifier: $ => /[a-zA-Z_][a-zA-Z_0-9]*/,
|
|
102
|
+
definition_name: $ => /[A-Z](([a-z]+[A-Z]?)*)/, // Pascal Case - no digits allowed
|
|
103
|
+
variable_name: $ => /[a-z][a-z]*(([A-Z][a-z]+)*[A-Z]?|([a-z]+[A-Z])*|[A-Z])/, // Lower Camel Case - no digits allowed
|
|
100
|
-
|
|
104
|
+
enum_field_name: $ => /[A-Z_][A-Z_0-9]*/,
|
|
101
105
|
|
|
102
106
|
// Literals
|
|
103
107
|
boolean_literal: $ => choice("true", "false"),
|
|
@@ -148,7 +152,7 @@ module.exports = grammar({
|
|
|
148
152
|
),
|
|
149
153
|
|
|
150
154
|
_multi_line_string_content: $ => choice($._multi_line_str_text, '"'),
|
|
151
|
-
|
|
155
|
+
|
|
152
156
|
_line_str_text: $ => /[^\\"$]+/,
|
|
153
157
|
|
|
154
158
|
_multi_line_str_text: $ => /[^"$]+/,
|
src/grammar.json
CHANGED
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"name": "name",
|
|
79
79
|
"content": {
|
|
80
80
|
"type": "SYMBOL",
|
|
81
|
-
"name": "
|
|
81
|
+
"name": "definition_name"
|
|
82
82
|
}
|
|
83
83
|
},
|
|
84
84
|
{
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"name": "name",
|
|
161
161
|
"content": {
|
|
162
162
|
"type": "SYMBOL",
|
|
163
|
-
"name": "
|
|
163
|
+
"name": "definition_name"
|
|
164
164
|
}
|
|
165
165
|
},
|
|
166
166
|
{
|
|
@@ -206,6 +206,27 @@
|
|
|
206
206
|
}
|
|
207
207
|
]
|
|
208
208
|
},
|
|
209
|
+
"type": {
|
|
210
|
+
"type": "SEQ",
|
|
211
|
+
"members": [
|
|
212
|
+
{
|
|
213
|
+
"type": "SYMBOL",
|
|
214
|
+
"name": "definition_name"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"type": "CHOICE",
|
|
218
|
+
"members": [
|
|
219
|
+
{
|
|
220
|
+
"type": "STRING",
|
|
221
|
+
"value": "?"
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"type": "BLANK"
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
}
|
|
228
|
+
]
|
|
229
|
+
},
|
|
209
230
|
"type_list": {
|
|
210
231
|
"type": "SEQ",
|
|
211
232
|
"members": [
|
|
@@ -325,10 +346,10 @@
|
|
|
325
346
|
"members": [
|
|
326
347
|
{
|
|
327
348
|
"type": "FIELD",
|
|
328
|
-
"name": "
|
|
349
|
+
"name": "name",
|
|
329
350
|
"content": {
|
|
330
351
|
"type": "SYMBOL",
|
|
331
|
-
"name": "
|
|
352
|
+
"name": "variable_name"
|
|
332
353
|
}
|
|
333
354
|
},
|
|
334
355
|
{
|
|
@@ -337,10 +358,10 @@
|
|
|
337
358
|
},
|
|
338
359
|
{
|
|
339
360
|
"type": "FIELD",
|
|
340
|
-
"name": "
|
|
361
|
+
"name": "type",
|
|
341
362
|
"content": {
|
|
342
363
|
"type": "SYMBOL",
|
|
343
|
-
"name": "
|
|
364
|
+
"name": "type"
|
|
344
365
|
}
|
|
345
366
|
}
|
|
346
367
|
]
|
|
@@ -350,7 +371,7 @@
|
|
|
350
371
|
"members": [
|
|
351
372
|
{
|
|
352
373
|
"type": "SYMBOL",
|
|
353
|
-
"name": "
|
|
374
|
+
"name": "enum_field_name"
|
|
354
375
|
},
|
|
355
376
|
{
|
|
356
377
|
"type": "STRING",
|
|
@@ -433,7 +454,15 @@
|
|
|
433
454
|
"type": "PATTERN",
|
|
434
455
|
"value": "[a-zA-Z_][a-zA-Z_0-9]*"
|
|
435
456
|
},
|
|
457
|
+
"definition_name": {
|
|
458
|
+
"type": "PATTERN",
|
|
459
|
+
"value": "[A-Z](([a-z]+[A-Z]?)*)"
|
|
460
|
+
},
|
|
461
|
+
"variable_name": {
|
|
462
|
+
"type": "PATTERN",
|
|
463
|
+
"value": "[a-z][a-z]*(([A-Z][a-z]+)*[A-Z]?|([a-z]+[A-Z])*|[A-Z])"
|
|
464
|
+
},
|
|
436
|
-
"
|
|
465
|
+
"enum_field_name": {
|
|
437
466
|
"type": "PATTERN",
|
|
438
467
|
"value": "[A-Z_][A-Z_0-9]*"
|
|
439
468
|
},
|
src/node-types.json
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"required": true,
|
|
54
54
|
"types": [
|
|
55
55
|
{
|
|
56
|
-
"type": "
|
|
56
|
+
"type": "definition_name",
|
|
57
57
|
"named": true
|
|
58
58
|
}
|
|
59
59
|
]
|
|
@@ -74,22 +74,22 @@
|
|
|
74
74
|
"type": "class_field",
|
|
75
75
|
"named": true,
|
|
76
76
|
"fields": {
|
|
77
|
-
"
|
|
77
|
+
"name": {
|
|
78
78
|
"multiple": false,
|
|
79
79
|
"required": true,
|
|
80
80
|
"types": [
|
|
81
81
|
{
|
|
82
|
-
"type": "
|
|
82
|
+
"type": "variable_name",
|
|
83
83
|
"named": true
|
|
84
84
|
}
|
|
85
85
|
]
|
|
86
86
|
},
|
|
87
|
-
"
|
|
87
|
+
"type": {
|
|
88
88
|
"multiple": false,
|
|
89
89
|
"required": true,
|
|
90
90
|
"types": [
|
|
91
91
|
{
|
|
92
|
-
"type": "
|
|
92
|
+
"type": "type",
|
|
93
93
|
"named": true
|
|
94
94
|
}
|
|
95
95
|
]
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"required": true,
|
|
116
116
|
"types": [
|
|
117
117
|
{
|
|
118
|
-
"type": "
|
|
118
|
+
"type": "definition_name",
|
|
119
119
|
"named": true
|
|
120
120
|
}
|
|
121
121
|
]
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"named": true
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
|
-
"type": "
|
|
156
|
+
"type": "enum_field_name",
|
|
157
157
|
"named": true
|
|
158
158
|
},
|
|
159
159
|
{
|
|
@@ -310,6 +310,21 @@
|
|
|
310
310
|
]
|
|
311
311
|
}
|
|
312
312
|
},
|
|
313
|
+
{
|
|
314
|
+
"type": "type",
|
|
315
|
+
"named": true,
|
|
316
|
+
"fields": {},
|
|
317
|
+
"children": {
|
|
318
|
+
"multiple": false,
|
|
319
|
+
"required": true,
|
|
320
|
+
"types": [
|
|
321
|
+
{
|
|
322
|
+
"type": "definition_name",
|
|
323
|
+
"named": true
|
|
324
|
+
}
|
|
325
|
+
]
|
|
326
|
+
}
|
|
327
|
+
},
|
|
313
328
|
{
|
|
314
329
|
"type": "type_list",
|
|
315
330
|
"named": true,
|
|
@@ -370,6 +385,10 @@
|
|
|
370
385
|
"type": ">",
|
|
371
386
|
"named": false
|
|
372
387
|
},
|
|
388
|
+
{
|
|
389
|
+
"type": "?",
|
|
390
|
+
"named": false
|
|
391
|
+
},
|
|
373
392
|
{
|
|
374
393
|
"type": "\\u",
|
|
375
394
|
"named": false
|
|
@@ -386,12 +405,16 @@
|
|
|
386
405
|
"type": "class",
|
|
387
406
|
"named": false
|
|
388
407
|
},
|
|
408
|
+
{
|
|
409
|
+
"type": "definition_name",
|
|
410
|
+
"named": true
|
|
411
|
+
},
|
|
389
412
|
{
|
|
390
413
|
"type": "enum",
|
|
391
414
|
"named": false
|
|
392
415
|
},
|
|
393
416
|
{
|
|
394
|
-
"type": "
|
|
417
|
+
"type": "enum_field_name",
|
|
395
418
|
"named": true
|
|
396
419
|
},
|
|
397
420
|
{
|
|
@@ -425,5 +448,9 @@
|
|
|
425
448
|
{
|
|
426
449
|
"type": "true",
|
|
427
450
|
"named": false
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"type": "variable_name",
|
|
454
|
+
"named": true
|
|
428
455
|
}
|
|
429
456
|
]
|
test/corpus/class_definitions.txt
CHANGED
|
@@ -4,15 +4,16 @@ Class definitions
|
|
|
4
4
|
|
|
5
5
|
package definitions
|
|
6
6
|
|
|
7
|
-
class
|
|
7
|
+
class AnimalStrong:
|
|
8
|
-
|
|
8
|
+
count: String
|
|
9
|
-
|
|
9
|
+
userName: Int
|
|
10
|
+
currentAddress: Address
|
|
10
11
|
|
|
11
|
-
class
|
|
12
|
+
class Bat<S, T>:
|
|
12
13
|
a: S
|
|
13
14
|
b: T
|
|
14
15
|
|
|
15
|
-
class
|
|
16
|
+
class AnimalSubSpecies(B, C):
|
|
16
17
|
a: String
|
|
17
18
|
b: Float
|
|
18
19
|
|
|
@@ -26,37 +27,47 @@ class A<S, T>(B, C):
|
|
|
26
27
|
(package
|
|
27
28
|
(identifier))
|
|
28
29
|
(class_definition
|
|
29
|
-
(
|
|
30
|
+
(definition_name)
|
|
30
31
|
(class_field
|
|
31
|
-
(
|
|
32
|
+
(variable_name)
|
|
33
|
+
(type
|
|
32
|
-
|
|
34
|
+
(definition_name)))
|
|
33
35
|
(class_field
|
|
36
|
+
(variable_name)
|
|
37
|
+
(type
|
|
38
|
+
(definition_name)))
|
|
34
|
-
|
|
39
|
+
(class_field
|
|
40
|
+
(variable_name)
|
|
41
|
+
(type
|
|
35
|
-
|
|
42
|
+
(definition_name))))
|
|
36
43
|
(class_definition
|
|
37
|
-
(
|
|
44
|
+
(definition_name)
|
|
38
45
|
(generic_list
|
|
39
46
|
(identifier)
|
|
40
47
|
(identifier))
|
|
41
48
|
(class_field
|
|
42
|
-
(
|
|
49
|
+
(variable_name)
|
|
50
|
+
(type
|
|
43
|
-
|
|
51
|
+
(definition_name)))
|
|
44
52
|
(class_field
|
|
45
|
-
(
|
|
53
|
+
(variable_name)
|
|
54
|
+
(type
|
|
46
|
-
|
|
55
|
+
(definition_name))))
|
|
47
56
|
(class_definition
|
|
48
|
-
(
|
|
57
|
+
(definition_name)
|
|
49
58
|
(trait_list
|
|
50
59
|
(identifier)
|
|
51
60
|
(identifier))
|
|
52
61
|
(class_field
|
|
53
|
-
(
|
|
62
|
+
(variable_name)
|
|
63
|
+
(type
|
|
54
|
-
|
|
64
|
+
(definition_name)))
|
|
55
65
|
(class_field
|
|
56
|
-
(
|
|
66
|
+
(variable_name)
|
|
67
|
+
(type
|
|
57
|
-
|
|
68
|
+
(definition_name))))
|
|
58
69
|
(class_definition
|
|
59
|
-
(
|
|
70
|
+
(definition_name)
|
|
60
71
|
(generic_list
|
|
61
72
|
(identifier)
|
|
62
73
|
(identifier))
|
|
@@ -64,8 +75,10 @@ class A<S, T>(B, C):
|
|
|
64
75
|
(identifier)
|
|
65
76
|
(identifier))
|
|
66
77
|
(class_field
|
|
67
|
-
(
|
|
78
|
+
(variable_name)
|
|
79
|
+
(type
|
|
68
|
-
|
|
80
|
+
(definition_name)))
|
|
69
81
|
(class_field
|
|
70
|
-
(
|
|
82
|
+
(variable_name)
|
|
83
|
+
(type
|
|
71
|
-
|
|
84
|
+
(definition_name)))))
|
test/corpus/enum_definitions.txt
CHANGED
|
@@ -15,17 +15,17 @@ enum Colors(Int):
|
|
|
15
15
|
(package
|
|
16
16
|
(identifier))
|
|
17
17
|
(enum_definition
|
|
18
|
-
(
|
|
18
|
+
(definition_name)
|
|
19
19
|
(type_list
|
|
20
20
|
(identifier))
|
|
21
21
|
(enum_field
|
|
22
|
-
(
|
|
22
|
+
(enum_field_name)
|
|
23
23
|
(hex_literal))
|
|
24
24
|
(enum_field
|
|
25
|
-
(
|
|
25
|
+
(enum_field_name)
|
|
26
26
|
(hex_literal))
|
|
27
27
|
(enum_field
|
|
28
|
-
(
|
|
28
|
+
(enum_field_name)
|
|
29
29
|
(hex_literal))))
|
|
30
30
|
|
|
31
31
|
================================================================================
|
|
@@ -45,20 +45,20 @@ enum ColorsAlpha(Int, Float):
|
|
|
45
45
|
(package
|
|
46
46
|
(identifier))
|
|
47
47
|
(enum_definition
|
|
48
|
-
(
|
|
48
|
+
(definition_name)
|
|
49
49
|
(type_list
|
|
50
50
|
(identifier)
|
|
51
51
|
(identifier))
|
|
52
52
|
(enum_field
|
|
53
|
-
(
|
|
53
|
+
(enum_field_name)
|
|
54
54
|
(integer_literal)
|
|
55
55
|
(float_literal))
|
|
56
56
|
(enum_field
|
|
57
|
-
(
|
|
57
|
+
(enum_field_name)
|
|
58
58
|
(integer_literal)
|
|
59
59
|
(float_literal))
|
|
60
60
|
(enum_field
|
|
61
|
-
(
|
|
61
|
+
(enum_field_name)
|
|
62
62
|
(integer_literal)
|
|
63
63
|
(float_literal))))
|
|
64
64
|
|
|
@@ -79,19 +79,19 @@ enum ColorsAlpha(Int, String):
|
|
|
79
79
|
(package
|
|
80
80
|
(identifier))
|
|
81
81
|
(enum_definition
|
|
82
|
-
(
|
|
82
|
+
(definition_name)
|
|
83
83
|
(type_list
|
|
84
84
|
(identifier)
|
|
85
85
|
(identifier))
|
|
86
86
|
(enum_field
|
|
87
|
-
(
|
|
87
|
+
(enum_field_name)
|
|
88
88
|
(integer_literal)
|
|
89
89
|
(line_string_literal))
|
|
90
90
|
(enum_field
|
|
91
|
-
(
|
|
91
|
+
(enum_field_name)
|
|
92
92
|
(integer_literal)
|
|
93
93
|
(line_string_literal))
|
|
94
94
|
(enum_field
|
|
95
|
-
(
|
|
95
|
+
(enum_field_name)
|
|
96
96
|
(integer_literal)
|
|
97
97
|
(line_string_literal))))
|