brevity 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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,300 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module Note
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :note
11
+ end
12
+
13
+ include Pitch
14
+
15
+ include Accent
16
+
17
+ include Link
18
+
19
+ include Duration
20
+
21
+ def _nt_note
22
+ start_index = index
23
+ if node_cache[:note].has_key?(index)
24
+ cached = node_cache[:note][index]
25
+ if cached
26
+ node_cache[:note][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
27
+ @index = cached.interval.end
28
+ end
29
+ return cached
30
+ end
31
+
32
+ i0 = index
33
+ r1 = _nt_polyphonic_note
34
+ if r1
35
+ r1 = SyntaxNode.new(input, (index-1)...index) if r1 == true
36
+ r0 = r1
37
+ else
38
+ r2 = _nt_monophonic_note
39
+ if r2
40
+ r2 = SyntaxNode.new(input, (index-1)...index) if r2 == true
41
+ r0 = r2
42
+ else
43
+ r3 = _nt_rest_note
44
+ if r3
45
+ r3 = SyntaxNode.new(input, (index-1)...index) if r3 == true
46
+ r0 = r3
47
+ else
48
+ @index = i0
49
+ r0 = nil
50
+ end
51
+ end
52
+ end
53
+
54
+ node_cache[:note][start_index] = r0
55
+
56
+ r0
57
+ end
58
+
59
+ module RestNote0
60
+ def duration
61
+ elements[0]
62
+ end
63
+ end
64
+
65
+ def _nt_rest_note
66
+ start_index = index
67
+ if node_cache[:rest_note].has_key?(index)
68
+ cached = node_cache[:rest_note][index]
69
+ if cached
70
+ node_cache[:rest_note][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
71
+ @index = cached.interval.end
72
+ end
73
+ return cached
74
+ end
75
+
76
+ i0, s0 = index, []
77
+ r1 = _nt_duration
78
+ s0 << r1
79
+ if s0.last
80
+ r0 = instantiate_node(RestNoteNode,input, i0...index, s0)
81
+ r0.extend(RestNote0)
82
+ else
83
+ @index = i0
84
+ r0 = nil
85
+ end
86
+
87
+ node_cache[:rest_note][start_index] = r0
88
+
89
+ r0
90
+ end
91
+
92
+ module MonophonicNote0
93
+ def duration
94
+ elements[0]
95
+ end
96
+
97
+ def pl
98
+ elements[1]
99
+ end
100
+
101
+ def acc
102
+ elements[2]
103
+ end
104
+ end
105
+
106
+ def _nt_monophonic_note
107
+ start_index = index
108
+ if node_cache[:monophonic_note].has_key?(index)
109
+ cached = node_cache[:monophonic_note][index]
110
+ if cached
111
+ node_cache[:monophonic_note][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
112
+ @index = cached.interval.end
113
+ end
114
+ return cached
115
+ end
116
+
117
+ i0, s0 = index, []
118
+ r1 = _nt_duration
119
+ s0 << r1
120
+ if r1
121
+ r2 = _nt_pitch_link
122
+ s0 << r2
123
+ if r2
124
+ r4 = _nt_accent
125
+ if r4
126
+ r3 = r4
127
+ else
128
+ r3 = instantiate_node(SyntaxNode,input, index...index)
129
+ end
130
+ s0 << r3
131
+ end
132
+ end
133
+ if s0.last
134
+ r0 = instantiate_node(MonophonicNoteNode,input, i0...index, s0)
135
+ r0.extend(MonophonicNote0)
136
+ else
137
+ @index = i0
138
+ r0 = nil
139
+ end
140
+
141
+ node_cache[:monophonic_note][start_index] = r0
142
+
143
+ r0
144
+ end
145
+
146
+ module PolyphonicNote0
147
+ def pl
148
+ elements[1]
149
+ end
150
+ end
151
+
152
+ module PolyphonicNote1
153
+ def duration
154
+ elements[0]
155
+ end
156
+
157
+ def pl
158
+ elements[1]
159
+ end
160
+
161
+ def more_pitches
162
+ elements[2]
163
+ end
164
+
165
+ def acc
166
+ elements[3]
167
+ end
168
+ end
169
+
170
+ def _nt_polyphonic_note
171
+ start_index = index
172
+ if node_cache[:polyphonic_note].has_key?(index)
173
+ cached = node_cache[:polyphonic_note][index]
174
+ if cached
175
+ node_cache[:polyphonic_note][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
176
+ @index = cached.interval.end
177
+ end
178
+ return cached
179
+ end
180
+
181
+ i0, s0 = index, []
182
+ r1 = _nt_duration
183
+ s0 << r1
184
+ if r1
185
+ r2 = _nt_pitch_link
186
+ s0 << r2
187
+ if r2
188
+ s3, i3 = [], index
189
+ loop do
190
+ i4, s4 = index, []
191
+ if (match_len = has_terminal?(",", false, index))
192
+ r5 = true
193
+ @index += match_len
194
+ else
195
+ terminal_parse_failure(",")
196
+ r5 = nil
197
+ end
198
+ s4 << r5
199
+ if r5
200
+ r6 = _nt_pitch_link
201
+ s4 << r6
202
+ end
203
+ if s4.last
204
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
205
+ r4.extend(PolyphonicNote0)
206
+ else
207
+ @index = i4
208
+ r4 = nil
209
+ end
210
+ if r4
211
+ s3 << r4
212
+ else
213
+ break
214
+ end
215
+ end
216
+ if s3.empty?
217
+ @index = i3
218
+ r3 = nil
219
+ else
220
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
221
+ end
222
+ s0 << r3
223
+ if r3
224
+ r8 = _nt_accent
225
+ if r8
226
+ r7 = r8
227
+ else
228
+ r7 = instantiate_node(SyntaxNode,input, index...index)
229
+ end
230
+ s0 << r7
231
+ end
232
+ end
233
+ end
234
+ if s0.last
235
+ r0 = instantiate_node(PolyphonicNoteNode,input, i0...index, s0)
236
+ r0.extend(PolyphonicNote1)
237
+ else
238
+ @index = i0
239
+ r0 = nil
240
+ end
241
+
242
+ node_cache[:polyphonic_note][start_index] = r0
243
+
244
+ r0
245
+ end
246
+
247
+ module PitchLink0
248
+ def pitch
249
+ elements[0]
250
+ end
251
+
252
+ def the_link
253
+ elements[1]
254
+ end
255
+ end
256
+
257
+ def _nt_pitch_link
258
+ start_index = index
259
+ if node_cache[:pitch_link].has_key?(index)
260
+ cached = node_cache[:pitch_link][index]
261
+ if cached
262
+ node_cache[:pitch_link][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
263
+ @index = cached.interval.end
264
+ end
265
+ return cached
266
+ end
267
+
268
+ i0, s0 = index, []
269
+ r1 = _nt_pitch
270
+ s0 << r1
271
+ if r1
272
+ r3 = _nt_link
273
+ if r3
274
+ r2 = r3
275
+ else
276
+ r2 = instantiate_node(SyntaxNode,input, index...index)
277
+ end
278
+ s0 << r2
279
+ end
280
+ if s0.last
281
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
282
+ r0.extend(PitchLink0)
283
+ else
284
+ @index = i0
285
+ r0 = nil
286
+ end
287
+
288
+ node_cache[:pitch_link][start_index] = r0
289
+
290
+ r0
291
+ end
292
+
293
+ end
294
+
295
+ class NoteParser < Treetop::Runtime::CompiledParser
296
+ include Note
297
+ end
298
+
299
+
300
+ end
@@ -0,0 +1,30 @@
1
+ module Brevity
2
+
3
+ grammar Note
4
+ include Pitch
5
+ include Accent
6
+ include Link
7
+ include Duration
8
+
9
+ rule note
10
+ polyphonic_note / monophonic_note / rest_note
11
+ end
12
+
13
+ rule rest_note
14
+ duration:duration <RestNoteNode>
15
+ end
16
+
17
+ rule monophonic_note
18
+ duration pl:pitch_link acc:(accent)? <MonophonicNoteNode>
19
+ end
20
+
21
+ rule polyphonic_note
22
+ duration pl:pitch_link more_pitches:("," pl:pitch_link)+ acc:(accent)? <PolyphonicNoteNode>
23
+ end
24
+
25
+ rule pitch_link
26
+ pitch the_link:link?
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,77 @@
1
+ class String
2
+ def to_accent
3
+ case self
4
+ when "."
5
+ accent = Music::Transcription::Accent::Staccato.new
6
+ when "'"
7
+ accent = Music::Transcription::Accent::Staccatissimo.new
8
+ when ">"
9
+ accent = Music::Transcription::Accent::Marcato.new
10
+ when "^"
11
+ accent = Music::Transcription::Accent::Martellato.new
12
+ when "_"
13
+ accent = Music::Transcription::Accent::Tenuto.new
14
+ else
15
+ raise RuntimeError, "no accent found for #{self}"
16
+ end
17
+ end
18
+ end
19
+
20
+ module Brevity
21
+ class NoteNode < Treetop::Runtime::SyntaxNode
22
+ def itemize(env)
23
+ Itemization.new(notes: [self.to_note])
24
+ end
25
+
26
+ def primitives env
27
+ [ self.to_note ]
28
+ end
29
+ end
30
+
31
+ class RestNoteNode < NoteNode
32
+ def to_note
33
+ Music::Transcription::Note.new(duration.to_r)
34
+ end
35
+ end
36
+
37
+ class MonophonicNoteNode < NoteNode
38
+ def to_note
39
+ pitches = [ pl.pitch.to_pitch ]
40
+ links = {}
41
+ unless pl.the_link.empty?
42
+ links[pitches[0]] = pl.the_link.to_link
43
+ end
44
+
45
+ if acc.empty?
46
+ Music::Transcription::Note.new(duration.to_r,pitches,links:links)
47
+ else
48
+ accent = acc.text_value.to_accent
49
+ Music::Transcription::Note.new(duration.to_r,pitches,links:links,accent:accent)
50
+ end
51
+ end
52
+ end
53
+
54
+ class PolyphonicNoteNode < NoteNode
55
+ def to_note
56
+ pitches = [ pl.pitch.to_pitch ]
57
+ links = {}
58
+ unless pl.the_link.empty?
59
+ links[pitches[0]] = pl.the_link.to_link
60
+ end
61
+
62
+ more_pitches.elements.each do |mp|
63
+ pitches.push mp.pl.pitch.to_pitch
64
+ unless mp.pl.the_link.empty?
65
+ links[pitches[-1]] = mp.pl.the_link.to_link
66
+ end
67
+ end
68
+
69
+ if acc.empty?
70
+ Music::Transcription::Note.new(duration.to_r,pitches,links:links)
71
+ else
72
+ accent = acc.text_value.to_accent
73
+ Music::Transcription::Note.new(duration.to_r,pitches,links:links,accent:accent)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,81 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module Pitch
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :pitch
11
+ end
12
+
13
+ module Pitch0
14
+ end
15
+
16
+ def _nt_pitch
17
+ start_index = index
18
+ if node_cache[:pitch].has_key?(index)
19
+ cached = node_cache[:pitch][index]
20
+ if cached
21
+ node_cache[:pitch][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
22
+ @index = cached.interval.end
23
+ end
24
+ return cached
25
+ end
26
+
27
+ i0, s0 = index, []
28
+ if has_terminal?(@regexps[gr = '\A[A-Ga-g]'] ||= Regexp.new(gr), :regexp, index)
29
+ r1 = true
30
+ @index += 1
31
+ else
32
+ terminal_parse_failure('[A-Ga-g]')
33
+ r1 = nil
34
+ end
35
+ s0 << r1
36
+ if r1
37
+ if has_terminal?(@regexps[gr = '\A[#b]'] ||= Regexp.new(gr), :regexp, index)
38
+ r3 = true
39
+ @index += 1
40
+ else
41
+ terminal_parse_failure('[#b]')
42
+ r3 = nil
43
+ end
44
+ if r3
45
+ r2 = r3
46
+ else
47
+ r2 = instantiate_node(SyntaxNode,input, index...index)
48
+ end
49
+ s0 << r2
50
+ if r2
51
+ if has_terminal?(@regexps[gr = '\A[0-9]'] ||= Regexp.new(gr), :regexp, index)
52
+ r4 = true
53
+ @index += 1
54
+ else
55
+ terminal_parse_failure('[0-9]')
56
+ r4 = nil
57
+ end
58
+ s0 << r4
59
+ end
60
+ end
61
+ if s0.last
62
+ r0 = instantiate_node(PitchNode,input, i0...index, s0)
63
+ r0.extend(Pitch0)
64
+ else
65
+ @index = i0
66
+ r0 = nil
67
+ end
68
+
69
+ node_cache[:pitch][start_index] = r0
70
+
71
+ r0
72
+ end
73
+
74
+ end
75
+
76
+ class PitchParser < Treetop::Runtime::CompiledParser
77
+ include Pitch
78
+ end
79
+
80
+
81
+ end
@@ -0,0 +1,9 @@
1
+ module Brevity
2
+
3
+ grammar Pitch
4
+ rule pitch
5
+ [A-Ga-g] [#b]? [0-9] <PitchNode>
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1,50 @@
1
+ class String
2
+ # Create a Pitch object from a string (e.g. "C2"). String can contain a letter (A-G),
3
+ # to indicate the semitone, followed by an optional sharp/flat (#/b) and then the
4
+ # octave number (non-negative integer).
5
+ def to_pitch
6
+ string = self
7
+ if string =~ /[AaBbCcDdEeFfGg][#b][\d]+/
8
+ semitone = letter_to_semitone string[0]
9
+ semitone = case string[1]
10
+ when "#" then semitone + 1
11
+ when "b" then semitone - 1
12
+ else raise ArgumentError, "unexpected symbol found"
13
+ end
14
+ octave = string[2..-1].to_i
15
+ return Music::Transcription::Pitch.new(:octave => octave, :semitone => semitone)
16
+ elsif string =~ /[AaBbCcDdEeFfGg][\d]+/
17
+ semitone = letter_to_semitone string[0]
18
+ octave = string[1..-1].to_i
19
+ return Music::Transcription::Pitch.new(:octave => octave, :semitone => semitone)
20
+ else
21
+ raise ArgumentError, "string #{string} cannot be converted to a pitch"
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def letter_to_semitone letter
28
+ semitone = case letter
29
+ when /[Cc]/ then 0
30
+ when /[Dd]/ then 2
31
+ when /[Ee]/ then 4
32
+ when /[Ff]/ then 5
33
+ when /[Gg]/ then 7
34
+ when /[Aa]/ then 9
35
+ when /[Bb]/ then 11
36
+ else raise ArgumentError, "invalid letter \"#{letter}\" given"
37
+ end
38
+
39
+ return semitone
40
+ end
41
+ end
42
+
43
+ module Brevity
44
+ class PitchNode < Treetop::Runtime::SyntaxNode
45
+ def to_pitch
46
+ # use the added String#to_pitch method
47
+ text_value.to_pitch
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,53 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module NonnegativeInteger
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :nonnegative_integer
11
+ end
12
+
13
+ def _nt_nonnegative_integer
14
+ start_index = index
15
+ if node_cache[:nonnegative_integer].has_key?(index)
16
+ cached = node_cache[:nonnegative_integer][index]
17
+ if cached
18
+ node_cache[:nonnegative_integer][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
19
+ @index = cached.interval.end
20
+ end
21
+ return cached
22
+ end
23
+
24
+ s0, i0 = [], index
25
+ loop do
26
+ if has_terminal?(@regexps[gr = '\A[0-9]'] ||= Regexp.new(gr), :regexp, index)
27
+ r1 = true
28
+ @index += 1
29
+ else
30
+ terminal_parse_failure('[0-9]')
31
+ r1 = nil
32
+ end
33
+ if r1
34
+ s0 << r1
35
+ else
36
+ break
37
+ end
38
+ end
39
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
40
+
41
+ node_cache[:nonnegative_integer][start_index] = r0
42
+
43
+ r0
44
+ end
45
+
46
+ end
47
+
48
+ class NonnegativeIntegerParser < Treetop::Runtime::CompiledParser
49
+ include NonnegativeInteger
50
+ end
51
+
52
+
53
+ end
@@ -0,0 +1,9 @@
1
+ module Brevity
2
+
3
+ grammar NonnegativeInteger
4
+ rule nonnegative_integer
5
+ [0-9]*
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1,91 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Brevity
5
+
6
+ module PositiveInteger
7
+ include Treetop::Runtime
8
+
9
+ def root
10
+ @root ||= :positive_integer
11
+ end
12
+
13
+ include NonnegativeInteger
14
+
15
+ module PositiveInteger0
16
+ def nonnegative_integer
17
+ elements[2]
18
+ end
19
+ end
20
+
21
+ module PositiveInteger1
22
+ def to_i
23
+ text_value.to_i
24
+ end
25
+ end
26
+
27
+ def _nt_positive_integer
28
+ start_index = index
29
+ if node_cache[:positive_integer].has_key?(index)
30
+ cached = node_cache[:positive_integer][index]
31
+ if cached
32
+ node_cache[:positive_integer][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
33
+ @index = cached.interval.end
34
+ end
35
+ return cached
36
+ end
37
+
38
+ i0, s0 = index, []
39
+ s1, i1 = [], index
40
+ loop do
41
+ if has_terminal?(@regexps[gr = '\A[0]'] ||= Regexp.new(gr), :regexp, index)
42
+ r2 = true
43
+ @index += 1
44
+ else
45
+ terminal_parse_failure('[0]')
46
+ r2 = nil
47
+ end
48
+ if r2
49
+ s1 << r2
50
+ else
51
+ break
52
+ end
53
+ end
54
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
55
+ s0 << r1
56
+ if r1
57
+ if has_terminal?(@regexps[gr = '\A[1-9]'] ||= Regexp.new(gr), :regexp, index)
58
+ r3 = true
59
+ @index += 1
60
+ else
61
+ terminal_parse_failure('[1-9]')
62
+ r3 = nil
63
+ end
64
+ s0 << r3
65
+ if r3
66
+ r4 = _nt_nonnegative_integer
67
+ s0 << r4
68
+ end
69
+ end
70
+ if s0.last
71
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
72
+ r0.extend(PositiveInteger0)
73
+ r0.extend(PositiveInteger1)
74
+ else
75
+ @index = i0
76
+ r0 = nil
77
+ end
78
+
79
+ node_cache[:positive_integer][start_index] = r0
80
+
81
+ r0
82
+ end
83
+
84
+ end
85
+
86
+ class PositiveIntegerParser < Treetop::Runtime::CompiledParser
87
+ include PositiveInteger
88
+ end
89
+
90
+
91
+ end
@@ -0,0 +1,15 @@
1
+ module Brevity
2
+
3
+ grammar PositiveInteger
4
+ include NonnegativeInteger
5
+
6
+ rule positive_integer
7
+ [0]* [1-9] nonnegative_integer {
8
+ def to_i
9
+ text_value.to_i
10
+ end
11
+ }
12
+ end
13
+ end
14
+
15
+ end