WriteExcel 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +47 -0
  6. data/VERSION +1 -0
  7. data/examples/a_simple.rb +42 -0
  8. data/examples/autofilters.rb +266 -0
  9. data/examples/bigfile.rb +30 -0
  10. data/examples/copyformat.rb +51 -0
  11. data/examples/data_validate.rb +278 -0
  12. data/examples/date_time.rb +86 -0
  13. data/examples/demo.rb +118 -0
  14. data/examples/diag_border.rb +35 -0
  15. data/examples/formats.rb +489 -0
  16. data/examples/header.rb +136 -0
  17. data/examples/hidden.rb +28 -0
  18. data/examples/hyperlink.rb +42 -0
  19. data/examples/images.rb +52 -0
  20. data/examples/merge1.rb +39 -0
  21. data/examples/merge2.rb +44 -0
  22. data/examples/merge3.rb +65 -0
  23. data/examples/merge4.rb +82 -0
  24. data/examples/merge5.rb +79 -0
  25. data/examples/protection.rb +46 -0
  26. data/examples/regions.rb +52 -0
  27. data/examples/repeat.rb +42 -0
  28. data/examples/stats.rb +75 -0
  29. data/examples/stocks.rb +80 -0
  30. data/examples/tab_colors.rb +30 -0
  31. data/lib/WriteExcel.rb +30 -0
  32. data/lib/WriteExcel/biffwriter.rb +259 -0
  33. data/lib/WriteExcel/chart.rb +217 -0
  34. data/lib/WriteExcel/excelformula.y +138 -0
  35. data/lib/WriteExcel/excelformulaparser.rb +573 -0
  36. data/lib/WriteExcel/format.rb +1108 -0
  37. data/lib/WriteExcel/formula.rb +986 -0
  38. data/lib/WriteExcel/olewriter.rb +322 -0
  39. data/lib/WriteExcel/properties.rb +250 -0
  40. data/lib/WriteExcel/storage_lite.rb +590 -0
  41. data/lib/WriteExcel/workbook.rb +2602 -0
  42. data/lib/WriteExcel/worksheet.rb +6378 -0
  43. data/spec/WriteExcel_spec.rb +7 -0
  44. data/spec/spec.opts +1 -0
  45. data/spec/spec_helper.rb +9 -0
  46. data/test/tc_all.rb +31 -0
  47. data/test/tc_biff.rb +104 -0
  48. data/test/tc_chart.rb +22 -0
  49. data/test/tc_example_match.rb +1280 -0
  50. data/test/tc_format.rb +1264 -0
  51. data/test/tc_formula.rb +63 -0
  52. data/test/tc_ole.rb +110 -0
  53. data/test/tc_storage_lite.rb +102 -0
  54. data/test/tc_workbook.rb +115 -0
  55. data/test/tc_worksheet.rb +115 -0
  56. data/test/test_00_IEEE_double.rb +14 -0
  57. data/test/test_01_add_worksheet.rb +12 -0
  58. data/test/test_02_merge_formats.rb +58 -0
  59. data/test/test_04_dimensions.rb +397 -0
  60. data/test/test_05_rows.rb +182 -0
  61. data/test/test_06_extsst.rb +80 -0
  62. data/test/test_11_date_time.rb +484 -0
  63. data/test/test_12_date_only.rb +506 -0
  64. data/test/test_13_date_seconds.rb +486 -0
  65. data/test/test_21_escher.rb +629 -0
  66. data/test/test_22_mso_drawing_group.rb +739 -0
  67. data/test/test_23_note.rb +78 -0
  68. data/test/test_24_txo.rb +80 -0
  69. data/test/test_26_autofilter.rb +327 -0
  70. data/test/test_27_autofilter.rb +144 -0
  71. data/test/test_28_autofilter.rb +174 -0
  72. data/test/test_29_process_jpg.rb +131 -0
  73. data/test/test_30_validation_dval.rb +82 -0
  74. data/test/test_31_validation_dv_strings.rb +131 -0
  75. data/test/test_32_validation_dv_formula.rb +211 -0
  76. data/test/test_40_property_types.rb +191 -0
  77. data/test/test_41_properties.rb +238 -0
  78. data/test/test_42_set_properties.rb +430 -0
  79. data/test/ts_all.rb +34 -0
  80. metadata +154 -0
