calcula 0.1.0 → 1.0.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.
data/lib/calcula.rb CHANGED
@@ -1,15 +1,90 @@
1
1
  require "calcula/version"
2
- require "Token"
3
- require "Lexer"
4
- require "Parser"
5
2
 
3
+ # This module contains the lexer and the parser for Calcula. In the future, the
4
+ # runtime aspect will be included also.
5
+ #
6
+ # @author Paul T.
6
7
  module Calcula
7
8
 
9
+ # This module contains all the tree expressions being created when the
10
+ # parse method is called. All valid tree expressions must subclass `Calcula::Expr`
11
+ #
12
+ # @see Calcula::Expr
13
+ # @author Paul T.
14
+ module Exprs
15
+ # The module here is only for documenting only. The real stuff is under ./Exprs
16
+ end
17
+
18
+ require "Token"
19
+ require "Lexer"
20
+ require "Parser"
21
+
22
+ # Short hand for calling `Calcula::Lexer.new(txt).lex`
23
+ #
24
+ # @see Calcula::Lexer#lex
25
+ # @param txt [String] The Calcula source code
26
+ # @return [Array<Calcula::Token>] Generated based on the source code
8
27
  def Calcula::lex(txt)
9
28
  Lexer.new(txt).lex
10
29
  end
11
30
 
31
+ # Short hand for calling `Calcula::Parser.new(toks).parse` repetitively.
32
+ #
33
+ # @see Calcula::Parser#parse
34
+ # @param toks [Array<Calcula::Token>] This should be supplied by `Calcula::lex`.
35
+ # @return [Array<Calcula::Expr>] Multiple parse trees
12
36
  def Calcula::parse(toks)
13
- Parser.new(toks).parse
37
+ rst = []
38
+ parser = Parser.new(toks)
39
+ while (r = parser.parse) != nil do
40
+ rst << r
41
+ end
42
+ return rst
43
+ end
44
+
45
+ # Essential declarations so the Calcula to Ruby option will work
46
+ #
47
+ # @return [String] The declarations
48
+ def Calcula::stdRubyHeader
49
+ txt = <<-EOT
50
+ class Numeric
51
+ def call(x) # Allowing 10.(20) to work (becomes 200)
52
+ self * x
53
+ end
54
+ end
55
+ class Proc
56
+ def +(g)
57
+ ->(*args){ self.(*args) + g.(*args) }
58
+ end
59
+ def -(g)
60
+ ->(*args){ self.(*args) - g.(*args) }
61
+ end
62
+ def *(g)
63
+ ->(*args){ self.(*args) * g.(*args) }
64
+ end
65
+ def /(g)
66
+ ->(*args){ self.(*args) / g.(*args) }
67
+ end
68
+ def %(g)
69
+ ->(*args){ self.(*args) % g.(*args) }
70
+ end
71
+ def **(g)
72
+ ->(*args){ self.(*args) ** g.(*args) }
73
+ end
74
+ end
75
+ EOT
76
+ return txt
77
+ end
78
+
79
+ # Combines the essential declarations with the compiled Calcula code together
80
+ #
81
+ # @param src [String] The Calcula source code
82
+ # @return [String] The complete executable ruby code
83
+ def Calcula::compile(src)
84
+ <<-EOS
85
+ #{Calcula::stdRubyHeader}
86
+ # CALCULA SOURCE CODE STARTS HERE
87
+ #{Calcula::parse(Calcula::lex(src)).collect{ |e| e.to_s(form: :ruby) }.join("\n")}
88
+ EOS
14
89
  end
15
90
  end
@@ -1,3 +1,3 @@
1
1
  module Calcula
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calcula
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul T.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-03 00:00:00.000000000 Z
11
+ date: 2016-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,10 +71,15 @@ files:
71
71
  - bin/setup
72
72
  - calcula.gemspec
73
73
  - lib/Expr.rb
74
+ - lib/Exprs/AssignExpr.rb
75
+ - lib/Exprs/BinopExpr.rb
76
+ - lib/Exprs/BracedExpr.rb
74
77
  - lib/Exprs/FuncExpr.rb
75
78
  - lib/Exprs/IdentExpr.rb
76
79
  - lib/Exprs/NumExpr.rb
77
80
  - lib/Exprs/ParamsExpr.rb
81
+ - lib/Exprs/RatExpr.rb
82
+ - lib/Exprs/UnaryExpr.rb
78
83
  - lib/Lexer.rb
79
84
  - lib/Parser.rb
80
85
  - lib/Token.rb