brevity 0.4.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.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. data/.document +3 -0
  3. data/.gitignore +7 -0
  4. data/.rspec +1 -0
  5. data/.ruby-version +1 -0
  6. data/.yardopts +1 -0
  7. data/ChangeLog.rdoc +4 -0
  8. data/Gemfile +3 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.rdoc +27 -0
  11. data/Rakefile +67 -0
  12. data/bin/debrief +56 -0
  13. data/brevity.gemspec +28 -0
  14. data/examples/alley_cat.br +50 -0
  15. data/examples/hip.br +15 -0
  16. data/examples/missed_connection.br +6 -0
  17. data/examples/song1.br +11 -0
  18. data/examples/song2.br +10 -0
  19. data/examples/twinkle.br +18 -0
  20. data/lib/brevity/commands/constants.rb +18 -0
  21. data/lib/brevity/commands/expr.rb +17 -0
  22. data/lib/brevity/commands/meter.rb +20 -0
  23. data/lib/brevity/commands/part.rb +47 -0
  24. data/lib/brevity/commands/tempo.rb +13 -0
  25. data/lib/brevity/itemization.rb +73 -0
  26. data/lib/brevity/parsing/expression/dynamic.rb +280 -0
  27. data/lib/brevity/parsing/expression/dynamic.treetop +41 -0
  28. data/lib/brevity/parsing/expression/dynamic_nodes.rb +55 -0
  29. data/lib/brevity/parsing/expression/expression.rb +429 -0
  30. data/lib/brevity/parsing/expression/expression.treetop +39 -0
  31. data/lib/brevity/parsing/expression/expression_nodes.rb +26 -0
  32. data/lib/brevity/parsing/expression/gradual.rb +44 -0
  33. data/lib/brevity/parsing/expression/gradual.treetop +9 -0
  34. data/lib/brevity/parsing/expression/gradual_node.rb +11 -0
  35. data/lib/brevity/parsing/expression/label.rb +75 -0
  36. data/lib/brevity/parsing/expression/label.treetop +9 -0
  37. data/lib/brevity/parsing/expression/label_node.rb +15 -0
  38. data/lib/brevity/parsing/expression/sequence.rb +130 -0
  39. data/lib/brevity/parsing/expression/sequence.treetop +12 -0
  40. data/lib/brevity/parsing/expression/sequence_node.rb +14 -0
  41. data/lib/brevity/parsing/file/command.rb +216 -0
  42. data/lib/brevity/parsing/file/command.treetop +17 -0
  43. data/lib/brevity/parsing/file/command_node.rb +11 -0
  44. data/lib/brevity/parsing/file/comment.rb +178 -0
  45. data/lib/brevity/parsing/file/comment.treetop +21 -0
  46. data/lib/brevity/parsing/file/comment_node.rb +3 -0
  47. data/lib/brevity/parsing/file/file.rb +152 -0
  48. data/lib/brevity/parsing/file/file.treetop +16 -0
  49. data/lib/brevity/parsing/file/file_node.rb +7 -0
  50. data/lib/brevity/parsing/file/path.rb +235 -0
  51. data/lib/brevity/parsing/file/path.treetop +12 -0
  52. data/lib/brevity/parsing/modifiers/duplicate_modifier.rb +65 -0
  53. data/lib/brevity/parsing/modifiers/duplicate_modifier.treetop +11 -0
  54. data/lib/brevity/parsing/modifiers/duplicate_modifier_node.rb +8 -0
  55. data/lib/brevity/parsing/modifiers/modifier.rb +64 -0
  56. data/lib/brevity/parsing/modifiers/modifier.treetop +13 -0
  57. data/lib/brevity/parsing/modifiers/stretch_modifier.rb +69 -0
  58. data/lib/brevity/parsing/modifiers/stretch_modifier.treetop +11 -0
  59. data/lib/brevity/parsing/modifiers/stretch_modifier_node.rb +21 -0
  60. data/lib/brevity/parsing/modifiers/transpose_modifier.rb +69 -0
  61. data/lib/brevity/parsing/modifiers/transpose_modifier.treetop +11 -0
  62. data/lib/brevity/parsing/modifiers/transpose_modifier_node.rb +13 -0
  63. data/lib/brevity/parsing/note/accent.rb +44 -0
  64. data/lib/brevity/parsing/note/accent.treetop +9 -0
  65. data/lib/brevity/parsing/note/duration.rb +203 -0
  66. data/lib/brevity/parsing/note/duration.treetop +23 -0
  67. data/lib/brevity/parsing/note/duration_nodes.rb +19 -0
  68. data/lib/brevity/parsing/note/link.rb +69 -0
  69. data/lib/brevity/parsing/note/link.treetop +11 -0
  70. data/lib/brevity/parsing/note/link_node.rb +19 -0
  71. data/lib/brevity/parsing/note/note.rb +300 -0
  72. data/lib/brevity/parsing/note/note.treetop +30 -0
  73. data/lib/brevity/parsing/note/note_nodes.rb +77 -0
  74. data/lib/brevity/parsing/note/pitch.rb +81 -0
  75. data/lib/brevity/parsing/note/pitch.treetop +9 -0
  76. data/lib/brevity/parsing/note/pitch_node.rb +50 -0
  77. data/lib/brevity/parsing/numbers/nonnegative_integer.rb +53 -0
  78. data/lib/brevity/parsing/numbers/nonnegative_integer.treetop +9 -0
  79. data/lib/brevity/parsing/numbers/positive_integer.rb +91 -0
  80. data/lib/brevity/parsing/numbers/positive_integer.treetop +15 -0
  81. data/lib/brevity/read_file.rb +18 -0
  82. data/lib/brevity/score_maker.rb +64 -0
  83. data/lib/brevity/version.rb +4 -0
  84. data/lib/brevity.rb +53 -0
  85. data/manuals/brevity.pdf +0 -0
  86. data/manuals/brevity.tex +273 -0
  87. data/spec/brevity_spec.rb +8 -0
  88. data/spec/commands/expr_spec.rb +15 -0
  89. data/spec/commands/meter_spec.rb +21 -0
  90. data/spec/commands/part_spec.rb +16 -0
  91. data/spec/commands/tempo_spec.rb +20 -0
  92. data/spec/itemization_spec.rb +46 -0
  93. data/spec/parsing/expression/dynamic_nodes_spec.rb +32 -0
  94. data/spec/parsing/expression/dynamic_spec.rb +23 -0
  95. data/spec/parsing/expression/expression_nodes_spec.rb +87 -0
  96. data/spec/parsing/expression/expression_spec.rb +85 -0
  97. data/spec/parsing/expression/gradual_spec.rb +10 -0
  98. data/spec/parsing/expression/label_node_spec.rb +13 -0
  99. data/spec/parsing/expression/label_spec.rb +35 -0
  100. data/spec/parsing/file/command_node_spec.rb +29 -0
  101. data/spec/parsing/file/command_spec.rb +18 -0
  102. data/spec/parsing/file/comment_spec.rb +14 -0
  103. data/spec/parsing/file/file_node_spec.rb +19 -0
  104. data/spec/parsing/file/file_spec.rb +30 -0
  105. data/spec/parsing/modifiers/modifier_nodes_spec.rb +25 -0
  106. data/spec/parsing/modifiers/modifier_parsers_spec.rb +20 -0
  107. data/spec/parsing/note/accent_spec.rb +27 -0
  108. data/spec/parsing/note/duration_nodes_spec.rb +79 -0
  109. data/spec/parsing/note/duration_spec.rb +69 -0
  110. data/spec/parsing/note/link_node_spec.rb +30 -0
  111. data/spec/parsing/note/link_spec.rb +23 -0
  112. data/spec/parsing/note/note_nodes_spec.rb +82 -0
  113. data/spec/parsing/note/note_spec.rb +188 -0
  114. data/spec/parsing/note/pitch_node_spec.rb +48 -0
  115. data/spec/parsing/note/pitch_spec.rb +23 -0
  116. data/spec/parsing/numbers/nonnegative_integer_spec.rb +11 -0
  117. data/spec/parsing/numbers/positive_integer_spec.rb +17 -0
  118. data/spec/spec_helper.rb +112 -0
  119. metadata +293 -0
