writeexcel 0.3.1 → 0.3.2

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 (71) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/{README → README.rdoc} +14 -3
  4. data/Rakefile +52 -0
  5. data/VERSION +1 -0
  6. data/charts/chartex.rb +315 -0
  7. data/charts/demo1.rb +45 -0
  8. data/charts/demo101.bin +0 -0
  9. data/charts/demo2.rb +64 -0
  10. data/charts/demo201.bin +0 -0
  11. data/charts/demo3.rb +116 -0
  12. data/charts/demo301.bin +0 -0
  13. data/charts/demo4.rb +118 -0
  14. data/charts/demo401.bin +0 -0
  15. data/charts/demo5.rb +47 -0
  16. data/charts/demo501.bin +0 -0
  17. data/examples/demo.rb +4 -1
  18. data/examples/images.rb +14 -4
  19. data/examples/stats.rb +0 -2
  20. data/lib/writeexcel.rb +0 -1
  21. data/lib/writeexcel/excelformula.y +139 -0
  22. data/lib/writeexcel/formula.rb +3 -1
  23. data/lib/writeexcel/workbook.rb +9 -9
  24. data/test/helper.rb +9 -0
  25. data/test/perl_output/defined_name.xls +0 -0
  26. data/test/test_00_IEEE_double.rb +1 -3
  27. data/test/test_01_add_worksheet.rb +1 -4
  28. data/test/test_02_merge_formats.rb +1 -4
  29. data/test/test_04_dimensions.rb +1 -4
  30. data/test/test_05_rows.rb +1 -4
  31. data/test/test_06_extsst.rb +1 -4
  32. data/test/test_11_date_time.rb +1 -4
  33. data/test/test_12_date_only.rb +1 -4
  34. data/test/test_13_date_seconds.rb +1 -4
  35. data/test/test_21_escher.rb +1 -4
  36. data/test/test_22_mso_drawing_group.rb +1 -4
  37. data/test/test_23_note.rb +1 -4
  38. data/test/test_24_txo.rb +1 -4
  39. data/test/test_25_position_object.rb +1 -4
  40. data/test/test_26_autofilter.rb +1 -4
  41. data/test/test_27_autofilter.rb +1 -4
  42. data/test/test_28_autofilter.rb +1 -4
  43. data/test/test_29_process_jpg.rb +1 -4
  44. data/test/test_30_validation_dval.rb +1 -4
  45. data/test/test_31_validation_dv_strings.rb +1 -4
  46. data/test/test_32_validation_dv_formula.rb +1 -4
  47. data/test/test_40_property_types.rb +1 -5
  48. data/test/test_41_properties.rb +1 -5
  49. data/test/test_42_set_properties.rb +1 -5
  50. data/test/test_50_name_stored.rb +1 -4
  51. data/test/test_51_name_print_area.rb +1 -4
  52. data/test/test_52_name_print_titles.rb +1 -4
  53. data/test/test_53_autofilter.rb +1 -4
  54. data/test/test_60_chart_generic.rb +1 -4
  55. data/test/test_61_chart_subclasses.rb +1 -4
  56. data/test/test_62_chart_formats.rb +1 -4
  57. data/test/test_63_chart_area_formats.rb +1 -4
  58. data/test/{tc_biff.rb → test_biff.rb} +1 -4
  59. data/test/{tc_example_match.rb → test_example_match.rb} +84 -69
  60. data/test/{tc_format.rb → test_format.rb} +1 -4
  61. data/test/{tc_formula.rb → test_formula.rb} +1 -4
  62. data/test/{tc_ole.rb → test_ole.rb} +1 -4
  63. data/test/{tc_storage_lite.rb → test_storage_lite.rb} +1 -4
  64. data/test/{tc_workbook.rb → test_workbook.rb} +1 -4
  65. data/test/{tc_worksheet.rb → test_worksheet.rb} +1 -4
  66. data/writeexcel.gemspec +287 -16
  67. metadata +123 -35
  68. data/test/tc_all.rb +0 -32
  69. data/test/tc_chart.rb +0 -22
  70. data/test/test_chartex.rb +0 -35
  71. data/test/ts_all.rb +0 -46
