exalted_math 0.1.2 → 0.1.3

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.
data/Rakefile CHANGED
@@ -29,3 +29,9 @@ rescue LoadError
29
29
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
30
30
  end
31
31
 
32
+ file 'lib/exalted_math/math.rb' => 'lib/exalted_math/math.treetop' do
33
+ sh "tt lib/exalted_math/math.treetop"
34
+ end
35
+
36
+ desc "Regenerate the treetop file"
37
+ task :treetop => 'lib/exalted_math/math.rb'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
data/exalted_math.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{exalted_math}
8
- s.version = "0.1.2"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jonathan Stott"]
12
- s.date = %q{2010-06-06}
12
+ s.date = %q{2010-06-09}
13
13
  s.description = %q{Parsing and evaluation of simple maths expressions for Exalted
14
14
 
15
15
  This intended to aid in evaluating simple calculations which appear on character sheets, especially for Exalted.}
data/lib/exalted_math.rb CHANGED
@@ -1,13 +1,16 @@
1
1
  #!/usr/bin/ruby
2
2
  # Jonathan D. Stott <jonathan.stott@gmail.com>
3
- require 'treetop'
3
+ require 'treetop/runtime'
4
4
  require 'exalted_math/math'
5
5
  require 'exalted_math/ast'
6
6
 
7
7
  module Exalted
8
8
  class MathsParser
9
9
  def ast(text)
10
- result = parse(text)
10
+ txt = text.dup
11
+ txt.strip!
12
+ txt.gsub!(/\s+/," ")
13
+ result = parse(txt)
11
14
  if result
12
15
  [true, result.ast]
13
16
  else
@@ -14,8 +14,12 @@ module Maths
14
14
  elements[0]
15
15
  end
16
16
 
17
+ def space
18
+ elements[2]
19
+ end
20
+
17
21
  def additive
18
- elements[4]
22
+ elements[3]
19
23
  end
20
24
  end
21
25
 
@@ -30,8 +34,12 @@ module Maths
30
34
  elements[0]
31
35
  end
32
36
 
37
+ def space
38
+ elements[2]
39
+ end
40
+
33
41
  def additive
34
- elements[4]
42
+ elements[3]
35
43
  end
36
44
  end
37
45
 
@@ -57,42 +65,20 @@ module Maths
57
65
  r2 = _nt_multitive
58
66
  s1 << r2
59
67
  if r2
60
- s3, i3 = [], index
61
- loop do
62
- r4 = _nt_space
63
- if r4
64
- s3 << r4
65
- else
66
- break
67
- end
68
+ if has_terminal?('+', false, index)
69
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
70
+ @index += 1
71
+ else
72
+ terminal_parse_failure('+')
73
+ r3 = nil
68
74
  end
69
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
70
75
  s1 << r3
71
76
  if r3
72
- if has_terminal?('+', false, index)
73
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
74
- @index += 1
75
- else
76
- terminal_parse_failure('+')
77
- r5 = nil
78
- end
79
- s1 << r5
80
- if r5
81
- s6, i6 = [], index
82
- loop do
83
- r7 = _nt_space
84
- if r7
85
- s6 << r7
86
- else
87
- break
88
- end
89
- end
90
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
91
- s1 << r6
92
- if r6
93
- r8 = _nt_additive
94
- s1 << r8
95
- end
77
+ r4 = _nt_space
78
+ s1 << r4
79
+ if r4
80
+ r5 = _nt_additive
81
+ s1 << r5
96
82
  end
97
83
  end
98
84
  end
@@ -107,63 +93,41 @@ module Maths
107
93
  if r1
108
94
  r0 = r1
109
95
  else
110
- i9, s9 = index, []
111
- r10 = _nt_multitive
112
- s9 << r10
113
- if r10
114
- s11, i11 = [], index
115
- loop do
116
- r12 = _nt_space
117
- if r12
118
- s11 << r12
119
- else
120
- break
121
- end
96
+ i6, s6 = index, []
97
+ r7 = _nt_multitive
98
+ s6 << r7
99
+ if r7
100
+ if has_terminal?('-', false, index)
101
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
102
+ @index += 1
103
+ else
104
+ terminal_parse_failure('-')
105
+ r8 = nil
122
106
  end