@@ -0,0 +1,130 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module Sequence
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :sequence
11
+ end
12
+
13
+ include Note
14
+
15
+ include Modifier
16
+
17
+ module Sequence0
18
+ def note
19
+ elements[1]
20
+ end
21
+
22
+ end
23
+
24
+ module Sequence1
25
+ def first
26
+ elements[0]
27
+ end
28
+
29
+ def more
30
+ elements[1]
31
+ end
32
+ end
33
+
34
+ def _nt_sequence
35
+ start_index = index
36
+ if node_cache[:sequence].has_key?(index)
37
+ cached = node_cache[:sequence][index]
38
+ if cached
39
+ node_cache[:sequence][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
40
+ @index = cached.interval.end
41
+ end
42
+ return cached
43
+ end
44
+
45
+ i0, s0 = index, []
46
+ r1 = _nt_note
47
+ s0 << r1
48
+ if r1
49
+ s2, i2 = [], index
50
+ loop do
51
+ i3, s3 = index, []
52
+ s4, i4 = [], index
53
+ loop do
54
+ if has_terminal?(@regexps[gr = '\A[\\s]'] ||= Regexp.new(gr), :regexp, index)
55
+ r5 = true
56
+ @index += 1
57
+ else
58
+ terminal_parse_failure('[\\s]')
59
+ r5 = nil
60
+ end
61
+ if r5
62
+ s4 << r5
63
+ else
64
+ break
65
+ end
66
+ end
67
+ if s4.empty?
68
+ @index = i4
69
+ r4 = nil
70
+ else
71
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
72
+ end
73
+ s3 << r4
74
+ if r4
75
+ r6 = _nt_note
76
+ s3 << r6
77
+ if r6
78
+ i7 = index
79
+ r8 = _nt_modifier
80
+ if r8
81
+ r7 = nil
82
+ else
83
+ @index = i7
84
+ r7 = instantiate_node(SyntaxNode,input, index...index)
85
+ end
86
+ s3 << r7
87
+ end
88
+ end
89
+ if s3.last
90
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
91
+ r3.extend(Sequence0)
92
+ else
93
+ @index = i3
94
+ r3 = nil
95
+ end
96
+ if r3
97
+ s2 << r3
98
+ else
99
+ break
100
+ end
101
+ end
102
+ if s2.empty?
103
+ @index = i2
104
+ r2 = nil
105
+ else
106
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
107
+ end
108
+ s0 << r2
109
+ end
110
+ if s0.last
111
+ r0 = instantiate_node(SequenceNode,input, i0...index, s0)
112
+ r0.extend(Sequence1)
113
+ else
114
+ @index = i0
115
+ r0 = nil
116
+ end
117
+
118
+ node_cache[:sequence][start_index] = r0
119
+
120
+ r0
121
+ end
122
+
123
+ end
124
+
125
+ class SequenceParser < Treetop::Runtime::CompiledParser
126
+ include Sequence
127
+ end
128
+
129
+
130
+ end
@@ -0,0 +1,12 @@
1
+ module Brevity
2
+
3
+ grammar Sequence
4
+ include Note
5
+ include Modifier
6
+
7
+ rule sequence
8
+ first:note more:([\s]+ note !modifier)+ <SequenceNode>
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,14 @@
1
+ module Brevity
2
+
3
+ DEFAULT_START_DYNAMIC = Music::Transcription::Dynamics::MF
4
+
5
+ class SequenceNode < Treetop::Runtime::SyntaxNode
6
+ def itemize(env)
7
+ Itemization.new(notes: notes)
8
+ end
9
+
10
+ def notes
11
+ [ first.to_note ] + more.elements.map {|el| el.note.to_note }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,216 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module Command
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :command
11
+ end
12
+
13
+ module Command0
14
+ def cmd_name
15
+ elements[1]
16
+ end
17
+
18
+ def braced_args
19
+ elements[2]
20
+ end
21
+ end
22
+
23
+ def _nt_command
24
+ start_index = index
25
+ if node_cache[:command].has_key?(index)
26
+ cached = node_cache[:command][index]
27
+ if cached
28
+ node_cache[:command][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
29
+ @index = cached.interval.end
30
+ end
31
+ return cached
32
+ end
33
+
34
+ i0, s0 = index, []
35
+ if (match_len = has_terminal?("\\", false, index))
36
+ r1 = true
37
+ @index += match_len
38
+ else
39
+ terminal_parse_failure("\\")
40
+ r1 = nil
41
+ end
42
+ s0 << r1
43
+ if r1
44
+ r2 = _nt_cmd_name
45
+ s0 << r2
46
+ if r2
47
+ s3, i3 = [], index
48
+ loop do
49
+ r4 = _nt_braced_arg
50
+ if r4
51
+ s3 << r4
52
+ else
53
+ break
54
+ end
55
+ end
56
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
57
+ s0 << r3
58
+ end
59
+ end
60
+ if s0.last
61
+ r0 = instantiate_node(CommandNode,input, i0...index, s0)
62
+ r0.extend(Command0)
63
+ else
64
+ @index = i0
65
+ r0 = nil
66
+ end
67
+
68
+ node_cache[:command][start_index] = r0
69
+
70
+ r0
71
+ end
72
+
73
+ def _nt_cmd_name
74
+ start_index = index
75
+ if node_cache[:cmd_name].has_key?(index)
76
+ cached = node_cache[:cmd_name][index]
77
+ if cached
78
+ node_cache[:cmd_name][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
79
+ @index = cached.interval.end
80
+ end
81
+ return cached
82
+ end
83
+
84
+ s0, i0 = [], index
85
+ loop do
86
+ if has_terminal?(@regexps[gr = '\A[a-z]'] ||= Regexp.new(gr), :regexp, index)
87
+ r1 = true
88
+ @index += 1
89
+ else
90
+ terminal_parse_failure('[a-z]')
91
+ r1 = nil
92
+ end
93
+ if r1
94
+ s0 << r1
95
+ else
96
+ break
97
+ end
98
+ end
99
+ if s0.empty?
100
+ @index = i0
101
+ r0 = nil
102
+ else
103
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
104
+ end
105
+
106
+ node_cache[:cmd_name][start_index] = r0
107
+
108
+ r0
109
+ end
110
+
111
+ module BracedArg0
112
+ end
113
+
114
+ module BracedArg1
115
+ def text
116
+ elements[1]
117
+ end
118
+
119
+ end
120
+
121
+ def _nt_braced_arg
122
+ start_index = index
123
+ if node_cache[:braced_arg].has_key?(index)
124
+ cached = node_cache[:braced_arg][index]
125
+ if cached
126
+ node_cache[:braced_arg][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
127
+ @index = cached.interval.end
128
+ end
129
+ return cached
130
+ end
131
+
132
+ i0, s0 = index, []
133
+ if (match_len = has_terminal?("{", false, index))
134
+ r1 = true
135
+ @index += match_len
136
+ else
137
+ terminal_parse_failure("{")
138
+ r1 = nil
139
+ end
140
+ s0 << r1
141
+ if r1
142
+ s2, i2 = [], index
143
+ loop do
144
+ i3, s3 = index, []
145
+ i4 = index
146
+ if (match_len = has_terminal?("}", false, index))
147
+ r5 = true
148
+ @index += match_len
149
+ else
150
+ terminal_parse_failure("}")
151
+ r5 = nil
152
+ end
153
+ if r5
154
+ r4 = nil
155
+ else
156
+ @index = i4
157
+ r4 = instantiate_node(SyntaxNode,input, index...index)
158
+ end
159
+ s3 << r4
160
+ if r4
161
+ if index < input_length
162
+ r6 = true
163
+ @index += 1
164
+ else
165
+ terminal_parse_failure("any character")
166
+ r6 = nil
167
+ end
168
+ s3 << r6
169
+ end
170
+ if s3.last
171
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
172
+ r3.extend(BracedArg0)
173
+ else
174
+ @index = i3
175
+ r3 = nil
176
+ end
177
+ if r3
178
+ s2 << r3
179
+ else
180
+ break
181
+ end
182
+ end
183
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
184
+ s0 << r2
185
+ if r2
186
+ if (match_len = has_terminal?("}", false, index))
187
+ r7 = true
188
+ @index += match_len
189
+ else
190
+ terminal_parse_failure("}")
191
+ r7 = nil
192
+ end
193
+ s0 << r7
194
+ end
195
+ end
196
+ if s0.last
197
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
198
+ r0.extend(BracedArg1)
199
+ else
200
+ @index = i0
201
+ r0 = nil
202
+ end
203
+
204
+ node_cache[:braced_arg][start_index] = r0
205
+
206
+ r0
207
+ end
208
+
209
+ end
210
+
211
+ class CommandParser < Treetop::Runtime::CompiledParser
212
+ include Command
213
+ end
214
+
215
+
216
+ end
@@ -0,0 +1,17 @@
1
+ module Brevity
2
+
3
+ grammar Command
4
+ rule command
5
+ "\\" cmd_name braced_args:braced_arg* <CommandNode>
6
+ end
7
+
8
+ rule cmd_name
9
+ [a-z]+
10
+ end
11
+
12
+ rule braced_arg
13
+ "{" text:(!"}" .)* "}"
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,11 @@
1
+ module Brevity
2
+ class CommandNode < Treetop::Runtime::SyntaxNode
3
+ def name
4
+ cmd_name.text_value
5
+ end
6
+
7
+ def args
8
+ braced_args.elements.map {|el| el.text.text_value }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,178 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module Comment
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :comment
11
+ end
12
+
13
+ module Comment0
14
+ end
15
+
16
+ module Comment1
17
+ end
18
+
19
+ def _nt_comment
20
+ start_index = index
21
+ if node_cache[:comment].has_key?(index)
22
+ cached = node_cache[:comment][index]
23
+ if cached
24
+ node_cache[:comment][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
25
+ @index = cached.interval.end
26
+ end
27
+ return cached
28
+ end
29
+
30
+ i0, s0 = index, []
31
+ if (match_len = has_terminal?("#", false, index))
32
+ r1 = true
33
+ @index += match_len
34
+ else
35
+ terminal_parse_failure("#")
36
+ r1 = nil
37
+ end
38
+ s0 << r1
39
+ if r1
40
+ s2, i2 = [], index
41
+ loop do
42
+ i3, s3 = index, []
43
+ i4 = index
44
+ r5 = _nt_newline
45
+ if r5
46
+ r4 = nil
47
+ else
48
+ @index = i4
49
+ r4 = instantiate_node(SyntaxNode,input, index...index)
50
+ end
51
+ s3 << r4
52
+ if r4
53
+ if index < input_length
54
+ r6 = true
55
+ @index += 1
56
+ else
57
+ terminal_parse_failure("any character")
58
+ r6 = nil
59
+ end
60
+ s3 << r6
61
+ end
62
+ if s3.last
63
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
64
+ r3.extend(Comment0)
65
+ else
66
+ @index = i3
67
+ r3 = nil
68
+ end
69
+ if r3
70
+ s2 << r3
71
+ else
72
+ break
73
+ end
74
+ end
75
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
76
+ s0 << r2
77
+ end
78
+ if s0.last
79
+ r0 = instantiate_node(CommentNode,input, i0...index, s0)
80
+ r0.extend(Comment1)
81
+ else
82
+ @index = i0
83
+ r0 = nil
84
+ end
85
+
86
+ node_cache[:comment][start_index] = r0
87
+
88
+ r0
89
+ end
90
+
91
+ def _nt_newline
92
+ start_index = index
93
+ if node_cache[:newline].has_key?(index)
94
+ cached = node_cache[:newline][index]
95
+ if cached
96
+ node_cache[:newline][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
97
+ @index = cached.interval.end
98
+ end
99
+ return cached
100
+ end
101
+
102
+ i0 = index
103
+ r1 = _nt_windows_newline
104
+ if r1
105
+ r1 = SyntaxNode.new(input, (index-1)...index) if r1 == true
106
+ r0 = r1
107
+ else
108
+ r2 = _nt_unix_newline
109
+ if r2
110
+ r2 = SyntaxNode.new(input, (index-1)...index) if r2 == true
111
+ r0 = r2
112
+ else
113
+ @index = i0
114
+ r0 = nil
115
+ end
116
+ end
117
+
118
+ node_cache[:newline][start_index] = r0
119
+
120
+ r0
121
+ end
122
+
123
+ def _nt_windows_newline
124
+ start_index = index
125
+ if node_cache[:windows_newline].has_key?(index)
126
+ cached = node_cache[:windows_newline][index]
127
+ if cached
128
+ node_cache[:windows_newline][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
129
+ @index = cached.interval.end
130
+ end
131
+ return cached
132
+ end
133
+
134
+ if (match_len = has_terminal?("\r\n", false, index))
135
+ r0 = instantiate_node(SyntaxNode,input, index...(index + match_len))
136
+ @index += match_len
137
+ else
138
+ terminal_parse_failure("\r\n")
139
+ r0 = nil
140
+ end
141
+
142
+ node_cache[:windows_newline][start_index] = r0
143
+
144
+ r0
145
+ end
146
+
147
+ def _nt_unix_newline
148
+ start_index = index
149
+ if node_cache[:unix_newline].has_key?(index)
150
+ cached = node_cache[:unix_newline][index]
151
+ if cached
152
+ node_cache[:unix_newline][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
153
+ @index = cached.interval.end
154
+ end
155
+ return cached
156
+ end
157
+
158
+ if (match_len = has_terminal?("\n", false, index))
159
+ r0 = instantiate_node(SyntaxNode,input, index...(index + match_len))
160
+ @index += match_len
161
+ else
162
+ terminal_parse_failure("\n")
163
+ r0 = nil
164
+ end
165
+
166
+ node_cache[:unix_newline][start_index] = r0
167
+
168
+ r0
169
+ end
170
+
171
+ end
172
+
173
+ class CommentParser < Treetop::Runtime::CompiledParser
174
+ include Comment
175
+ end
176
+
177
+
178
+ end
@@ -0,0 +1,21 @@
1
+ module Brevity
2
+
3
+ grammar Comment
4
+ rule comment
5
+ "#" (!newline .)* <CommentNode>
6
+ end
7
+
8
+ rule newline
9
+ windows_newline / unix_newline
10
+ end
11
+
12
+ rule windows_newline
13
+ "\r\n"
14
+ end
15
+
16
+ rule unix_newline
17
+ "\n"
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,3 @@
1
+ module Brevity
2
+ class CommentNode < Treetop::Runtime::SyntaxNode; end
3
+ end