excel_to_code 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. data/README +41 -0
  2. data/bin/excel_to_c +63 -0
  3. data/bin/excel_to_ruby +9 -0
  4. data/src/commands.rb +2 -0
  5. data/src/commands/excel_to_c.rb +858 -0
  6. data/src/commands/excel_to_ruby.rb +620 -0
  7. data/src/compile.rb +2 -0
  8. data/src/compile/c.rb +5 -0
  9. data/src/compile/c/compile_to_c.rb +62 -0
  10. data/src/compile/c/compile_to_c_header.rb +26 -0
  11. data/src/compile/c/compile_to_c_unit_test.rb +42 -0
  12. data/src/compile/c/excel_to_c_runtime.c +2029 -0
  13. data/src/compile/c/map_formulae_to_c.rb +184 -0
  14. data/src/compile/c/map_sheet_names_to_c_names.rb +19 -0
  15. data/src/compile/c/map_values_to_c.rb +85 -0
  16. data/src/compile/c/map_values_to_c_structs.rb +37 -0
  17. data/src/compile/ruby.rb +3 -0
  18. data/src/compile/ruby/compile_to_ruby.rb +33 -0
  19. data/src/compile/ruby/compile_to_ruby_unit_test.rb +28 -0
  20. data/src/compile/ruby/excel_to_ruby_runtime.rb +1 -0
  21. data/src/compile/ruby/map_formulae_to_ruby.rb +95 -0
  22. data/src/compile/ruby/map_sheet_names_to_ruby_names.rb +19 -0
  23. data/src/compile/ruby/map_values_to_ruby.rb +65 -0
  24. data/src/excel.rb +5 -0
  25. data/src/excel/area.rb +93 -0
  26. data/src/excel/excel_functions.rb +84 -0
  27. data/src/excel/excel_functions/abs.rb +14 -0
  28. data/src/excel/excel_functions/add.rb +18 -0
  29. data/src/excel/excel_functions/and.rb +30 -0
  30. data/src/excel/excel_functions/apply_to_range.rb +17 -0
  31. data/src/excel/excel_functions/average.rb +12 -0
  32. data/src/excel/excel_functions/choose.rb +18 -0
  33. data/src/excel/excel_functions/cosh.rb +9 -0
  34. data/src/excel/excel_functions/count.rb +9 -0
  35. data/src/excel/excel_functions/counta.rb +8 -0
  36. data/src/excel/excel_functions/divide.rb +23 -0
  37. data/src/excel/excel_functions/excel_equal.rb +20 -0
  38. data/src/excel/excel_functions/excel_if.rb +8 -0
  39. data/src/excel/excel_functions/excel_match.rb +51 -0
  40. data/src/excel/excel_functions/find.rb +39 -0
  41. data/src/excel/excel_functions/iferror.rb +10 -0
  42. data/src/excel/excel_functions/index.rb +48 -0
  43. data/src/excel/excel_functions/left.rb +12 -0
  44. data/src/excel/excel_functions/less_than.rb +26 -0
  45. data/src/excel/excel_functions/less_than_or_equal.rb +26 -0
  46. data/src/excel/excel_functions/max.rb +12 -0
  47. data/src/excel/excel_functions/min.rb +12 -0
  48. data/src/excel/excel_functions/mod.rb +15 -0
  49. data/src/excel/excel_functions/more_than.rb +26 -0
  50. data/src/excel/excel_functions/more_than_or_equal.rb +26 -0
  51. data/src/excel/excel_functions/multiply.rb +24 -0
  52. data/src/excel/excel_functions/negative.rb +12 -0
  53. data/src/excel/excel_functions/not_equal.rb +19 -0
  54. data/src/excel/excel_functions/number_argument.rb +30 -0
  55. data/src/excel/excel_functions/pi.rb +7 -0
  56. data/src/excel/excel_functions/pmt.rb +16 -0
  57. data/src/excel/excel_functions/power.rb +18 -0
  58. data/src/excel/excel_functions/round.rb +13 -0
  59. data/src/excel/excel_functions/rounddown.rb +14 -0
  60. data/src/excel/excel_functions/roundup.rb +17 -0
  61. data/src/excel/excel_functions/string_join.rb +19 -0
  62. data/src/excel/excel_functions/subtotal.rb +13 -0
  63. data/src/excel/excel_functions/subtract.rb +18 -0
  64. data/src/excel/excel_functions/sum.rb +8 -0
  65. data/src/excel/excel_functions/sumif.rb +7 -0
  66. data/src/excel/excel_functions/sumifs.rb +74 -0
  67. data/src/excel/excel_functions/sumproduct.rb +32 -0
  68. data/src/excel/excel_functions/vlookup.rb +49 -0
  69. data/src/excel/formula_peg.rb +238 -0
  70. data/src/excel/formula_peg.txt +45 -0
  71. data/src/excel/reference.rb +56 -0
  72. data/src/excel/table.rb +108 -0
  73. data/src/excel_to_code.rb +7 -0
  74. data/src/extract.rb +13 -0
  75. data/src/extract/check_for_unknown_functions.rb +20 -0
  76. data/src/extract/extract_array_formulae.rb +23 -0
  77. data/src/extract/extract_formulae.rb +36 -0
  78. data/src/extract/extract_named_references.rb +38 -0
  79. data/src/extract/extract_relationships.rb +10 -0
  80. data/src/extract/extract_shared_formulae.rb +23 -0
  81. data/src/extract/extract_shared_strings.rb +20 -0
  82. data/src/extract/extract_simple_formulae.rb +18 -0
  83. data/src/extract/extract_table.rb +24 -0
  84. data/src/extract/extract_values.rb +29 -0
  85. data/src/extract/extract_worksheet_dimensions.rb +11 -0
  86. data/src/extract/extract_worksheet_names.rb +10 -0
  87. data/src/extract/extract_worksheet_table_relationships.rb +10 -0
  88. data/src/extract/simple_extract_from_xml.rb +19 -0
  89. data/src/rewrite.rb +10 -0
  90. data/src/rewrite/ast_copy_formula.rb +42 -0
  91. data/src/rewrite/ast_expand_array_formulae.rb +180 -0
  92. data/src/rewrite/rewrite_array_formulae.rb +71 -0
  93. data/src/rewrite/rewrite_array_formulae_to_arrays.rb +18 -0
  94. data/src/rewrite/rewrite_cell_references_to_include_sheet.rb +56 -0
  95. data/src/rewrite/rewrite_formulae_to_ast.rb +24 -0
  96. data/src/rewrite/rewrite_merge_formulae_and_values.rb +18 -0
  97. data/src/rewrite/rewrite_relationship_id_to_filename.rb +22 -0
  98. data/src/rewrite/rewrite_shared_formulae.rb +38 -0
  99. data/src/rewrite/rewrite_values_to_ast.rb +28 -0
  100. data/src/rewrite/rewrite_whole_row_column_references_to_areas.rb +90 -0
  101. data/src/rewrite/rewrite_worksheet_names.rb +20 -0
  102. data/src/simplify.rb +16 -0
  103. data/src/simplify/count_formula_references.rb +58 -0
  104. data/src/simplify/identify_dependencies.rb +56 -0
  105. data/src/simplify/identify_repeated_formula_elements.rb +37 -0
  106. data/src/simplify/inline_formulae.rb +77 -0
  107. data/src/simplify/map_formulae_to_values.rb +157 -0
  108. data/src/simplify/remove_cells.rb +18 -0
  109. data/src/simplify/replace_arrays_with_single_cells.rb +27 -0
  110. data/src/simplify/replace_blanks.rb +58 -0
  111. data/src/simplify/replace_common_elements_in_formulae.rb +19 -0
  112. data/src/simplify/replace_formulae_with_calculated_values.rb +21 -0
  113. data/src/simplify/replace_indirects_with_references.rb +44 -0
  114. data/src/simplify/replace_named_references.rb +82 -0
  115. data/src/simplify/replace_ranges_with_array_literals.rb +54 -0
  116. data/src/simplify/replace_shared_strings.rb +49 -0
  117. data/src/simplify/replace_table_references.rb +71 -0
  118. data/src/simplify/replace_values_with_constants.rb +47 -0
  119. data/src/simplify/simplify_arithmetic.rb +54 -0
  120. data/src/util.rb +2 -0
  121. data/src/util/not_supported_exception.rb +2 -0
  122. data/src/util/try.rb +9 -0
  123. metadata +207 -0