Binary file
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ ###############################################################################
4
+ #
5
+ # Simple example of how to add an externally created chart to a Spreadsheet::
6
+ # WriteExcel file.
7
+ #
8
+ #
9
+ # This example adds a pie chart extracted from the file Chart2.xls as follows:
10
+ #
11
+ # perl chartex.pl -c=demo1 Chart1.xls
12
+ #
13
+ #
14
+ # reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
15
+ #
16
+ # original written in Perl by John McNamara
17
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
18
+ #
19
+
20
+ require 'writeexcel'
21
+
22
+ workbook = WriteExcel.new("demo2.xls")
23
+ worksheet = workbook.add_worksheet
24
+
25
+ # Add the chart extracted using the chartex utility
26
+ chart = workbook.add_chart_ext('demo201.bin', 'Chart1')
27
+
28
+ # Link the chart to the worksheet data using a dummy formula.
29
+ worksheet.store_formula('=Sheet1!A1')
30
+
31
+ # Add some extra formats to cover formats used in the charts.
32
+ chart_font_1 = workbook.add_format(:font_only => 1)
33
+ chart_font_2 = workbook.add_format(:font_only => 1)
34
+ chart_font_3 = workbook.add_format(:font_only => 1)
35
+ chart_font_4 = workbook.add_format(:font_only => 1)
36
+ chart_font_5 = workbook.add_format(:font_only => 1)
37
+
38
+ # Add all other formats (if any).
39
+ bold = workbook.add_format(:bold => 1)
40
+
41
+ # Adjust column widths and add some headers
42
+ worksheet.set_column('A:B', 20)
43
+
44
+ worksheet.write('A1', 'Module', bold)
45
+ worksheet.write('B1', 'No. of lines', bold)
46
+
47
+ # Add data to range that the chart refers to.
48
+ data = [
49
+
50
+ ['BIFFwriter.pm', 275],
51
+ ['Big.pm', 99],
52
+ ['Chart.pm', 269],
53
+ ['Format.pm', 724],
54
+ ['Formula.pm', 1410],
55
+ ['OLEwriter.pm', 447],
56
+ ['Utility.pm', 884],
57
+ ['Workbook.pm', 1925],
58
+ ['WorkbookBig.pm', 112],
59
+ ['Worksheet.pm', 3945]
60
+ ]
61
+
62
+ worksheet.write_col('A2', data )
63
+
64
+ workbook.close
Binary file
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ ###############################################################################
4
+ #
5
+ # Simple example of how to add an externally created chart to a Spreadsheet::
6
+ # WriteExcel file.
7
+ #
8
+ #
9
+ # This example adds an "Open-high-low-close" stock chart extracted from the
10
+ # file Chart3.xls as follows:
11
+ #
12
+ # perl chartex.pl -c=demo3 Chart3.xls
13
+ #
14
+ #
15
+ # reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
16
+ #
17
+ # original written in Perl by John McNamara
18
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
19
+ #
20
+
21
+ require 'writeexcel'
22
+
23
+ workbook = WriteExcel.new("demo3.xls")
24
+ worksheet = workbook.add_worksheet
25
+
26
+ # Add the chart extracted using the chartex utility
27
+ chart = workbook.add_chart_ext('demo301.bin', 'Chart1')
28
+
29
+ # Link the chart to the worksheet data using a dummy formula.
30
+ worksheet.store_formula('=Sheet1!A1')
31
+
32
+ # Add some extra formats to cover formats used in the charts.
33
+ chart_font_1 = workbook.add_format(:font_only => 1)
34
+ chart_font_2 = workbook.add_format(:font_only => 1)
35
+ chart_font_3 = workbook.add_format(:font_only => 1)
36
+ chart_font_4 = workbook.add_format(:font_only => 1)
37
+ chart_font_5 = workbook.add_format(:font_only => 1)
38
+
39
+ # Add all other formats (if any).
40
+ bold = workbook.add_format(:bold => 1)
41
+ date_format = workbook.add_format(:num_format => 'dd/mm/yyyy')
42
+
43
+ # Adjust column widths and add some headers
44
+ worksheet.set_column('A:A', 12)
45
+
46
+ worksheet.write('A1', 'Date', bold)
47
+ worksheet.write('B1', 'Open', bold)
48
+ worksheet.write('C1', 'High', bold)
49
+ worksheet.write('D1', 'Low', bold)
50
+ worksheet.write('E1', 'Close', bold)
51
+
52
+ # Add data to range that the chart refers to.
53
+ dates = [
54
+
55
+ "2004-08-19T",
56
+ "2004-08-20T",
57
+ "2004-08-23T",
58
+ "2004-08-24T",
59
+ "2004-08-25T",
60
+ "2004-08-26T",
61
+ "2004-08-27T",
62
+ "2004-08-30T",
63
+ "2004-08-31T",
64
+ "2004-09-01T",
65
+ "2004-09-02T",
66
+ "2004-09-03T",
67
+ "2004-09-07T",
68
+ "2004-09-08T",
69
+ "2004-09-09T",
70
+ "2004-09-10T",
71
+ "2004-09-13T",
72
+ "2004-09-14T",
73
+ "2004-09-15T",
74
+ "2004-09-16T",
75
+ "2004-09-17T",
76
+ "2004-09-20T",
77
+ "2004-09-21T"
78
+ ]
79
+
80
+ # Open-High-Low-Close prices
81
+ prices = [
82
+
83
+ [100.00, 104.06, 95.96, 100.34],
84
+ [101.01, 109.08, 100.50, 108.31],
85
+ [110.75, 113.48, 109.05, 109.40],
86
+ [111.24, 111.60, 103.57, 104.87],
87
+ [104.96, 108.00, 103.88, 106.00],
88
+ [104.95, 107.95, 104.66, 107.91],
89
+ [108.10, 108.62, 105.69, 106.15],
90
+ [105.28, 105.49, 102.01, 102.01],
91
+ [102.30, 103.71, 102.16, 102.37],
92
+ [102.70, 102.97, 99.67, 100.25],
93
+ [ 99.19, 102.37, 98.94, 101.51],
94
+ [100.95, 101.74, 99.32, 100.01],
95
+ [101.01, 102.00, 99.61, 101.58],
96
+ [100.74, 103.03, 100.50, 102.30],
97
+ [102.53, 102.71, 101.00, 102.31],
98
+ [101.60, 106.56, 101.30, 105.33],
99
+ [106.63, 108.41, 106.46, 107.50],
100
+ [107.45, 112.00, 106.79, 111.49],
101
+ [110.56, 114.23, 110.20, 112.00],
102
+ [112.34, 115.80, 111.65, 113.97],
103
+ [114.42, 117.49, 113.55, 117.49],
104
+ [116.95, 121.60, 116.77, 119.36],
105
+ [119.81, 120.42, 117.51, 117.84]
106
+ ]
107
+
108
+ row = 1
109
+
110
+ dates.each do |d|
111
+ worksheet.write_date_time(row, 0, d, date_format)
112
+ row += 1
113
+ end
114
+ worksheet.write_col('B2', prices)
115
+
116
+ workbook.close
Binary file
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ ###############################################################################
4
+ #
5
+ # Simple example of how to add an externally created chart to a Spreadsheet::
6
+ # WriteExcel file.
7
+ #
8
+ #
9
+ # This example adds an "Open-high-low-close" stock chart extracted from the
10
+ # file Chart3.xls as follows:
11
+ #
12
+ # perl chartex.pl -c=demo4 Chart4.xls
13
+ #
14
+ #
15
+ # reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
16
+ #
17
+ # original written in Perl by John McNamara
18
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
19
+ #
20
+
21
+ require 'writeexcel'
22
+
23
+ workbook = WriteExcel.new("demo4.xls")
24
+ worksheet = workbook.add_worksheet
25
+
26
+ # Add the chart extracted using the chartex utility
27
+ worksheet.embed_chart('G2', 'demo401.bin', 3, 3, 1.08, 1.21)
28
+
29
+ # Link the chart to the worksheet data using a dummy formula.
30
+ worksheet.store_formula('=Sheet1!A1')
31
+
32
+
33
+ # Add some extra formats to cover formats used in the charts.
34
+ chart_font_1 = workbook.add_format(:font_only => 1)
35
+ chart_font_2 = workbook.add_format(:font_only => 1, :bold => 1)
36
+ chart_font_3 = workbook.add_format(:font_only => 1)
37
+ chart_font_4 = workbook.add_format(:font_only => 1)
38
+
39
+ # Add all other formats.
40
+ bold = workbook.add_format(:bold => 1)
41
+ date_format = workbook.add_format(:num_format => 'dd/mm/yyyy')
42
+
43
+ # Adjust column widths and add some headers
44
+ worksheet.set_column('A:A', 12)
45
+
46
+ worksheet.write('A1', 'Date', bold)
47
+ worksheet.write('B1', 'Open', bold)
48
+ worksheet.write('C1', 'High', bold)
49
+ worksheet.write('D1', 'Low', bold)
50
+ worksheet.write('E1', 'Close', bold)
51
+
52
+
53
+ # Add data to range that the chart refers to.
54
+ dates = [
55
+
56
+ "2004-08-19T",
57
+ "2004-08-20T",
58
+ "2004-08-23T",
59
+ "2004-08-24T",
60
+ "2004-08-25T",
61
+ "2004-08-26T",
62
+ "2004-08-27T",
63
+ "2004-08-30T",
64
+ "2004-08-31T",
65
+ "2004-09-01T",
66
+ "2004-09-02T",
67
+ "2004-09-03T",
68
+ "2004-09-07T",
69
+ "2004-09-08T",
70
+ "2004-09-09T",
71
+ "2004-09-10T",
72
+ "2004-09-13T",
73
+ "2004-09-14T",
74
+ "2004-09-15T",
75
+ "2004-09-16T",
76
+ "2004-09-17T",
77
+ "2004-09-20T",
78
+ "2004-09-21T"
79
+ ]
80
+
81
+ # Open-High-Low-Close prices
82
+ prices = [
83
+
84
+ [100.00, 104.06, 95.96, 100.34],
85
+ [101.01, 109.08, 100.50, 108.31],
86
+ [110.75, 113.48, 109.05, 109.40],
87
+ [111.24, 111.60, 103.57, 104.87],
88
+ [104.96, 108.00, 103.88, 106.00],
89
+ [104.95, 107.95, 104.66, 107.91],
90
+ [108.10, 108.62, 105.69, 106.15],
91
+ [105.28, 105.49, 102.01, 102.01],
92
+ [102.30, 103.71, 102.16, 102.37],
93
+ [102.70, 102.97, 99.67, 100.25],
94
+ [ 99.19, 102.37, 98.94, 101.51],
95
+ [100.95, 101.74, 99.32, 100.01],
96
+ [101.01, 102.00, 99.61, 101.58],
97
+ [100.74, 103.03, 100.50, 102.30],
98
+ [102.53, 102.71, 101.00, 102.31],
99
+ [101.60, 106.56, 101.30, 105.33],
100
+ [106.63, 108.41, 106.46, 107.50],
101
+ [107.45, 112.00, 106.79, 111.49],
102
+ [110.56, 114.23, 110.20, 112.00],
103
+ [112.34, 115.80, 111.65, 113.97],
104
+ [114.42, 117.49, 113.55, 117.49],
105
+ [116.95, 121.60, 116.77, 119.36],
106
+ [119.81, 120.42, 117.51, 117.84]
107
+ ]
108
+
109
+
110
+
111
+ row = 1
112
+ dates.each do |d|
113
+ worksheet.write_date_time(row, 0, d, date_format)
114
+ row += 1
115
+ end
116
+ worksheet.write_col('B2', prices)
117
+
118
+ workbook.close
Binary file
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ ###############################################################################
4
+ #
5
+ # Simple example of how to add an externally created chart to a Spreadsheet::
6
+ # WriteExcel file.
7
+ #
8
+ #
9
+ # This example adds a line chart extracted from the file Chart1.xls as follows:
10
+ #
11
+ # perl chartex.pl -c=demo5 Chart5.xls
12
+ #
13
+ #
14
+ # reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
15
+ #
16
+ # original written in Perl by John McNamara
17
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
18
+ #
19
+
20
+ require 'writeexcel'
21
+
22
+ workbook = WriteExcel.new("demo5.xls")
23
+ worksheet = workbook.add_worksheet
24
+
25
+ # Add the chart extracted using the chartex utility
26
+ worksheet.embed_chart('D3', 'demo501.bin')
27
+
28
+ # Link the chart to the worksheet data using a dummy formula.
29
+ worksheet.store_formula('=Sheet1!A1')
30
+
31
+
32
+ # Add some extra formats to cover formats used in the charts.
33
+ chart_font_1 = workbook.add_format(:font_only => 1)
34
+ chart_font_2 = workbook.add_format(:font_only => 1)
35
+
36
+ # Add all other formats.
37
+
38
+ # Add data to range that the chart refers to.
39
+ nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
40
+ squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
41
+
42
+
43
+
44
+ worksheet.write_col('A1', nums)
45
+ worksheet.write_col('B1', squares)
46
+
47
+ workbook.close
Binary file
@@ -107,7 +107,10 @@ worksheet.write('B9', 'http://www.perl.com/' )
107
107
  # Images