@@ -0,0 +1,217 @@
1
+ ###############################################################################
2
+ #
3
+ # Chart - A writer class for Excel Charts.
4
+ #
5
+ #
6
+ # Used in conjunction with Spreadsheet::WriteExcel
7
+ #
8
+ # Copyright 2000-2008, John McNamara, jmcnamara@cpan.org
9
+ #
10
+ # original written in Perl by John McNamara
11
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
12
+ #
13
+
14
+ #require 'WriteExcel/biffwriter'
15
+
16
+ class Chart
17
+
18
+
19
+ attr_reader :name
20
+
21
+
22
+ ###############################################################################
23
+ #
24
+ # new()
25
+ #
26
+ # Constructor. Creates a new Chart object from a BIFFwriter object
27
+ #
28
+ def initialize(filename, name, index, encoding, activesheet, firstsheet)
29
+ @filename = filename
30
+ @name = name
31
+ @index = index
32
+ @encoding = encoding
33
+ @activesheet = activesheet
34
+ @firstsheet = firstsheet
35
+
36
+ @type = 0x0200
37
+ @ext_sheets = []
38
+ @using_tmpfile = 1
39
+ @filehandle = ""
40
+ @fileclosed = false
41
+ @offset = 0
42
+ @xls_rowmax = 0
43
+ @xls_colmax = 0
44
+ @xls_strmax = 0
45
+ @dim_rowmin = 0
46
+ @dim_rowmax = 0
47
+ @dim_colmin = 0
48
+ @dim_colmax = 0
49
+ @dim_changed = 0
50
+ @colinfo = []
51
+ @selection = [0, 0]
52
+ @panes = []
53
+ @active_pane = 3
54
+ @frozen = 0
55
+ @selected = 0
56
+ @hidden = 0
57
+
58
+ @paper_size = 0x0
59
+ @orientation = 0x1
60
+ @header = ''
61
+ @footer = ''
62
+ @hcenter = 0
63
+ @vcenter = 0
64
+ @margin_head = 0.50
65
+ @margin_foot = 0.50
66
+ @margin_left = 0.75
67
+ @margin_right = 0.75
68
+ @margin_top = 1.00
69
+ @margin_bottom = 1.00
70
+
71
+ @title_rowmin = nil
72
+ @title_rowmax = nil
73
+ @title_colmin = nil
74
+ @title_colmax = nil
75
+ @print_rowmin = nil
76
+ @print_rowmax = nil
77
+ @print_colmin = nil
78
+ @print_colmax = nil
79
+
80
+ @print_gridlines = 1
81
+ @screen_gridlines = 1
82
+ @print_headers = 0
83
+
84
+ @fit_page = 0
85
+ @fit_width = 0
86
+ @fit_height = 0
87
+
88
+ @hbreaks = []
89
+ @vbreaks = []
90
+
91
+ @protect = 0
92
+ @password = nil
93
+
94
+ @col_sizes = {}
95
+ @row_sizes = {}
96
+
97
+ @col_formats = {}
98
+ @row_formats = {}
99
+
100
+ @zoom = 100
101
+ @print_scale = 100
102
+
103
+ @leading_zeros = 0
104
+
105
+ @outline_row_level = 0
106
+ @outline_style = 0
107
+ @outline_below = 1
108
+ @outline_right = 1
109
+ @outline_on = 1
110
+
111
+ _initialize
112
+ end
113
+
114
+ ###############################################################################
115
+ #
116
+ # get_data().
117
+ #
118
+ # Retrieves data from memory in one chunk, or from disk in $buffer
119
+ # sized chunks.
120
+ #
121
+ def get_data
122
+ buffer = 4096
123
+
124
+ return tmp if read(@filehandle, tmp, buffer)
125
+
126
+ # No data to return
127
+ return nil
128
+ end
129
+
130
+
131
+ ###############################################################################
132
+ #
133
+ # select()
134
+ #
135
+ # Set this worksheet as a selected worksheet, i.e. the worksheet has its tab
136
+ # highlighted.
137
+ #
138
+ def select
139
+ @hidden = 0 # Selected worksheet can't be hidden.
140
+ @selected = 1
141
+ end
142
+
143
+
144
+ ###############################################################################
145
+ #
146
+ # activate()
147
+ #
148
+ # Set this worksheet as the active worksheet, i.e. the worksheet that is
149
+ # displayed when the workbook is opened. Also set it as selected.
150
+ #
151
+ def activate
152
+ @hidden = 0 # Active worksheet can't be hidden.
153
+ @selected = 1
154
+ @activesheet = @index
155
+ end
156
+
157
+
158
+ ###############################################################################
159
+ #
160
+ # hide()
161
+ #
162
+ # Hide this worksheet.
163
+ #
164
+ def hide
165
+ @hidd = 1
166
+
167
+ # A hidden worksheet shouldn't be active or selected.
168
+ @selecte = 0
169
+ @activesheet = 0
170
+ @firstsheet = 0
171
+ end
172
+
173
+
174
+ ###############################################################################
175
+ #
176
+ # set_first_sheet()
177
+ #
178
+ # Set this worksheet as the first visible sheet. This is necessary
179
+ # when there are a large number of worksheets and the activated
180
+ # worksheet is not visible on the screen.
181
+ #
182
+ def set_first_sheet
183
+ hidden = 0 # Active worksheet can't be hidden.
184
+ firstsheet = index
185
+ end
186
+
187
+
188
+
189
+ ###############################################################################
190
+
191
+ private
192
+
193
+ ###############################################################################
194
+
195
+
196
+ ###############################################################################
197
+ #
198
+ # _initialize()
199
+ #
200
+ def _initialize
201
+ filehandle = open(@filename, "rb") or
202
+ die "Couldn't open #{@filename} in add_chart_ext(): $!.\n"
203
+ @filehandle = filehandle
204
+ @datasize = File.Stat.size(@filename)
205
+ end
206
+
207
+ ###############################################################################
208
+ #
209
+ # _close()
210
+ #
211
+ # Add data to the beginning of the workbook (note the reverse order)
212
+ # and to the end of the workbook.
213
+ #
214
+ def _close
215
+ end
216
+
217
+ end
@@ -0,0 +1,138 @@
1
+ #
2
+ # copyright (c) 2009 Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
3
+
4
+
5
+ class ExcelFormulaParser
6
+
7
+ prechigh
8
+ nonassoc UMINUS
9
+ right '^'
10
+ left '&'
11
+ left '*' '/'
12
+ left '+' '-'
13
+ left '<' '>' '<=' '>=' '<>'
14
+ left '='
15
+ preclow
16
+
17
+ rule
18
+
19
+ formula : expr_list
20
+
21
+ expr_list : { result = [] }
22
+ | expr_list expr EOL { result.push val[1], '_arg', '1' }
23
+ | expr_list EOL
24
+
25
+ expr : expr '+' expr { result = [ val[0], val[2], 'ptgAdd' ] }
26
+ | expr '-' expr { result = [ val[0], val[2], 'ptgSub' ] }
27
+ | expr '*' expr { result = [ val[0], val[2], 'ptgMul' ] }
28
+ | expr '/' expr { result = [ val[0], val[2], 'ptgDiv' ] }
29
+ | expr '^' expr { result = [ val[0], val[2], 'ptgPower' ] }
30
+ | expr '&' expr { result = [ val[0], val[2], 'ptgConcat' ] }
31
+ | expr LT expr { result = [ val[0], val[2], 'ptgLT' ] }
32
+ | expr GT expr { result = [ val[0], val[2], 'ptgGT' ] }
33
+ | expr LE expr { result = [ val[0], val[2], 'ptgLE' ] }
34
+ | expr GE expr { result = [ val[0], val[2], 'ptgGE' ] }
35
+ | expr NE expr { result = [ val[0], val[2], 'ptgNE' ] }
36
+ | expr '=' expr { result = [ val[0], val[2], 'ptgEQ' ] }
37
+ | primary
38
+
39
+ primary : '(' expr ')' { result = [ val[1], '_arg', '1', 'ptgParen'] }
40
+ | '-' expr = UMINUS { result = [ '_num', '-1', val[1], 'ptgMul' ] }
41
+ | FUNC
42
+ | NUMBER { result = [ '_num', val[0] ] }
43
+ | STRING { result = [ '_str', val[0] ] }
44
+ | REF2D { result = [ '_ref2d', val[0] ] }
45
+ | REF3D { result = [ '_ref3d', val[0] ] }
46
+ | RANGE2D { result = [ '_range2d', val[0] ] }
47
+ | RANGE3D { result = [ '_range3d', val[0] ] }
48
+ | TRUE { result = [ 'ptgBool', '1' ] }
49
+ | FALSE { result = [ 'ptgBool', '0' ] }
50
+ | funcall
51
+
52
+ funcall : FUNC '(' args ')' { result = [ '_class', val[0], val[2], '_arg', val[2].size.to_s, '_func', val[0] ] }
53
+ | FUNC '(' ')' { result = [ '_func', val[0] ] }
54
+
55
+ args : expr { result = val }
56
+ | args ',' expr { result.push val[2] }
57
+
58
+ end
59
+
60
+
61
+ ---- footer
62
+
63
+ class ExcelFormulaParserError < StandardError; end
64
+
65
+ class Node
66
+
67
+ def exec_list(nodes)
68
+ v = nil
69
+ nodes.each { |i| v = i.evaluate }
70
+ v
71
+ end
72
+
73
+ def excelformulaparser_error(msg)
74
+ raise ExcelFormulaParserError,
75
+ "in #{fname}:#{lineno}: #{msg}"
76
+ end
77
+
78
+ end
79
+
80
+ class RootNode < Node
81
+
82
+ def initialize(tree)
83
+ @tree = tree
84
+ end
85
+
86
+ def evaluate
87
+ exec_list @tree
88
+ end
89
+
90
+ end
91
+
92
+
93
+ class FuncallNode < Node
94
+
95
+ def initialize(func, args)
96
+ @func = func
97
+ @args = args
98
+ end
99
+
100
+ def evaluate
101
+ arg = @args.collect {|i| i.evaluate }
102
+ out = []
103
+ arg.each { |i| o.push i }
104
+ o.push @func
105
+ p o
106
+ end
107
+
108
+ end
109
+
110
+ class NumberNode < Node
111
+
112
+ def initialize(val)
113
+ @val = val
114
+ end
115
+
116
+ def evaluate
117
+ p @val
118
+ end
119
+
120
+ end
121
+
122
+ class OperateNode < Node
123
+
124
+ def initialize(op, left, right)
125
+ @op = op
126
+ @left = left
127
+ @right = right
128
+ end
129
+
130
+ def evaluate
131
+ o = []
132
+ o.push @left
133
+ o.push @right
134
+ o.push @op
135
+ p o
136
+ end
137
+ end
138
+
@@ -0,0 +1,573 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.6
4
+ # from Racc grammer file "".
5
+ #
6
+
7
+
8
+ class ExcelFormulaParser < Racc::Parser
9
+ ##### State transition tables begin ###
10
+
11
+ racc_action_table = [
12
+ 16, 52, 25, 27, 29, 31, 33, 20, 19, 3,
13
+ nil, 53, 22, 18, nil, 4, 5, 6, 8, 12,
14
+ 13, 14, 15, 17, 16, 25, 27, 29, 31, 33,
15
+ nil, 10, nil, nil, nil, 16, nil, 18, nil, 4,
16
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
17
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
18
+ 16, nil, 18, nil, 4, 5, 6, 8, 12, 13,
19
+ 14, 15, 17, 18, 16, 4, 5, 6, 8, 12,
20
+ 13, 14, 15, 17, nil, 16, nil, 18, nil, 4,
21
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
22
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
23
+ 16, nil, 18, 36, 4, 5, 6, 8, 12, 13,
24
+ 14, 15, 17, 18, 16, 4, 5, 6, 8, 12,
25
+ 13, 14, 15, 17, nil, 16, nil, 18, nil, 4,
26
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
27
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
28
+ 16, nil, 18, nil, 4, 5, 6, 8, 12, 13,
29
+ 14, 15, 17, 18, 16, 4, 5, 6, 8, 12,
30
+ 13, 14, 15, 17, nil, 16, nil, 18, nil, 4,
31
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
32
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
33
+ 16, nil, 18, nil, 4, 5, 6, 8, 12, 13,
34
+ 14, 15, 17, 18, nil, 4, 5, 6, 8, 12,
35
+ 13, 14, 15, 17, 22, 23, 26, 28, 30, 32,
36
+ nil, nil, nil, nil, nil, 21, nil, 25, 27, 29,
37
+ 31, 33, nil, 51, 22, 23, 26, 28, 30, 32,
38
+ 22, 23, 26, 28, nil, nil, nil, 25, 27, 29,
39
+ 31, 33, nil, 25, 27, 29, 31, 33, 22, 23,
40
+ 26, 28, nil, nil, nil, 22, 23, 26, 28, 30,
41
+ 32, 25, 27, 29, 31, 33, 21, 24, 25, 27,
42
+ 29, 31, 33, 22, 23, 26, 28, 30, 32, nil,
43
+ nil, nil, nil, nil, 21, nil, 25, 27, 29, 31,
44
+ 33, 22, 23, 26, 28, 30, 32, nil, nil, nil,
45
+ nil, nil, 21, nil, 25, 27, 29, 31, 33, 22,
46
+ 23, 26, 28, 30, 32, 22, nil, nil, nil, nil,
47
+ 21, nil, 25, 27, 29, 31, 33, nil, 25, 27,
48
+ 29, 31, 33, 22, 23, 26, 28, 30, 32, 22,
49
+ 23, nil, nil, nil, 21, nil, 25, 27, 29, 31,
50
+ 33, nil, 25, 27, 29, 31, 33, 22, 23, 26,
51
+ 28, 30, 32, 22, 23, nil, nil, nil, 21, nil,
52
+ 25, 27, 29, 31, 33, nil, 25, 27, 29, 31,
53
+ 33, 22, 23, 26, 28, 30, 32, nil, nil, nil,
54
+ nil, nil, 21, nil, 25, 27, 29, 31, 33, 22,
55
+ 23, 26, 28, 30, 32, nil, nil, nil, nil, nil,
56
+ 21, nil, 25, 27, 29, 31, 33 ]
57
+
58
+ racc_action_check = [
59
+ 33, 38, 34, 34, 34, 34, 34, 4, 3, 1,
60
+ nil, 38, 40, 33, nil, 33, 33, 33, 33, 33,
61
+ 33, 33, 33, 33, 2, 40, 40, 40, 40, 40,
62
+ nil, 2, nil, nil, nil, 53, nil, 2, nil, 2,
63
+ 2, 2, 2, 2, 2, 2, 2, 2, 53, 32,
64
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, nil,
65
+ 31, nil, 32, nil, 32, 32, 32, 32, 32, 32,
66
+ 32, 32, 32, 31, 16, 31, 31, 31, 31, 31,
67
+ 31, 31, 31, 31, nil, 18, nil, 16, nil, 16,
68
+ 16, 16, 16, 16, 16, 16, 16, 16, 18, 20,
69
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, nil,
70
+ 21, nil, 20, 20, 20, 20, 20, 20, 20, 20,
71
+ 20, 20, 20, 21, 22, 21, 21, 21, 21, 21,
72
+ 21, 21, 21, 21, nil, 23, nil, 22, nil, 22,
73
+ 22, 22, 22, 22, 22, 22, 22, 22, 23, 25,
74
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, nil,
75
+ 26, nil, 25, nil, 25, 25, 25, 25, 25, 25,
76
+ 25, 25, 25, 26, 27, 26, 26, 26, 26, 26,
77
+ 26, 26, 26, 26, nil, 28, nil, 27, nil, 27,
78
+ 27, 27, 27, 27, 27, 27, 27, 27, 28, 29,
79
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, nil,
80
+ 30, nil, 29, nil, 29, 29, 29, 29, 29, 29,
81
+ 29, 29, 29, 30, nil, 30, 30, 30, 30, 30,
82
+ 30, 30, 30, 30, 35, 35, 35, 35, 35, 35,
83
+ nil, nil, nil, nil, nil, 35, nil, 35, 35, 35,
84
+ 35, 35, nil, 35, 39, 39, 39, 39, 39, 39,
85
+ 47, 47, 47, 47, nil, nil, nil, 39, 39, 39,
86
+ 39, 39, nil, 47, 47, 47, 47, 47, 49, 49,
87
+ 49, 49, nil, nil, nil, 7, 7, 7, 7, 7,
88
+ 7, 49, 49, 49, 49, 49, 7, 7, 7, 7,
89
+ 7, 7, 7, 37, 37, 37, 37, 37, 37, nil,
90
+ nil, nil, nil, nil, 37, nil, 37, 37, 37, 37,
91
+ 37, 48, 48, 48, 48, 48, 48, nil, nil, nil,
92
+ nil, nil, 48, nil, 48, 48, 48, 48, 48, 50,
93
+ 50, 50, 50, 50, 50, 41, nil, nil, nil, nil,
94
+ 50, nil, 50, 50, 50, 50, 50, nil, 41, 41,
95
+ 41, 41, 41, 42, 42, 42, 42, 42, 42, 43,
96
+ 43, nil, nil, nil, 42, nil, 42, 42, 42, 42,
97
+ 42, nil, 43, 43, 43, 43, 43, 44, 44, 44,
98
+ 44, 44, 44, 45, 45, nil, nil, nil, 44, nil,
99
+ 44, 44, 44, 44, 44, nil, 45, 45, 45, 45,
100
+ 45, 46, 46, 46, 46, 46, 46, nil, nil, nil,
101
+ nil, nil, 46, nil, 46, 46, 46, 46, 46, 54,
102
+ 54, 54, 54, 54, 54, nil, nil, nil, nil, nil,
103
+ 54, nil, 54, 54, 54, 54, 54 ]
104
+
105
+ racc_action_pointer = [
106
+ nil, 9, 16, 8, -14, nil, nil, 282, nil, nil,
107
+ nil, nil, nil, nil, nil, nil, 66, nil, 77, nil,
108
+ 91, 102, 116, 127, nil, 141, 152, 166, 177, 191,
109
+ 202, 52, 41, -8, -14, 231, nil, 300, -21, 251,
110
+ 9, 342, 360, 366, 384, 390, 408, 257, 318, 275,
111
+ 336, nil, nil, 27, 426 ]
112
+
113
+ racc_action_default = [
114
+ -2, -34, -1, -34, -20, -21, -22, -34, -23, -17,
115
+ -4, -29, -24, -25, -26, -27, -34, -28, -34, 55,
116
+ -34, -34, -34, -34, -3, -34, -34, -34, -34, -34,
117
+ -34, -34, -34, -34, -19, -34, -31, -32, -34, -16,
118
+ -9, -10, -11, -7, -12, -8, -13, -5, -14, -6,
119
+ -15, -18, -30, -34, -33 ]
120
+
121
+ racc_goto_table = [
122
+ 7, 1, 2, 38, nil, nil, nil, nil, nil, nil,
123
+ nil, nil, nil, nil, 34, nil, 35, nil, 37, 39,
124
+ 40, 41, nil, 42, 43, 44, 45, 46, 47, 48,
125
+ 49, 50, nil, nil, nil, nil, nil, nil, nil, nil,
126
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
127
+ nil, 54 ]
128
+
129
+ racc_goto_check = [
130
+ 3, 1, 2, 6, nil, nil, nil, nil, nil, nil,
131
+ nil, nil, nil, nil, 3, nil, 3, nil, 3, 3,
132
+ 3, 3, nil, 3, 3, 3, 3, 3, 3, 3,
133
+ 3, 3, nil, nil, nil, nil, nil, nil, nil, nil,
134
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
135
+ nil, 3 ]
136
+
137
+ racc_goto_pointer = [
138
+ nil, 1, 2, -2, nil, nil, -17 ]
139
+
140
+ racc_goto_default = [
141
+ nil, nil, nil, nil, 9, 11, nil ]
142
+
143
+ racc_reduce_table = [
144
+ 0, 0, :racc_error,
145
+ 1, 34, :_reduce_none,
146
+ 0, 35, :_reduce_2,
147
+ 3, 35, :_reduce_3,
148
+ 2, 35, :_reduce_none,
149
+ 3, 36, :_reduce_5,
150
+ 3, 36, :_reduce_6,
151
+ 3, 36, :_reduce_7,
152
+ 3, 36, :_reduce_8,
153
+ 3, 36, :_reduce_9,
154
+ 3, 36, :_reduce_10,
155
+ 3, 36, :_reduce_11,
156
+ 3, 36, :_reduce_12,
157
+ 3, 36, :_reduce_13,
158
+ 3, 36, :_reduce_14,
159
+ 3, 36, :_reduce_15,
160
+ 3, 36, :_reduce_16,
161
+ 1, 36, :_reduce_none,
162
+ 3, 37, :_reduce_18,
163
+ 2, 37, :_reduce_19,
164
+ 1, 37, :_reduce_none,
165
+ 1, 37, :_reduce_21,
166
+ 1, 37, :_reduce_22,
167
+ 1, 37, :_reduce_23,
168
+ 1, 37, :_reduce_24,
169
+ 1, 37, :_reduce_25,
170
+ 1, 37, :_reduce_26,
171
+ 1, 37, :_reduce_27,
172
+ 1, 37, :_reduce_28,
173
+ 1, 37, :_reduce_none,
174
+ 4, 38, :_reduce_30,
175
+ 3, 38, :_reduce_31,
176
+ 1, 39, :_reduce_32,
177
+ 3, 39, :_reduce_33 ]
178
+
179
+ racc_reduce_n = 34
180
+
181
+ racc_shift_n = 55
182
+
183
+ racc_token_table = {
184
+ false => 0,
185
+ :error => 1,
186
+ :UMINUS => 2,
187
+ "^" => 3,
188
+ "&" => 4,
189
+ "*" => 5,
190
+ "/" => 6,
191
+ "+" => 7,
192
+ "-" => 8,
193
+ "<" => 9,
194
+ ">" => 10,
195
+ "<=" => 11,
196
+ ">=" => 12,
197
+ "<>" => 13,
198
+ "=" => 14,
199
+ :EOL => 15,
200
+ :LT => 16,
201
+ :GT => 17,
202
+ :LE => 18,
203
+ :GE => 19,
204
+ :NE => 20,
205
+ "(" => 21,
206
+ ")" => 22,
207
+ :FUNC => 23,
208
+ :NUMBER => 24,
209
+ :STRING => 25,
210
+ :REF2D => 26,
211
+ :REF3D => 27,
212
+ :RANGE2D => 28,
213
+ :RANGE3D => 29,
214
+ :TRUE => 30,
215
+ :FALSE => 31,
216
+ "," => 32 }
217
+
218
+ racc_nt_base = 33
219
+
220
+ racc_use_result_var = true
221
+
222
+ Racc_arg = [
223
+ racc_action_table,
224
+ racc_action_check,
225
+ racc_action_default,
226
+ racc_action_pointer,
227
+ racc_goto_table,
228
+ racc_goto_check,
229
+ racc_goto_default,
230
+ racc_goto_pointer,
231
+ racc_nt_base,
232
+ racc_reduce_table,
233
+ racc_token_table,
234
+ racc_shift_n,
235
+ racc_reduce_n,
236
+ racc_use_result_var ]
237
+
238
+ Racc_token_to_s_table = [
239
+ "$end",
240
+ "error",
241
+ "UMINUS",
242
+ "\"^\"",
243
+ "\"&\"",
244
+ "\"*\"",
245
+ "\"/\"",
246
+ "\"+\"",
247
+ "\"-\"",
248
+ "\"<\"",
249
+ "\">\"",
250
+ "\"<=\"",
251
+ "\">=\"",
252
+ "\"<>\"",
253
+ "\"=\"",
254
+ "EOL",
255
+ "LT",
256
+ "GT",
257
+ "LE",
258
+ "GE",
259
+ "NE",
260
+ "\"(\"",
261
+ "\")\"",
262
+ "FUNC",
263
+ "NUMBER",
264
+ "STRING",
265
+ "REF2D",
266
+ "REF3D",
267
+ "RANGE2D",
268
+ "RANGE3D",
269
+ "TRUE",
270
+ "FALSE",
271
+ "\",\"",
272
+ "$start",
273
+ "formula",
274
+ "expr_list",
275
+ "expr",
276
+ "primary",
277
+ "funcall",
278
+ "args" ]
279
+
280
+ Racc_debug_parser = false
281
+
282
+ ##### State transition tables end #####
283
+
284
+ # reduce 0 omitted
285
+
286
+ # reduce 1 omitted
287
+
288
+ module_eval(<<'.,.,', 'excelformula.y', 20)
289
+ def _reduce_2(val, _values, result)
290
+ result = []
291
+ result
292
+ end
293
+ .,.,
294
+
295
+ module_eval(<<'.,.,', 'excelformula.y', 21)
296
+ def _reduce_3(val, _values, result)
297
+ result.push val[1], '_arg', '1'
298
+ result
299
+ end
300
+ .,.,
301
+
302
+ # reduce 4 omitted
303
+
304
+ module_eval(<<'.,.,', 'excelformula.y', 24)
305
+ def _reduce_5(val, _values, result)
306
+ result = [ val[0], val[2], 'ptgAdd' ]
307
+ result
308
+ end
309
+ .,.,
310
+
311
+ module_eval(<<'.,.,', 'excelformula.y', 25)
312
+ def _reduce_6(val, _values, result)
313
+ result = [ val[0], val[2], 'ptgSub' ]
314
+ result
315
+ end
316
+ .,.,
317
+
318
+ module_eval(<<'.,.,', 'excelformula.y', 26)
319
+ def _reduce_7(val, _values, result)
320
+ result = [ val[0], val[2], 'ptgMul' ]
321
+ result
322
+ end
323
+ .,.,
324
+
325
+ module_eval(<<'.,.,', 'excelformula.y', 27)
326
+ def _reduce_8(val, _values, result)
327
+ result = [ val[0], val[2], 'ptgDiv' ]
328
+ result
329
+ end
330
+ .,.,
331
+
332
+ module_eval(<<'.,.,', 'excelformula.y', 28)
333
+ def _reduce_9(val, _values, result)
334
+ result = [ val[0], val[2], 'ptgPower' ]
335
+ result
336
+ end
337
+ .,.,
338
+
339
+ module_eval(<<'.,.,', 'excelformula.y', 29)
340
+ def _reduce_10(val, _values, result)
341
+ result = [ val[0], val[2], 'ptgConcat' ]
342
+ result
343
+ end
344
+ .,.,
345
+
346
+ module_eval(<<'.,.,', 'excelformula.y', 30)
347
+ def _reduce_11(val, _values, result)
348
+ result = [ val[0], val[2], 'ptgLT' ]
349
+ result
350
+ end
351
+ .,.,
352
+
353
+ module_eval(<<'.,.,', 'excelformula.y', 31)
354
+ def _reduce_12(val, _values, result)
355
+ result = [ val[0], val[2], 'ptgGT' ]
356
+ result
357
+ end
358
+ .,.,
359
+
360
+ module_eval(<<'.,.,', 'excelformula.y', 32)
361
+ def _reduce_13(val, _values, result)
362
+ result = [ val[0], val[2], 'ptgLE' ]
363
+ result
364
+ end
365
+ .,.,
366
+
367
+ module_eval(<<'.,.,', 'excelformula.y', 33)
368
+ def _reduce_14(val, _values, result)
369
+ result = [ val[0], val[2], 'ptgGE' ]
370
+ result
371
+ end
372
+ .,.,
373
+
374
+ module_eval(<<'.,.,', 'excelformula.y', 34)
375
+ def _reduce_15(val, _values, result)
376
+ result = [ val[0], val[2], 'ptgNE' ]
377
+ result
378
+ end
379
+ .,.,
380
+
381
+ module_eval(<<'.,.,', 'excelformula.y', 35)
382
+ def _reduce_16(val, _values, result)
383
+ result = [ val[0], val[2], 'ptgEQ' ]
384
+ result
385
+ end
386
+ .,.,
387
+
388
+ # reduce 17 omitted
389
+
390
+ module_eval(<<'.,.,', 'excelformula.y', 38)
391
+ def _reduce_18(val, _values, result)
392
+ result = [ val[1], '_arg', '1', 'ptgParen']
393
+ result
394
+ end
395
+ .,.,
396
+
397
+ module_eval(<<'.,.,', 'excelformula.y', 39)
398
+ def _reduce_19(val, _values, result)
399
+ result = [ '_num', '-1', val[1], 'ptgMul' ]
400
+ result
401
+ end
402
+ .,.,
403
+
404
+ # reduce 20 omitted
405
+
406
+ module_eval(<<'.,.,', 'excelformula.y', 41)
407
+ def _reduce_21(val, _values, result)
408
+ result = [ '_num', val[0] ]
409
+ result
410
+ end
411
+ .,.,
412
+
413
+ module_eval(<<'.,.,', 'excelformula.y', 42)
414
+ def _reduce_22(val, _values, result)
415
+ result = [ '_str', val[0] ]
416
+ result
417
+ end
418
+ .,.,
419
+
420
+ module_eval(<<'.,.,', 'excelformula.y', 43)
421
+ def _reduce_23(val, _values, result)
422
+ result = [ '_ref2d', val[0] ]
423
+ result
424
+ end
425
+ .,.,
426
+
427
+ module_eval(<<'.,.,', 'excelformula.y', 44)
428
+ def _reduce_24(val, _values, result)
429
+ result = [ '_ref3d', val[0] ]
430
+ result
431
+ end
432
+ .,.,
433
+
434
+ module_eval(<<'.,.,', 'excelformula.y', 45)
435
+ def _reduce_25(val, _values, result)
436
+ result = [ '_range2d', val[0] ]
437
+ result
438
+ end
439
+ .,.,
440
+
441
+ module_eval(<<'.,.,', 'excelformula.y', 46)
442
+ def _reduce_26(val, _values, result)
443
+ result = [ '_range3d', val[0] ]
444
+ result
445
+ end
446
+ .,.,
447
+
448
+ module_eval(<<'.,.,', 'excelformula.y', 47)
449
+ def _reduce_27(val, _values, result)
450
+ result = [ 'ptgBool', '1' ]
451
+ result
452
+ end
453
+ .,.,
454
+
455
+ module_eval(<<'.,.,', 'excelformula.y', 48)
456
+ def _reduce_28(val, _values, result)
457
+ result = [ 'ptgBool', '0' ]
458
+ result
459
+ end
460
+ .,.,
461
+
462
+ # reduce 29 omitted
463
+
464
+ module_eval(<<'.,.,', 'excelformula.y', 51)
465
+ def _reduce_30(val, _values, result)
466
+ result = [ '_class', val[0], val[2], '_arg', val[2].size.to_s, '_func', val[0] ]
467
+ result
468
+ end
469
+ .,.,
470
+
471
+ module_eval(<<'.,.,', 'excelformula.y', 52)
472
+ def _reduce_31(val, _values, result)
473
+ result = [ '_func', val[0] ]
474
+ result
475
+ end
476
+ .,.,
477
+
478
+ module_eval(<<'.,.,', 'excelformula.y', 54)
479
+ def _reduce_32(val, _values, result)
480
+ result = val
481
+ result
482
+ end
483
+ .,.,
484
+
485
+ module_eval(<<'.,.,', 'excelformula.y', 55)
486
+ def _reduce_33(val, _values, result)
487
+ result.push val[2]
488
+ result
489
+ end
490
+ .,.,
491
+
492
+ def _reduce_none(val, _values, result)
493
+ val[0]
494
+ end
495
+
496
+ end # class ExcelFormulaParser
497
+
498
+
499
+ class ExcelFormulaParserError < StandardError; end
500
+
501
+ class Node
502
+
503
+ def exec_list(nodes)
504
+ v = nil
505
+ nodes.each { |i| v = i.evaluate }
506
+ v
507
+ end
508
+
509
+ def excelformulaparser_error(msg)
510
+ raise ExcelFormulaParserError,
511
+ "in #{fname}:#{lineno}: #{msg}"
512
+ end
513
+
514
+ end
515
+
516
+ class RootNode < Node
517
+
518
+ def initialize(tree)
519
+ @tree = tree
520
+ end
521
+
522
+ def evaluate
523
+ exec_list @tree
524
+ end
525
+
526
+ end
527
+
528
+
529
+ class FuncallNode < Node
530
+
531
+ def initialize(func, args)
532
+ @func = func
533
+ @args = args
534
+ end
535
+
536
+ def evaluate
537
+ arg = @args.collect {|i| i.evaluate }
538
+ out = []
539
+ arg.each { |i| o.push i }
540
+ o.push @func
541
+ p o
542
+ end
543
+
544
+ end
545
+
546
+ class NumberNode < Node
547
+
548
+ def initialize(val)
549
+ @val = val
550
+ end
551
+
552
+ def evaluate
553
+ p @val
554
+ end
555
+
556
+ end
557
+
558
+ class OperateNode < Node
559
+
560
+ def initialize(op, left, right)
561
+ @op = op
562
+ @left = left
563
+ @right = right
564
+ end
565
+
566
+ def evaluate
567
+ o = []
568
+ o.push @left
569
+ o.push @right
570
+ o.push @op
571
+ p o
572
+ end
573
+ end