123
- r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
124
- s9 << r11
125
- if r11
126
- if has_terminal?('-', false, index)
127
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
128
- @index += 1
129
- else
130
- terminal_parse_failure('-')
131
- r13 = nil
132
- end
133
- s9 << r13
134
- if r13
135
- s14, i14 = [], index
136
- loop do
137
- r15 = _nt_space
138
- if r15
139
- s14 << r15
140
- else
141
- break
142
- end
143
- end
144
- r14 = instantiate_node(SyntaxNode,input, i14...index, s14)
145
- s9 << r14
146
- if r14
147
- r16 = _nt_additive
148
- s9 << r16
149
- end
107
+ s6 << r8
108
+ if r8
109
+ r9 = _nt_space
110
+ s6 << r9
111
+ if r9
112
+ r10 = _nt_additive
113
+ s6 << r10
150
114
  end
151
115
  end
152
116
  end
153
- if s9.last
154
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
155
- r9.extend(Additive2)
156
- r9.extend(Additive3)
117
+ if s6.last
118
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
119
+ r6.extend(Additive2)
120
+ r6.extend(Additive3)
157
121
  else
158
- @index = i9
159
- r9 = nil
122
+ @index = i6
123
+ r6 = nil
160
124
  end
161
- if r9
162
- r0 = r9
125
+ if r6
126
+ r0 = r6
163
127
  else
164
- r17 = _nt_multitive
165
- if r17
166
- r0 = r17
128
+ r11 = _nt_multitive
129
+ if r11
130
+ r0 = r11
167
131
  else
168
132
  @index = i0
169
133
  r0 = nil
@@ -181,8 +145,12 @@ module Maths
181
145
  elements[0]
182
146
  end
183
147
 
148
+ def space
149
+ elements[2]
150
+ end
151
+
184
152
  def multitive
185
- elements[4]
153
+ elements[3]
186
154
  end
187
155
  end
188
156
 
@@ -197,8 +165,12 @@ module Maths
197
165
  elements[0]
198
166
  end
199
167
 
168
+ def space
169
+ elements[2]
170
+ end
171
+
200
172
  def multitive
201
- elements[4]
173
+ elements[3]
202
174
  end
203
175
  end
204
176
 
@@ -224,42 +196,20 @@ module Maths
224
196
  r2 = _nt_primary
225
197
  s1 << r2
226
198
  if r2
227
- s3, i3 = [], index
228
- loop do
229
- r4 = _nt_space
230
- if r4
231
- s3 << r4
232
- else
233
- break
234
- end
199
+ if has_terminal?('*', false, index)
200
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
201
+ @index += 1
202
+ else
203
+ terminal_parse_failure('*')
204
+ r3 = nil
235
205
  end
236
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
237
206
  s1 << r3
238
207
  if r3
239
- if has_terminal?('*', false, index)
240
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
241
- @index += 1
242
- else
243
- terminal_parse_failure('*')
244
- r5 = nil
245
- end
246
- s1 << r5
247
- if r5
248
- s6, i6 = [], index
249
- loop do
250
- r7 = _nt_space
251
- if r7
252
- s6 << r7
253
- else
254
- break
255
- end
256
- end
257
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
258
- s1 << r6
259
- if r6
260
- r8 = _nt_multitive
261
- s1 << r8
262
- end
208
+ r4 = _nt_space
209
+ s1 << r4
210
+ if r4
211
+ r5 = _nt_multitive
212
+ s1 << r5
263
213
  end
264
214
  end
265
215
  end
@@ -274,63 +224,41 @@ module Maths
274
224
  if r1
275
225
  r0 = r1
276
226
  else
277
- i9, s9 = index, []
278
- r10 = _nt_primary
279
- s9 << r10
280
- if r10
281
- s11, i11 = [], index
282
- loop do
283
- r12 = _nt_space
284
- if r12
285
- s11 << r12
286
- else
287
- break
288
- end
227
+ i6, s6 = index, []
228
+ r7 = _nt_primary
229
+ s6 << r7
230
+ if r7
231
+ if has_terminal?('/', false, index)
232
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
233
+ @index += 1
234
+ else
235
+ terminal_parse_failure('/')
236
+ r8 = nil
289
237
  end