108
108
  #
109
109
  worksheet.write('A10', "Images")
110
- worksheet.insert_image('B10', 'republic.png', 16, 8)
110
+ worksheet.insert_image('B10',
111
+ File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png'),
112
+ 16, 8
113
+ )
111
114
 
112
115
 
113
116
  #######################################################################
@@ -24,16 +24,24 @@ bp=1
24
24
 
25
25
  # Insert a basic image
26
26
  worksheet1.write('A10', "Image inserted into worksheet.")
27
- worksheet1.insert_image('A1', 'republic.png')
27
+ worksheet1.insert_image('A1',
28
+ File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png')
29
+ )
28
30
 
29
31
 
30
32
  # Insert an image with an offset
31
33
  worksheet2.write('A10', "Image inserted with an offset.")
32
- worksheet2.insert_image('A1', 'republic.png', 32, 10)
34
+ worksheet2.insert_image('A1',
35
+ File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png'),
36
+ 32, 10
37
+ )
33
38
 
34
39
  # Insert a scaled image
35
40
  worksheet3.write('A10', "Image scaled: width x 2, height x 0.8.")
36
- worksheet3.insert_image('A1', 'republic.png', 0, 0, 2, 0.8)
41
+ worksheet3.insert_image('A1',
42
+ File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png'),
43
+ 0, 0, 2, 0.8
44
+ )
37
45
 
