electr 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.coco.yml +4 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +8 -0
  5. data/README.md +12 -13
  6. data/bin/electr +10 -5
  7. data/documentation/developer.md +21 -0
  8. data/documentation/grammar.md +34 -0
  9. data/documentation/precedence.md +8 -0
  10. data/electr.gemspec +1 -0
  11. data/lib/electr.rb +13 -2
  12. data/lib/electr/ast/ast.rb +24 -6
  13. data/lib/electr/ast/constant_ast.rb +1 -0
  14. data/lib/electr/ast/func_args_ast.rb +1 -0
  15. data/lib/electr/ast/func_ast.rb +1 -0
  16. data/lib/electr/ast/func_name_ast.rb +2 -0
  17. data/lib/electr/ast/numeric_ast.rb +1 -0
  18. data/lib/electr/ast/operator_ast.rb +1 -0
  19. data/lib/electr/ast/root_ast.rb +1 -0
  20. data/lib/electr/ast/value_ast.rb +1 -0
  21. data/lib/electr/compiler.rb +10 -6
  22. data/lib/electr/exceptions.rb +1 -0
  23. data/lib/electr/parser.rb +2 -0
  24. data/lib/electr/parser/lexer.rb +14 -37
  25. data/lib/electr/parser/lexical_unit.rb +7 -4
  26. data/lib/electr/{rules.rb → parser/rules.rb} +0 -0
  27. data/lib/electr/parser/rules/base_rule.rb +5 -13
  28. data/lib/electr/parser/rules/expression_rule.rb +18 -17
  29. data/lib/electr/parser/rules/root_rule.rb +5 -2
  30. data/lib/electr/parser/sya.rb +22 -21
  31. data/lib/electr/parser/syntaxer.rb +4 -1
  32. data/lib/electr/parser/token.rb +26 -0
  33. data/lib/electr/parser/tokenizer.rb +47 -7
  34. data/lib/electr/repl.rb +8 -56
  35. data/lib/electr/repl/ast_printer.rb +11 -0
  36. data/lib/electr/repl/ast_reader.rb +17 -0
  37. data/lib/electr/repl/base_reader.rb +23 -0
  38. data/lib/electr/{evaluator.rb → repl/evaluator.rb} +15 -1
  39. data/lib/electr/repl/nil_evaluator.rb +11 -0
  40. data/lib/electr/repl/printer.rb +12 -0
  41. data/lib/electr/repl/reader.rb +16 -0
  42. data/lib/electr/repl/repl.rb +28 -0
  43. data/lib/electr/version.rb +1 -1
  44. data/spec/ast/ast_spec.rb +17 -0
  45. data/spec/compiler_spec.rb +4 -6
  46. data/spec/parser/base_rule_spec.rb +13 -0
  47. data/spec/{lexer_spec.rb → parser/lexer_spec.rb} +5 -2
  48. data/spec/parser/pn_spec.rb +17 -0
  49. data/spec/{sya_spec.rb → parser/sya_spec.rb} +35 -0
  50. data/spec/{tokenizer_spec.rb → parser/tokenizer_spec.rb} +89 -0
  51. data/spec/repl/ast_printer_spec.rb +18 -0
  52. data/spec/repl/ast_reader_spec.rb +19 -0
  53. data/spec/{evaluator_spec.rb → repl/evaluator_spec.rb} +15 -5
  54. data/spec/repl/nil_evaluator_spec.rb +11 -0
  55. data/spec/repl/printer_spec.rb +19 -0
  56. data/spec/repl/reader_spec.rb +25 -0
  57. data/spec/repl/repl_spec.rb +32 -0
  58. data/spec/spec_helper.rb +1 -0
  59. metadata +56 -12
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'ostruct'
3
+
4
+ include Electr
5
+
6
+ describe ASTPrinter do
7
+
8
+ describe '.run' do
9
+
10
+ it 'display ast to STDOUT' do
11
+ ast = Object.new
12
+ def ast.display ; puts 'AST' ; end
13
+
14
+ expect { ASTPrinter.run(ast) }.to output("AST\n").to_stdout
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ include Electr
4
+
5
+ describe ASTReader do
6
+
7
+ describe ".run" do
8
+
9
+ it 'prompts' do
10
+ allow(STDIN).to receive(:gets).and_return("2 3\n")
11
+ reader = ASTReader.new
12
+
13
+ expect { reader.run }.to output("E--ast> ").to_stdout
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+
@@ -18,12 +18,23 @@ describe Evaluator do
18
18
  {code: "10mV 100R", result: 1},