290
- r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
291
- s9 << r11
292
- if r11
293
- if has_terminal?('/', false, index)
294
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
295
- @index += 1
296
- else
297
- terminal_parse_failure('/')
298
- r13 = nil
299
- end
300
- s9 << r13
301
- if r13
302
- s14, i14 = [], index
303
- loop do
304
- r15 = _nt_space
305
- if r15
306
- s14 << r15
307
- else
308
- break
309
- end
310
- end
311
- r14 = instantiate_node(SyntaxNode,input, i14...index, s14)
312
- s9 << r14
313
- if r14
314
- r16 = _nt_multitive
315
- s9 << r16
316
- end
238
+ s6 << r8
239
+ if r8
240
+ r9 = _nt_space
241
+ s6 << r9
242
+ if r9
243
+ r10 = _nt_multitive
244
+ s6 << r10
317
245
  end
318
246
  end
319
247
  end
320
- if s9.last
321
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
322
- r9.extend(Multitive2)
323
- r9.extend(Multitive3)
248
+ if s6.last
249
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
250
+ r6.extend(Multitive2)
251
+ r6.extend(Multitive3)
324
252
  else
325
- @index = i9
326
- r9 = nil
253
+ @index = i6
254
+ r6 = nil
327
255
  end
328
- if r9
329
- r0 = r9
256
+ if r6
257
+ r0 = r6
330
258
  else
331
- r17 = _nt_primary
332
- if r17
333
- r0 = r17
259
+ r11 = _nt_primary
260
+ if r11
261
+ r0 = r11
334
262
  else
335
263
  @index = i0
336
264
  r0 = nil
@@ -344,10 +272,17 @@ module Maths
344
272
  end
345
273
 
346
274
  module Primary0
275
+ def space1
276
+ elements[1]
277
+ end
278
+
347
279
  def additive
348
280
  elements[2]
349
281
  end
350
282
 
283
+ def space2
284
+ elements[4]
285
+ end
351
286
  end
352
287
 
353
288
  module Primary1
@@ -378,41 +313,23 @@ module Maths
378
313
  end
379
314
  s1 << r2
380
315
  if r2
381
- s3, i3 = [], index
382
- loop do
383
- r4 = _nt_space
384
- if r4
385
- s3 << r4
386
- else
387
- break
388
- end
389
- end
390
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
316
+ r3 = _nt_space
391
317
  s1 << r3
392
318
  if r3
393
- r5 = _nt_additive
394
- s1 << r5
395
- if r5
396
- s6, i6 = [], index
397
- loop do
398
- r7 = _nt_space
399
- if r7
400
- s6 << r7
401
- else
402
- break
403
- end
319
+ r4 = _nt_additive
320
+ s1 << r4
321
+ if r4
322
+ if has_terminal?(')', false, index)
323
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
324
+ @index += 1
325
+ else
326
+ terminal_parse_failure(')')
327
+ r5 = nil
404
328
  end
405
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
406
- s1 << r6
407
- if r6
408
- if has_terminal?(')', false, index)
409
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
410
- @index += 1
411
- else
412
- terminal_parse_failure(')')
413
- r8 = nil
414
- end
415
- s1 << r8
329
+ s1 << r5
330
+ if r5
331
+ r6 = _nt_space
332
+ s1 << r6
416
333
  end
417
334
  end
418
335
  end
@@ -428,25 +345,25 @@ module Maths
428
345
  if r1
429
346
  r0 = r1
430
347
  else
431
- r9 = _nt_number
432
- if r9
433
- r0 = r9
348
+ r7 = _nt_number
349
+ if r7
350
+ r0 = r7
434
351
  else
435
- r10 = _nt_spec
436
- if r10
437
- r0 = r10
352
+ r8 = _nt_spec
353
+ if r8
354
+ r0 = r8
438
355
  else
439
- r11 = _nt_max
440
- if r11
441
- r0 = r11
356
+ r9 = _nt_max
357
+ if r9
358
+ r0 = r9
442
359
  else
443
- r12 = _nt_min
444
- if r12
445
- r0 = r12
360
+ r10 = _nt_min
361
+ if r10
362
+ r0 = r10
446
363
  else
447
- r13 = _nt_stat
448
- if r13
449
- r0 = r13
364
+ r11 = _nt_stat
365
+ if r11
366
+ r0 = r11
450
367
  else
451
368
  @index = i0
452
369
  r0 = nil
@@ -467,6 +384,9 @@ module Maths
467
384
  elements[4]
468
385
  end
469
386
 
387
+ def space
388
+ elements[6]
389
+ end
470
390
  end
471
391
 
472
392
  module Spec1
@@ -561,6 +481,10 @@ module Maths
561
481
  r8 = nil
562
482
  end