38
46
  # Insert an image over varied column and row sizes
39
47
  # This does not require any additional work
@@ -47,6 +55,8 @@ worksheet4.set_row(0, 30)
47
55
  worksheet4.set_row(3, 5)
48
56
 
49
57
  worksheet4.write('A10', "Image inserted over scaled rows and columns.")
50
- worksheet4.insert_image('A1', 'republic.png')
58
+ worksheet4.insert_image('A1',
59
+ File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png')
60
+ )
51
61
 
52
62
  workbook.close
@@ -11,9 +11,7 @@
11
11
  # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
12
12
  #
13
13
 
14
- require 'rubygems'
15
14
  require 'writeexcel'
16
- include Spreadsheet
17
15
  xlsfile = 'stats.xls'
18
16
 
19
17
  workbook = WriteExcel.new(xlsfile)
@@ -1130,5 +1130,4 @@ require "writeexcel/workbook"
1130
1130
  # 12 until another chart with the title set is viewed.
1131
1131
  #
1132
1132
  class WriteExcel < Workbook
1133
- VERSION = "0.3.1"
1134
1133
  end
@@ -0,0 +1,139 @@
1
+ #
2
+ # copyright (c) 2009, 2010 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
+ | NAME { result = [ '_name', val[0] ] }
49
+ | TRUE { result = [ 'ptgBool', '1' ] }
50
+ | FALSE { result = [ 'ptgBool', '0' ] }
51
+ | funcall
52
+
53
+ funcall : FUNC '(' args ')' { result = [ '_class', val[0], val[2], '_arg', val[2].size.to_s, '_func', val[0] ] }
54
+ | FUNC '(' ')' { result = [ '_func', val[0] ] }
55
+
56
+ args : expr { result = val }
57
+ | args ',' expr { result.push val[2] }
58
+
59
+ end
60
+
61
+
62
+ ---- footer
63
+
64
+ class ExcelFormulaParserError < StandardError; end
65
+
66
+ class Node
67
+
68
+ def exec_list(nodes)
69
+ v = nil
70
+ nodes.each { |i| v = i.evaluate }
71
+ v
72
+ end
73
+
74
+ def excelformulaparser_error(msg)
75
+ raise ExcelFormulaParserError,
76
+ "in #{fname}:#{lineno}: #{msg}"
77
+ end
78
+
79
+ end
80
+
81
+ class RootNode < Node
82
+
83
+ def initialize(tree)
84
+ @tree = tree
85
+ end
86
+
87
+ def evaluate
88
+ exec_list @tree
89
+ end
90
+
91
+ end
92
+
93
+
94
+ class FuncallNode < Node
95
+
96
+ def initialize(func, args)
97
+ @func = func
98
+ @args = args
99
+ end
100
+
101
+ def evaluate
102
+ arg = @args.collect {|i| i.evaluate }
103
+ out = []
104
+ arg.each { |i| o.push i }
105
+ o.push @func
106
+ p o
107
+ end
108
+
109
+ end
110
+
111
+ class NumberNode < Node
112
+
113
+ def initialize(val)
114
+ @val = val
115
+ end
116
+
117
+ def evaluate
118
+ p @val
119
+ end
120
+
121
+ end
122
+
123
+ class OperateNode < Node
124
+
125
+ def initialize(op, left, right)
126
+ @op = op
127
+ @left = left
128
+ @right = right
129
+ end
130
+
131
+ def evaluate
132
+ o = []
133
+ o.push @left
134
+ o.push @right
135
+ o.push @op
136
+ p o
137
+ end
138
+ end
139
+