electr 0.0.2 → 0.0.3

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 (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