exalted_math 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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