plum

#treesitter#compiler#wasm

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 CHANGED
@@ -42,7 +42,7 @@ module.exports = grammar({
42
42
 
43
43
  class_definition: $ => seq(
44
44
  'class',
45
- field('name', $.identifier),
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', $.identifier),
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('key', $.identifier),
87
+ field('name', $.variable_name),
86
88
  ':',
87
- field('value', $.identifier)
89
+ field('type', $.type)
88
90
  ),
89
91
 
90
- enum_field: $ => seq($.enum_identifier, '(', commaSep1($._primary_expression), ')'),
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
- enum_identifier: $ => /[A-Z_][A-Z_0-9]*/,
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": "identifier"
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": "identifier"
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": "key",
349
+ "name": "name",
329
350
  "content": {
330
351
  "type": "SYMBOL",
331
- "name": "identifier"
352
+ "name": "variable_name"
332
353
  }
333
354
  },
334
355
  {
@@ -337,10 +358,10 @@
337
358
  },
338
359
  {
339
360
  "type": "FIELD",
340
- "name": "value",
361
+ "name": "type",
341
362
  "content": {
342
363
  "type": "SYMBOL",
343
- "name": "identifier"
364
+ "name": "type"
344
365
  }
345
366
  }
346
367
  ]
@@ -350,7 +371,7 @@
350
371
  "members": [
351
372
  {
352
373
  "type": "SYMBOL",
353
- "name": "enum_identifier"
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
- "enum_identifier": {
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": "identifier",
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
- "key": {
77
+ "name": {
78
78
  "multiple": false,
79
79
  "required": true,
80
80
  "types": [
81
81
  {
82
- "type": "identifier",
82
+ "type": "variable_name",
83
83
  "named": true
84
84
  }
85
85
  ]
86
86
  },
87
- "value": {
87
+ "type": {
88
88
  "multiple": false,
89
89
  "required": true,
90
90
  "types": [
91
91
  {
92
- "type": "identifier",
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": "identifier",
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": "enum_identifier",
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": "enum_identifier",
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 A:
7
+ class AnimalStrong:
8
- a: String
8
+ count: String
9
- b: Int
9
+ userName: Int
10
+ currentAddress: Address
10
11
 
11
- class B<S, T>:
12
+ class Bat<S, T>:
12
13
  a: S
13
14
  b: T
14
15
 
15
- class A(B, C):
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
- (identifier)
30
+ (definition_name)
30
31
  (class_field
31
- (identifier)
32
+ (variable_name)
33
+ (type
32
- (identifier))
34
+ (definition_name)))
33
35
  (class_field
36
+ (variable_name)
37
+ (type
38
+ (definition_name)))
34
- (identifier)
39
+ (class_field
40
+ (variable_name)
41
+ (type
35
- (identifier)))
42
+ (definition_name))))
36
43
  (class_definition
37
- (identifier)
44
+ (definition_name)
38
45
  (generic_list
39
46
  (identifier)
40
47
  (identifier))
41
48
  (class_field
42
- (identifier)
49
+ (variable_name)
50
+ (type
43
- (identifier))
51
+ (definition_name)))
44
52
  (class_field
45
- (identifier)
53
+ (variable_name)
54
+ (type
46
- (identifier)))
55
+ (definition_name))))
47
56
  (class_definition
48
- (identifier)
57
+ (definition_name)
49
58
  (trait_list
50
59
  (identifier)
51
60
  (identifier))
52
61
  (class_field
53
- (identifier)
62
+ (variable_name)
63
+ (type
54
- (identifier))
64
+ (definition_name)))
55
65
  (class_field
56
- (identifier)
66
+ (variable_name)
67
+ (type
57
- (identifier)))
68
+ (definition_name))))
58
69
  (class_definition
59
- (identifier)
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
- (identifier)
78
+ (variable_name)
79
+ (type
68
- (identifier))
80
+ (definition_name)))
69
81
  (class_field
70
- (identifier)
82
+ (variable_name)
83
+ (type
71
- (identifier))))
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
- (identifier)
18
+ (definition_name)
19
19
  (type_list
20
20
  (identifier))
21
21
  (enum_field
22
- (enum_identifier)
22
+ (enum_field_name)
23
23
  (hex_literal))
24
24
  (enum_field
25
- (enum_identifier)
25
+ (enum_field_name)
26
26
  (hex_literal))
27
27
  (enum_field
28
- (enum_identifier)
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
- (identifier)
48
+ (definition_name)
49
49
  (type_list
50
50
  (identifier)
51
51
  (identifier))
52
52
  (enum_field
53
- (enum_identifier)
53
+ (enum_field_name)
54
54
  (integer_literal)
55
55
  (float_literal))
56
56
  (enum_field
57
- (enum_identifier)
57
+ (enum_field_name)
58
58
  (integer_literal)
59
59
  (float_literal))
60
60
  (enum_field
61
- (enum_identifier)
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
- (identifier)
82
+ (definition_name)
83
83
  (type_list
84
84
  (identifier)
85
85
  (identifier))
86
86
  (enum_field
87
- (enum_identifier)
87
+ (enum_field_name)
88
88
  (integer_literal)
89
89
  (line_string_literal))
90
90
  (enum_field
91
- (enum_identifier)
91
+ (enum_field_name)
92
92
  (integer_literal)
93
93
  (line_string_literal))
94
94
  (enum_field
95
- (enum_identifier)
95
+ (enum_field_name)
96
96
  (integer_literal)
97
97
  (line_string_literal))))