19
19
  {code: "10W 2", result: 20},
20
20
  {code: "100mW 2", result: 0.2},
21
+ {code: "1u", result: 0.000_001},
22
+ {code: "1pF", result: 0.000_000_001},
23
+ {code: ".12 .5", result: 0.06},
24
+ {code: "-.12 .5", result: -0.06},
25
+ {code: "-2 -3", result: 6},
26
+ {code: "2 -3V", result: -6},
27
+ {code: "-sqrt(49)", result: -7},
28
+ {code: "-pi", result: -Math::PI},
29
+ {code: "-pi 2", result: -(2 * Math::PI)},
30
+ {code: "2 -pi", result: -(2 * Math::PI)},
31
+ {code: "1 - 1 + 4 - 1 - 1", result: 2},
32
+ {code: "-(2 3)", result: -6},
21
33
  ]
22
34
 
23
35
  specify "#evaluate_pn" do
24
36
  CODES_TO_EVAL.each do |code|
25
- compiler = Compiler.new
26
- pns = compiler.compile_to_pn(code[:code])
37
+ pns = Compiler.compile_to_pn(code[:code])
27
38
 
28
39
  evaluator = Evaluator.new
29
40
  result = evaluator.evaluate_pn(pns)
@@ -33,13 +44,12 @@ describe Evaluator do
33
44
  end
34
45
 
35
46
  specify do
36
- compiler = Compiler.new
37
- pns = compiler.compile_to_pn("1 - 1 + 4 - 1 - 1")
47
+ pns = Compiler.compile_to_pn("11,000 + 22_000")
38
48
 
39
49
  evaluator = Evaluator.new
40
50
  result = evaluator.evaluate_pn(pns)
41
51
 
42
- expect(result).to eq 2
52
+ expect(result).to eq 33_000
43
53
  end
44
54
 
45
55
 
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ include Electr
4
+
5
+ describe NilEvaluator do
6
+
7
+ it 'returns the argument untouched' do
8
+ expect(NilEvaluator.new.evaluate_pn('foo')).to eq 'foo'
9
+ end
10
+
11
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ include Electr
4
+
5
+ describe Printer do
6
+
7
+ describe ".run" do
8
+
9
+ it 'truncates integer like number' do
10
+ expect { Printer.run(10.0) }.to output("10\n").to_stdout
11
+ end
12
+
13
+ it 'rounds number' do
14
+ expect { Printer.run(1.0 / 3) }.to output("0.3333333333\n").to_stdout
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ include Electr
4
+
5
+ describe Reader do
6
+
7
+ describe ".run" do
8
+
9
+ before do
10
+ allow(STDIN).to receive(:gets).and_return("2 3\n")
11
+ end
12
+
13
+ let(:reader) { Reader.new }
14
+
15
+ it 'compiles the expression from STDIN' do
16
+ expect(reader.run.first.name).to eq 'ast'
17
+ end
18
+
19
+ it 'prompts' do
20
+ expect { reader.run }.to output("E> ").to_stdout
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ include Electr
4
+
5
+ class TestReader
6
+ def run
7
+ [
8
+ Pn.new('+', 'operator'),
9
+ Pn.new('1', 'numeric'),
10
+ Pn.new('2', 'numeric')
11
+ ]
12
+ end
13
+ end
14
+
15
+ class TestPrinter
16
+ def self.run(arg)
17
+ arg
18
+ end
19
+ end
20
+
21
+ describe Repl do
22
+
23
+ describe "#run" do
24
+
25
+ it 'runs the toolchain' do
26
+ repl = Repl.new(TestReader.new, Evaluator.new, TestPrinter)
27
+ expect(repl.run_once).to eq 3
28
+ end
29
+
30
+ end
31
+
32
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'coco'
2
3
  require 'electr'
3
4
 
4
5
  RSpec.configure do |config|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: electr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - lkdjiin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-04 00:00:00.000000000 Z
11
+ date: 2015-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coco
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description:
56
70
  email:
57
71
  - xavier.nayrac@gmail.com
@@ -60,6 +74,7 @@ executables:
60
74
  extensions: []
61
75
  extra_rdoc_files: []
62
76
  files:
77
+ - ".coco.yml"
63
78
  - ".gitignore"
64
79
  - ".rspec"
65
80
  - ".travis.yml"
@@ -69,6 +84,9 @@ files:
69
84
  - README.md
70
85
  - Rakefile
71
86
  - bin/electr
87
+ - documentation/developer.md
88
+ - documentation/grammar.md
89
+ - documentation/precedence.md
72
90
  - electr.gemspec
73
91
  - lib/electr.rb
74
92
  - lib/electr/ast.rb
@@ -82,28 +100,45 @@ files:
82
100
  - lib/electr/ast/root_ast.rb
83
101
  - lib/electr/ast/value_ast.rb
84
102
  - lib/electr/compiler.rb
85
- - lib/electr/evaluator.rb
86
103
  - lib/electr/exceptions.rb
87
104
  - lib/electr/option.rb
88
105
  - lib/electr/parser.rb
89
106
  - lib/electr/parser/lexer.rb
90
107
  - lib/electr/parser/lexical_unit.rb
108
+ - lib/electr/parser/rules.rb
91
109
  - lib/electr/parser/rules/base_rule.rb
92
110
  - lib/electr/parser/rules/expression_rule.rb
93
111
  - lib/electr/parser/rules/root_rule.rb
94
112
  - lib/electr/parser/sya.rb
95
113
  - lib/electr/parser/syntaxer.rb
114
+ - lib/electr/parser/token.rb
96
115
  - lib/electr/parser/tokenizer.rb
97
116
  - lib/electr/repl.rb
98
- - lib/electr/rules.rb
117
+ - lib/electr/repl/ast_printer.rb
118
+ - lib/electr/repl/ast_reader.rb
119
+ - lib/electr/repl/base_reader.rb
120
+ - lib/electr/repl/evaluator.rb
121
+ - lib/electr/repl/nil_evaluator.rb
122
+ - lib/electr/repl/printer.rb
123
+ - lib/electr/repl/reader.rb
124
+ - lib/electr/repl/repl.rb
99
125
  - lib/electr/version.rb
126
+ - spec/ast/ast_spec.rb
100
127
  - spec/compiler_spec.rb
101
128
  - spec/electr_spec.rb
102
- - spec/evaluator_spec.rb
103
- - spec/lexer_spec.rb
129
+ - spec/parser/base_rule_spec.rb
130
+ - spec/parser/lexer_spec.rb
131
+ - spec/parser/pn_spec.rb
132
+ - spec/parser/sya_spec.rb
133
+ - spec/parser/tokenizer_spec.rb
134
+ - spec/repl/ast_printer_spec.rb
135
+ - spec/repl/ast_reader_spec.rb
136
+ - spec/repl/evaluator_spec.rb
137
+ - spec/repl/nil_evaluator_spec.rb
138
+ - spec/repl/printer_spec.rb
139
+ - spec/repl/reader_spec.rb
140
+ - spec/repl/repl_spec.rb
104
141
  - spec/spec_helper.rb
105
- - spec/sya_spec.rb
106
- - spec/tokenizer_spec.rb
107
142
  homepage: https://github.com/lkdjiin/electr
108
143
  licenses:
109
144
  - MIT
@@ -129,10 +164,19 @@ signing_key:
129
164
  specification_version: 4
130
165
  summary: Interactive language for electronic formulas
131
166
  test_files:
167
+ - spec/ast/ast_spec.rb
132
168
  - spec/compiler_spec.rb
133
169
  - spec/electr_spec.rb
134
- - spec/evaluator_spec.rb
135
- - spec/lexer_spec.rb
170
+ - spec/parser/base_rule_spec.rb
171
+ - spec/parser/lexer_spec.rb
172
+ - spec/parser/pn_spec.rb
173
+ - spec/parser/sya_spec.rb
174
+ - spec/parser/tokenizer_spec.rb
175
+ - spec/repl/ast_printer_spec.rb
176
+ - spec/repl/ast_reader_spec.rb
177
+ - spec/repl/evaluator_spec.rb
178
+ - spec/repl/nil_evaluator_spec.rb
179
+ - spec/repl/printer_spec.rb
180
+ - spec/repl/reader_spec.rb
181
+ - spec/repl/repl_spec.rb
136
182
  - spec/spec_helper.rb
137
- - spec/sya_spec.rb
138
- - spec/tokenizer_spec.rb