563
483
  s0 << r8
484
+ if r8
485
+ r9 = _nt_space
486
+ s0 << r9
487
+ end
564
488
  end
565
489
  end
566
490
  end
@@ -593,7 +517,7 @@ module Maths
593
517
  end
594
518
 
595
519
  def list
596
- elements[4]
520
+ elements[3]
597
521
  end
598
522
 
599
523
  end
@@ -697,43 +621,17 @@ module Maths
697
621
  end
698
622
  s0 << r9
699
623
  if r9
700
- s10, i10 = [], index
701
- loop do
702
- r11 = _nt_space
703
- if r11
704
- s10 << r11
705
- else
706
- break
707
- end
708
- end
709
- r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
624
+ r10 = _nt_list
710
625
  s0 << r10
711
626
  if r10
712
- r12 = _nt_list
713
- s0 << r12
714
- if r12
715
- s13, i13 = [], index
716
- loop do
717
- r14 = _nt_space
718
- if r14
719
- s13 << r14
720
- else
721
- break
722
- end
723
- end
724
- r13 = instantiate_node(SyntaxNode,input, i13...index, s13)
725
- s0 << r13
726
- if r13
727
- if has_terminal?(')', false, index)
728
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
729
- @index += 1
730
- else
731
- terminal_parse_failure(')')
732
- r15 = nil
733
- end
734
- s0 << r15
735
- end
627
+ if has_terminal?(')', false, index)
628
+ r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
629
+ @index += 1
630
+ else
631
+ terminal_parse_failure(')')
632
+ r11 = nil
736
633
  end
634
+ s0 << r11
737
635
  end
738
636
  end
739
637
  end
@@ -765,7 +663,7 @@ module Maths
765
663
  end
766
664
 
767
665
  def list
768
- elements[4]
666
+ elements[3]
769
667
  end
770
668
 
771
669
  end
@@ -868,43 +766,17 @@ module Maths
868
766
  end
869
767
  s0 << r9
870
768
  if r9
871
- s10, i10 = [], index
872
- loop do
873
- r11 = _nt_space
874
- if r11
875
- s10 << r11
876
- else
877
- break
878
- end
879
- end
880
- r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
769
+ r10 = _nt_list
881
770
  s0 << r10
882
771
  if r10
883
- r12 = _nt_list
884
- s0 << r12
885
- if r12
886
- s13, i13 = [], index
887
- loop do
888
- r14 = _nt_space
889
- if r14
890
- s13 << r14
891
- else
892
- break
893
- end
894
- end
895
- r13 = instantiate_node(SyntaxNode,input, i13...index, s13)
896
- s0 << r13
897
- if r13
898
- if has_terminal?(')', false, index)
899
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
900
- @index += 1
901
- else
902
- terminal_parse_failure(')')
903
- r15 = nil
904
- end
905
- s0 << r15
906
- end
772
+ if has_terminal?(')', false, index)
773
+ r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
774
+ @index += 1
775
+ else
776
+ terminal_parse_failure(')')
777
+ r11 = nil
907
778
  end
779
+ s0 << r11
908
780
  end
909
781
  end
910
782
  end
@@ -924,9 +796,17 @@ module Maths
924
796
  end
925
797
 
926
798
  module List0
799
+ def space
800
+ elements[1]
801
+ end
802
+
927
803
  end
928
804
 
929
805
  module List1
806
+ def space
807
+ elements[0]
808
+ end
809
+
930
810
  end
931
811
 
932
812
  module List2
@@ -957,101 +837,70 @@ module Maths
957
837
  end
958
838
 
959
839
  i0, s0 = index, []
960
- s1, i1 = [], index
961
- loop do
962
- i2, s2 = index, []
963
- i3 = index
964
- r4 = _nt_number
965
- if r4
966
- r3 = r4
840
+ r1 = _nt_space
841
+ s0 << r1
842
+ if r1
843
+ i2 = index
844
+ r3 = _nt_number
845
+ if r3
846
+ r2 = r3
967
847
  else
968
- r5 = _nt_stat
969
- if r5
970
- r3 = r5
848
+ r4 = _nt_stat
849
+ if r4
850
+ r2 = r4
971
851
  else
972
- @index = i3
973
- r3 = nil
852
+ @index = i2
853
+ r2 = nil
974
854
  end
975
855
  end
976
- s2 << r3
977
- if r3
978
- s6, i6 = [], index
856
+ s0 << r2
857
+ if r2
858
+ s5, i5 = [], index
979
859
  loop do