@@ -0,0 +1,7 @@
1
+ module ExcelFunctions
2
+
3
+ def pi
4
+ Math::PI
5
+ end
6
+
7
+ end
@@ -0,0 +1,16 @@
1
+ module ExcelFunctions
2
+
3
+ def pmt(rate,number_of_periods,present_value)
4
+ rate = number_argument(rate)
5
+ number_of_periods = number_argument(number_of_periods)
6
+ present_value = number_argument(present_value)
7
+
8
+ return rate if rate.is_a?(Symbol)
9
+ return number_of_periods if number_of_periods.is_a?(Symbol)
10
+ return present_value if present_value.is_a?(Symbol)
11
+
12
+ return -(present_value / number_of_periods) if rate == 0
13
+ -present_value*(rate*((1+rate)**number_of_periods))/(((1+rate)**number_of_periods)-1)
14
+ end
15
+
16
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'number_argument'
2
+ require_relative 'apply_to_range'
3
+
4
+ module ExcelFunctions
5
+
6
+ def power(a,b)
7
+ # return apply_to_range(a,b) { |a,b| power(a,b) } if a.is_a?(Array) || b.is_a?(Array)
8
+
9
+ a = number_argument(a)
10
+ b = number_argument(b)
11
+
12
+ return a if a.is_a?(Symbol)
13
+ return b if b.is_a?(Symbol)
14
+
15
+ a**b
16
+ end
17
+
18
+ end
@@ -0,0 +1,13 @@
1
+ module ExcelFunctions
2
+
3
+ def round(number,decimal_places)
4
+ number = number_argument(number)
5
+ decimal_places = number_argument(decimal_places)
6
+
7
+ return number if number.is_a?(Symbol)
8
+ return decimal_places if decimal_places.is_a?(Symbol)
9
+
10
+ number.round(decimal_places)
11
+ end
12
+
13
+ end
@@ -0,0 +1,14 @@
1
+ module ExcelFunctions
2
+
3
+ def rounddown(number,decimal_places)
4
+ number = number_argument(number)
5
+ decimal_places = number_argument(decimal_places)
6
+
7
+ return number if number.is_a?(Symbol)
8
+ return decimal_places if decimal_places.is_a?(Symbol)
9
+
10
+ (number * 10**decimal_places).truncate.to_f / 10**decimal_places
11
+ end
12
+
13
+
14
+ end
@@ -0,0 +1,17 @@
1
+ module ExcelFunctions
2
+
3
+ def roundup(number,decimal_places)
4
+ number = number_argument(number)
5
+ decimal_places = number_argument(decimal_places)
6
+
7
+ return number if number.is_a?(Symbol)
8
+ return decimal_places if decimal_places.is_a?(Symbol)
9
+
10
+ if number < 0
11
+ (number * 10**decimal_places).floor.to_f / 10**decimal_places
12
+ else
13
+ (number * 10**decimal_places).ceil.to_f / 10**decimal_places
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,19 @@
1
+ module ExcelFunctions
2
+
3
+ def string_join(*strings)
4
+ strings.find {|s| s.is_a?(Symbol)} || strings.map do |s|
5
+ case s
6
+ when nil; "0"
7
+ when Numeric
8
+ if s.round == s
9
+ s.to_i.to_s
10
+ else
11
+ s.to_s
12
+ end
13
+ else
14
+ s.to_s
15
+ end
16
+ end.join('')
17
+ end
18
+
19
+ end
@@ -0,0 +1,13 @@
1
+ module ExcelFunctions
2
+
3
+ def subtotal(type,*args)
4
+ case number_argument(type)
5
+ when Symbol; type
6
+ when 1.0, 101.0; average(*args)
7
+ when 2.0, 102.0; count(*args)
8
+ when 3.0, 103.0; counta(*args)
9
+ when 9.0, 109.0; sum(*args)
10
+ else :value
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'number_argument'
2
+ require_relative 'apply_to_range'
3
+
4
+ module ExcelFunctions
5
+
6
+ def subtract(a,b)
7
+ # return apply_to_range(a,b) { |a,b| subtract(a,b) } if a.is_a?(Array) || b.is_a?(Array)
8
+
9
+ a = number_argument(a)
10
+ b = number_argument(b)
11
+
12
+ return a if a.is_a?(Symbol)
13
+ return b if b.is_a?(Symbol)
14
+
15
+ a - b
16
+ end
17
+
18
+ end
@@ -0,0 +1,8 @@
1
+ module ExcelFunctions
2
+
3
+ def sum(*args)
4
+ args = args.flatten
5
+ args.find {|a| a.is_a?(Symbol)} || args.delete_if { |a| !a.is_a?(Numeric) }.inject(0) { |m,i| m + i }
6
+ end
7
+
8
+ end
@@ -0,0 +1,7 @@
1
+ module ExcelFunctions
2
+
3
+ def sumif(check_range,criteria,sum_range = check_range)
4
+ sumifs(sum_range,check_range,criteria)
5
+ end
6
+
7
+ end
@@ -0,0 +1,74 @@
1
+ module ExcelFunctions
2
+
3
+ def sumifs(sum_range,*criteria)
4
+ # First, get rid of the errors
5
+ return sum_range if sum_range.is_a?(Symbol)
6
+ error = criteria.find { |a| a.is_a?(Symbol) }
7
+ return error if error
8
+
9
+ # Sort out the sum range
10
+ sum_range = [sum_range] unless sum_range.is_a?(Array)
11
+ sum_range = sum_range.flatten
12
+
13
+ # Sort out the criteria
14
+ 0.step(criteria.length-1,2).each do |i|
15
+ if criteria[i].is_a?(Array)
16
+ criteria[i] = criteria[i].flatten
17
+ else
18
+ criteria[i] = [criteria[i]]
19
+ end
20
+ end
21
+
22
+ # This will be the final answer
23
+ accumulator = 0
24
+
25
+ # Work through each part of the sum range
26
+ sum_range.each_with_index do |potential_sum,index|
27
+ next unless potential_sum.is_a?(Numeric)
28
+
29
+ # If a criteria fails, this is set to false and no further criteria are evaluated
30
+ pass = true
31
+
32
+ 0.step(criteria.length-1,2).each do |i|
33
+ check_range = criteria[i]
34
+ required_value = criteria[i+1]
35
+ return :value if index >= check_range.length
36
+ check_value = check_range[index]
37
+
38
+ pass = case check_value
39
+ when String
40
+ check_value.downcase == required_value.to_s.downcase
41
+ when true, false
42
+ check_value == required_value
43
+ when nil
44
+ required_value == ""
45
+ when Numeric
46
+ case required_value
47
+ when Numeric
48
+ check_value == required_value
49
+ when String
50
+ required_value =~ /^(<=|>=|<|>)?([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)$/
51
+ if $1 && $2
52
+ check_value.send($1,$2.to_f)
53
+ elsif $2
54
+ check_value == $2.to_f
55
+ else
56
+ false
57
+ end
58
+ else
59
+ check_value == required_value
60
+ end
61
+ end # case check_value
62
+
63
+ break unless pass
64
+ end # criteria loop
65
+
66
+ accumulator += potential_sum if pass
67
+
68
+ end
69
+
70
+ return accumulator
71
+
72
+ end
73
+
74
+ end
@@ -0,0 +1,32 @@
1
+ module ExcelFunctions
2
+
3
+ def sumproduct(*args)
4
+ error = args.find { |a| a.is_a?(Symbol) }
5
+ return error if error
6
+ return :value if args.any? { |a| a == nil }
7
+ args = args.map { |a| a.is_a?(Array) ? a : [[a]] }
8
+ first = args.shift
9
+ accumulator = 0
10
+ first.each_with_index do |row,row_number|
11
+ row.each_with_index do |cell,column_number|
12
+ next unless cell.is_a?(Numeric)
13
+ product = cell
14
+ args.each do |area|
15
+ return :value unless area.length > row_number
16
+ r = area[row_number]
17
+ return :value unless r.length > column_number
18
+ c = r[column_number]
19
+ if c.is_a?(Numeric)
20
+ product = product * c
21
+ else
22
+ product = product * 0
23
+ break
24
+ end
25
+ end
26
+ accumulator += product
27
+ end
28
+ end
29
+ accumulator
30
+ end
31
+
32
+ end
@@ -0,0 +1,49 @@
1
+ module ExcelFunctions
2
+
3
+ def vlookup(lookup_value,lookup_table,column_number, match_type = true)
4
+ return lookup_value if lookup_value.is_a?(Symbol)
5
+ return lookup_table if lookup_table.is_a?(Symbol)
6
+ return column_number if column_number.is_a?(Symbol)
7
+ return match_type if match_type.is_a?(Symbol)
8
+
9
+ return :na if lookup_value == nil
10
+ return :na if lookup_table == nil
11
+ return :na if column_number == nil
12
+ return :na if match_type == nil
13
+
14
+ lookup_value = lookup_value.downcase if lookup_value.is_a?(String)
15
+
16
+ last_good_match = 0
17
+
18
+ lookup_table.each_with_index do |row,index|
19
+ possible_match = row.first
20
+
21
+ next if lookup_value.is_a?(String) && !possible_match.is_a?(String)
22
+ next if lookup_value.is_a?(Numeric) && !possible_match.is_a?(Numeric)
23
+
24
+ possible_match.downcase! if lookup_value.is_a?(String)
25
+
26
+ if lookup_value == possible_match
27
+ return :value unless column_number <= row.length
28
+ return row[column_number-1]
29
+ elsif match_type == true
30
+ if possible_match > lookup_value
31
+ return :na if index == 0
32
+ previous_row = lookup_table[last_good_match]
33
+ return :value unless column_number <= previous_row.length
34
+ return previous_row[column_number-1]
35
+ else
36
+ last_good_match = index
37
+ end
38
+ end
39
+ end
40
+
41
+ # We don't have a match
42
+ if match_type == true
43
+ return lookup_table[last_good_match][column_number-1]
44
+ else
45
+ return :na
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,238 @@
1
+ # encoding: utf-8
2
+ require 'rubypeg'
3
+
4
+ class Formula < RubyPeg
5
+
6
+ def root
7
+ formula
8
+ end
9
+
10
+ def formula
11
+ node :formula do
12
+ optional { space } && one_or_more { expression }
13
+ end
14
+ end
15
+
16
+ def expression
17
+ string_join || comparison || arithmetic || thing
18
+ end
19
+
20
+ def thing
21
+ function || array || brackets || any_reference || string || percentage || number || boolean || prefix || named_reference
22
+ end
23
+
24
+ def argument
25
+ expression || null
26
+ end
27
+
28
+ def function
29
+ node :function do
30
+ terminal(/[A-Z]+/) && ignore { terminal("(") } && space && optional { argument } && any_number_of { (space && ignore { terminal(",") } && space && argument) } && space && ignore { terminal(")") }
31
+ end
32
+ end
33
+
34
+ def brackets
35
+ node :brackets do
36
+ ignore { terminal("(") } && space && one_or_more { expression } && space && ignore { terminal(")") }
37
+ end
38
+ end
39
+
40
+ def array
41
+ node :array do
42
+ ignore { terminal("{") } && space && row && any_number_of { (space && ignore { terminal(";") } && space && row) } && space && ignore { terminal("}") }
43
+ end
44
+ end
45
+
46
+ def row
47
+ node :row do
48
+ basic_type && any_number_of { (space && ignore { terminal(",") } && space && basic_type) }
49
+ end
50
+ end
51
+
52
+ def basic_type
53
+ string || percentage || number || boolean
54
+ end
55
+
56
+ def string_join
57
+ node :string_join do
58
+ (arithmetic || thing) && one_or_more { (space && ignore { terminal("&") } && space && (arithmetic || thing)) }
59
+ end
60
+ end
61
+
62
+ def arithmetic
63
+ node :arithmetic do
64
+ thing && one_or_more { (space && operator && space && thing) }
65
+ end
66
+ end
67
+
68
+ def comparison
69
+ node :comparison do
70
+ (arithmetic || thing) && space && comparator && space && (arithmetic || thing)
71
+ end
72
+ end
73
+
74
+ def comparator
75
+ node :comparator do
76
+ terminal(">=") || terminal("<=") || terminal("<>") || terminal(">") || terminal("<") || terminal("=")
77
+ end
78
+ end
79
+
80
+ def string
81
+ node :string do
82
+ ignore { terminal("\"") } && terminal(/(""|[^"])*/) && ignore { terminal("\"") }
83
+ end
84
+ end
85
+
86
+ def any_reference
87
+ external_reference || any_internal_reference
88
+ end
89
+
90
+ def any_internal_reference
91
+ table_reference || local_table_reference || sheet_reference || sheetless_reference
92
+ end
93
+
94
+ def percentage
95
+ node :percentage do
96
+ terminal(/[-+]?[0-9]+\.?[0-9]*/) && ignore { terminal("%") }
97
+ end
98
+ end
99
+
100
+ def number
101
+ node :number do
102
+ terminal(/[-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?/)
103
+ end
104
+ end
105
+
106
+ def operator
107
+ node :operator do
108
+ terminal("+") || terminal("-") || terminal("/") || terminal("*") || terminal("^")
109
+ end
110
+ end
111
+
112
+ def external_reference
113
+ node :external_reference do
114
+ terminal(/\[\d+\]!?/) && any_internal_reference
115
+ end
116
+ end
117
+
118
+ def table_reference
119
+ node :table_reference do
120
+ table_name && ignore { terminal("[") } && (range_structured_reference || complex_structured_reference || simple_structured_reference) && ignore { terminal("]") }
121
+ end
122
+ end
123
+
124
+ def local_table_reference
125
+ node :local_table_reference do
126
+ ignore { terminal("[") } && (range_structured_reference || complex_structured_reference || overly_structured_reference || simple_structured_reference) && ignore { terminal("]") }
127
+ end
128
+ end
129
+
130
+ def table_name
131
+ terminal(/[.a-zA-Z0-9_]+/)
132
+ end
133
+
134
+ def range_structured_reference
135
+ terminal(/\[[^\u005d]*\],\[[^\u005d]*\]:\[[^\u005d]*\]/)
136
+ end
137
+
138
+ def complex_structured_reference
139
+ terminal(/\[[^\u005d]*\],\[[^\u005d]*\]/)
140
+ end
141
+
142
+ def overly_structured_reference
143
+ ignore { terminal("[") } && simple_structured_reference && ignore { terminal("]") }
144
+ end
145
+
146
+ def simple_structured_reference
147
+ terminal(/[^\u005d]*/)
148
+ end
149
+
150
+ def named_reference
151
+ node :named_reference do
152
+ terminal(/[#a-zA-Z][\w_.!]+/)
153
+ end
154
+ end
155
+
156
+ def sheet_reference
157
+ node :sheet_reference do
158
+ (single_quoted_string || terminal(/[a-zA-Z0-9][\w_.]+/)) && ignore { terminal("!") } && (sheetless_reference || named_reference)
159
+ end
160
+ end
161
+
162
+ def single_quoted_string
163
+ ignore { terminal("'") } && terminal(/[^']*/) && ignore { terminal("'") }
164
+ end
165
+
166
+ def sheetless_reference
167
+ column_range || row_range || area || cell
168
+ end
169
+
170
+ def column_range
171
+ node :column_range do
172
+ column && ignore { terminal(":") } && column
173
+ end
174
+ end
175
+
176
+ def row_range
177
+ node :row_range do
178
+ row_number && ignore { terminal(":") } && row_number
179
+ end
180
+ end
181
+
182
+ def area
183
+ node :area do
184
+ reference && ignore { terminal(":") } && reference
185
+ end
186
+ end
187
+
188
+ def cell
189
+ node :cell do
190
+ reference
191
+ end
192
+ end
193
+
194
+ def row_number
195
+ terminal(/\$?\d+/)
196
+ end
197
+
198
+ def column
199
+ terminal(/\$?[A-Za-z]{1,3}/)
200
+ end
201
+
202
+ def reference
203
+ terminal(/\$?[A-Za-z]{1,3}\$?[0-9]+(?![0-9A-Za-z_])/)
204
+ end
205
+
206
+ def boolean
207
+ boolean_true || boolean_false
208
+ end
209
+
210
+ def boolean_true
211
+ node :boolean_true do
212
+ ignore { terminal("TRUE") }
213
+ end
214
+ end
215
+
216
+ def boolean_false
217
+ node :boolean_false do
218
+ ignore { terminal("FALSE") }
219
+ end
220
+ end
221
+
222
+ def prefix
223
+ node :prefix do
224
+ terminal(/[-+]/) && thing
225
+ end
226
+ end
227
+
228
+ def space
229
+ ignore { terminal(/[ \n]*/) }
230
+ end
231
+
232
+ def null
233
+ node :null do
234
+ followed_by { terminal(",") }
235
+ end
236
+ end
237
+
238
+ end