aboutsummaryrefslogtreecommitdiff
path: root/grammar.js
blob: 1aa01901425f40a8585726abd0f8d9e19a3d2818 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
module.exports = grammar({
  name: 'api_notation',

  rules: {
    source_file: $ => repeat(
      seq(
        choice(
          $.definition,
          $.comment
        ),
        repeat($._newline)
      )
    ),
    definition: $ => prec.right(seq(
      $.entry,
      $._newline,
      repeat(
        choice(
          $.member,
          $.comment
        )
      )
    )),
    entry: $ => prec.right(seq(
      $.identifier,
      repeat(
        seq(
          token('.'),
          $.identifier
        )
      )
    )),
    member: $ => seq(
      $.member_type,
      $._label,
      optional($.type_annotation),
      optional($.parameter_list),
      optional($.return_statement),
      optional($.throw_statement),
      $._newline,
    ),
    member_type: $ => choice(
      '::',
      '->',
      '<-',
      '~>',
      '<~',
      '+>',
      '<+',
      '#',
      '+',
      '-'
    ),
    parameter_list: $ => seq(
      '(',
        optional($._identifier_list),
      ')'
    ),
    return_statement: $ => seq(
      '=>',
      $.entry
    ),
    throw_statement: $ => seq(
      '#>',
      $._entry_list
    ),
    _entry_list: $ => prec.left(seq(
      $.entry,
      repeat(
        seq(
          ',',
          $.entry
        )
      )
    )),
    _identifier_list: $ => seq(
      $.identifier,
      repeat(
        seq(
          ',',
          $.identifier
        )
      )
    ),
    identifier: $ => prec.left(seq(
      choice(
        $.optional_value,
        $._label,
      ),
      optional($.type_annotation),
      optional($.parameter_list),
      optional($.return_statement),
      optional($.throw_statement),
    )),
    optional_value: $ => seq(
      '[',
      $._label,
      ']'
    ),
    type_annotation: $ => seq(
      '<',
      $._entry_list,
      '>'
    ),
    comment: $ => seq(
      '//',
      /[^\n]*/,
      $._newline,
    ),
    _label: $ => /[a-zA-Z0-9][a-zA-Z0-9_-]*/,
    _newline: $ => token('\n')
  }
});