980
- r7 = _nt_space
981
- if r7
982
- s6 << r7
983
- else
984
- break
985
- end
986
- end
987
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
988
- s2 << r6
989
- if r6
860
+ i6, s6 = index, []
990
861
  if has_terminal?(',', false, index)
991
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
862
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
992
863
  @index += 1
993
864
  else
994
865
  terminal_parse_failure(',')
995
- r8 = nil
866
+ r7 = nil
996
867
  end
997
- s2 << r8
998
- if r8
999
- s9, i9 = [], index
1000
- loop do
1001
- r10 = _nt_space
868
+ s6 << r7
869
+ if r7
870
+ r8 = _nt_space
871
+ s6 << r8
872
+ if r8
873
+ i9 = index
874
+ r10 = _nt_number
1002
875
  if r10
1003
- s9 << r10
876
+ r9 = r10
1004
877
  else
1005
- break
878
+ r11 = _nt_stat
879
+ if r11
880
+ r9 = r11
881
+ else
882
+ @index = i9
883
+ r9 = nil
884
+ end
1006
885
  end
886
+ s6 << r9
1007
887
  end
1008
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
1009
- s2 << r9
1010
888
  end
1011
- end
1012
- end
1013
- if s2.last
1014
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1015
- r2.extend(List0)
1016
- else
1017
- @index = i2
1018
- r2 = nil
1019
- end
1020
- if r2
1021
- s1 << r2
1022
- else
1023
- break
1024
- end
1025
- end
1026
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1027
- s0 << r1
1028
- if r1
1029
- s11, i11 = [], index
1030
- loop do
1031
- r12 = _nt_space
1032
- if r12
1033
- s11 << r12
1034
- else
1035
- break
1036
- end
1037
- end
1038
- r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
1039
- s0 << r11
1040
- if r11
1041
- i13 = index
1042
- r14 = _nt_number
1043
- if r14
1044
- r13 = r14
1045
- else
1046
- r15 = _nt_stat
1047
- if r15
1048
- r13 = r15
889
+ if s6.last
890
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
891
+ r6.extend(List0)
892
+ else
893
+ @index = i6
894
+ r6 = nil
895
+ end
896
+ if r6
897
+ s5 << r6
1049
898
  else
1050
- @index = i13
1051
- r13 = nil
899
+ break
1052
900
  end
1053
901
  end
1054
- s0 << r13
902
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
903
+ s0 << r5
1055
904
  end
1056
905
  end
1057
906
  if s0.last
@@ -1079,44 +928,17 @@ module Maths
1079
928
  return cached
1080
929
  end
1081
930
 
1082
- s0, i0 = [], index
1083
- loop do
1084
- i1 = index
1085
- if has_terminal?(" ", false, index)
1086
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
1087
- @index += 1
1088
- else
1089
- terminal_parse_failure(" ")
1090
- r2 = nil
1091
- end
1092
- if r2
1093
- r1 = r2
1094
- else
1095
- if has_terminal?("\t", false, index)
1096
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
1097
- @index += 1
1098
- else
1099
- terminal_parse_failure("\t")
1100
- r3 = nil
1101
- end
1102
- if r3
1103
- r1 = r3
1104
- else
1105
- @index = i1
1106
- r1 = nil
1107
- end
1108
- end
1109
- if r1
1110
- s0 << r1
1111
- else
1112
- break
1113
- end
931
+ if has_terminal?(" ", false, index)
932
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
933
+ @index += 1
934
+ else
935
+ terminal_parse_failure(" ")
936
+ r1 = nil
1114
937
  end
1115
- if s0.empty?
1116
- @index = i0
1117
- r0 = nil
938
+ if r1
939
+ r0 = r1
1118
940
  else
1119
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
941
+ r0 = instantiate_node(SyntaxNode,input, index...index)
1120
942
  end
1121
943
 
1122
944
  node_cache[:space][start_index] = r0
@@ -1129,6 +951,9 @@ module Maths
1129
951
  elements[0]
1130
952
  end
1131
953
 
954
+ def space
955
+ elements[3]
956
+ end
1132
957
  end
1133
958
 
1134
959
  module Number1
@@ -1194,6 +1019,10 @@ module Maths
1194
1019
  end
1195
1020
  r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1196
1021
  s0 << r4
1022
+ if r4
1023
+ r6 = _nt_space
1024
+ s0 << r6
1025
+ end
1197
1026
  end
1198
1027
  end
1199
1028
  if s0.last
@@ -1211,8 +1040,18 @@ module Maths
1211
1040
  end
1212
1041
 
1213
1042
  module Stat0
1043
+ def statistic
1044
+ elements[0]
1045
+ end
1046
+
1047
+ def space
1048
+ elements[1]
1049
+ end
1050
+ end
1051
+
1052
+ module Stat1
1214
1053
  def value
1215
- text_value.downcase
1054
+ statistic.text_value.downcase
1216
1055
  end
1217
1056
  def ast
1218
1057
  Ast.stat(value)
@@ -1230,26 +1069,39 @@ module Maths
1230
1069
  return cached
1231
1070
  end
1232
1071
 
1233
- s0, i0 = [], index
1072
+ i0, s0 = index, []
1073
+ s1, i1 = [], index
1234
1074
  loop do
1235
1075
  if has_terminal?('\G[A-Za-z]', true, index)
1236
- r1 = true
1076
+ r2 = true
1237
1077
  @index += 1
1238
1078
  else
1239
- r1 = nil
1079
+ r2 = nil
1240
1080
  end
1241
- if r1
1242
- s0 << r1
1081
+ if r2
1082
+ s1 << r2
1243
1083
  else
1244
1084
  break
1245
1085
  end
1246
1086
  end
1247
- if s0.empty?
1248
- @index = i0
1249
- r0 = nil
1087
+ if s1.empty?
1088
+ @index = i1
1089
+ r1 = nil
1250
1090
  else
1091
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1092
+ end
1093
+ s0 << r1
1094
+ if r1
1095
+ r3 = _nt_space
1096
+ s0 << r3
1097
+ end
1098
+ if s0.last
1251
1099
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1252
1100
  r0.extend(Stat0)
1101
+ r0.extend(Stat1)
1102
+ else
1103
+ @index = i0
1104
+ r0 = nil
1253
1105
  end
1254
1106
 
1255
1107
  node_cache[:stat][start_index] = r0
@@ -2,12 +2,12 @@ module Exalted
2
2
  grammar Maths
3
3
 
4
4
  rule additive
5
- multitive space* '+' space* additive {
5
+ multitive '+' space additive {
6
6
  def ast
7
7
  Ast.add(multitive.ast, additive.ast )
8
8
  end
9
9
  }
10
- / multitive space* '-' space* additive {
10
+ / multitive '-' space additive {
11
11
  def ast
12
12
  Ast.sub( multitive.ast, additive.ast )
13
13
  end
@@ -16,13 +16,13 @@ grammar Maths
16
16
  end
17
17
 
18
18
  rule multitive
19
- primary space* '*' space* multitive {
19
+ primary '*' space multitive {
20
20
  def ast
21
21
  Ast.mul(primary.ast, multitive.ast )
22
22
  end
23
23
  }
24
24
  /
25
- primary space* '/' space* multitive {
25
+ primary '/' space multitive {
26
26
  def ast
27
27
  Ast.div( primary.ast, multitive.ast )
28
28
  end
@@ -31,7 +31,7 @@ grammar Maths
31
31
  end
32
32
 
33
33
  rule primary
34
- '(' space* additive space* ')' {
34
+ '(' space additive ')' space {
35
35
  def ast
36
36
  additive.ast
37
37
  end
@@ -40,7 +40,7 @@ grammar Maths
40
40
  end
41
41
 
42
42
  rule spec
43
- [Ss] 'pec' 'iality'? ':"' speciality:[^"]+ '"' {
43
+ [Ss] 'pec' 'iality'? ':"' speciality:[^"]+ '"' space {
44
44
  def value
45
45
  speciality.text_value
46
46
  end
@@ -52,7 +52,7 @@ grammar Maths
52
52
  end
53
53
 
54
54
  rule max
55
- ( 'max' / 'highest' ) num:( '[' number ']' )? '(' space* list space* ')' {
55
+ ( 'max' / 'highest' ) num:( '[' number ']' )? '(' list ')' {
56
56
  def count
57
57
  if num.elements
58
58
  num.elements.detect { |e| e.respond_to?(:value) }.value
@@ -68,7 +68,7 @@ grammar Maths
68
68
  end
69
69
 
70
70
  rule min
71
- ( 'min' / 'lowest' ) num:( '[' number ']' )? '(' space* list space* ')' {
71
+ ( 'min' / 'lowest' ) num:( '[' number ']' )? '(' list ')' {
72
72
  def count
73
73
  if num.elements
74
74
  num.elements.detect { |e| e.respond_to?(:value) }.value
@@ -83,7 +83,7 @@ grammar Maths
83
83
  end
84
84
 
85
85
  rule list
86
- ( ( number / stat ) space* ',' space* )* space* ( number / stat ) {
86
+ space ( number / stat ) ( ',' space ( number / stat ) )* {
87
87
  def dig(values, elements)
88
88
  elements.each do |elem|
89
89
  values << elem if elem.respond_to?(:value)
@@ -101,11 +101,11 @@ grammar Maths
101
101
  end
102
102
 
103
103
  rule space
104
- ( " " / "\t" )+
104
+ " "?
105
105
  end
106
106
 
107
107
  rule number
108
- negative:('-')? [1-9] [0-9]* {
108
+ negative:('-')? [1-9] [0-9]* space {
109
109
  def value
110
110
  text_value.to_i*neg
111
111
  end
@@ -120,9 +120,9 @@ grammar Maths
120
120
  end
121
121
 
122
122
  rule stat
123
- [A-Za-z]+ {
123
+ statistic:[A-Za-z]+ space {
124
124
  def value
125
- text_value.downcase
125
+ statistic.text_value.downcase
126
126
  end
127
127
  def ast
128
128
  Ast.stat(value)
data/spec/parser_spec.rb CHANGED
@@ -4,18 +4,25 @@ require 'spec_helper'
4
4
  require 'exalted_math'
5
5
 
6
6
  include Exalted
7
+
8
+ class ParserFailure < Bacon::Error
9
+ def initialize(failure)
10
+ super :failure, failure
11
+ end
12
+ end
7
13
  describe "Exalted::MathParser" do
8
14
  before do
9
15
  @parser = Exalted::MathsParser.new
10
16
  end
11
17
 
12
18
  [
13
- ['4', Ast.num(4)],
14
- ['-1', Ast.num(-1)],
15
- ['3 * 4', Ast.mul(Ast.num(3), Ast.num(4) )],
16
- ['3 - 4', Ast.sub(Ast.num(3), Ast.num(4) )],
17
- ['3 + 4', Ast.add(Ast.num(3), Ast.num(4) )],
18
- ['6 / 3', Ast.div(Ast.num(6), Ast.num(3) )],
19
+ [' 4 ', Ast.num(4)],
20
+ [' -1 ', Ast.num(-1)],
21
+ [' 3 * 4 ', Ast.mul(Ast.num(3), Ast.num(4) )],
22
+ [' 3 - 4 ', Ast.sub(Ast.num(3), Ast.num(4) )],
23
+ [' 3 + 4 ', Ast.add(Ast.num(3), Ast.num(4) )],
24
+ [' 6 / 3 ', Ast.div(Ast.num(6), Ast.num(3) )],
25
+ [' spec:"Beating stuff" ', Ast.spec("Beating stuff")],
19
26
  ['Essence * 4', Ast.mul(Ast.stat('essence'), Ast.num(4) )],
20
27
  ['(Essence * 4) + Willpower', Ast.add(Ast.mul(Ast.stat('essence'), Ast.num(4) ), Ast.stat('willpower'))],
21
28
  ['highest[2](compassion,conviction,temperance,valor)', Ast.max(2, [Ast.stat('compassion'),Ast.stat('conviction'),Ast.stat('temperance'),Ast.stat('valor') ])],
@@ -23,9 +30,16 @@ describe "Exalted::MathParser" do
23
30
  ].each do |string, ast|
24
31
  it "parses '#{string}'" do
25
32
  success, result = @parser.ast(string)
33
+ raise ParserFailure, result unless success
26
34
  success.should.be.true
27
35
  result.should == ast
28
36
  end
29
37
  end
38
+
39
+ it "Doesn't care about spaces" do
40
+ success, result = @parser.ast(' ( Essence * 4 ) + Willpower + highest[2]( compassion , conviction ) ')
41
+ raise ParserFailure, result unless success
42
+ success.should.be.true
43
+ end
30
44
  end
31
45
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exalted_math
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
9
+ - 3
10
+ version: 0.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jonathan Stott
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-06 00:00:00 +01:00
18
+ date: 2010-06-09 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency