calc_jgomez88 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.
- checksums.yaml +4 -4
- data/bin/calc +20 -10
- data/lib/ast.rb +58 -3
- data/lib/calculator.rb +9 -0
- data/lib/parser.rb +64 -15
- data/lib/scanner.rb +12 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 484290abe479b03f1415c585afc1a4debdf5782f
|
4
|
+
data.tar.gz: 334f22367cc64dda2c42dc19d79348e6eec3b243
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b659ce91e3389dcb216a9a514f4b7e0c155216f3212097f5185edf9f7768d77b9453d30c68a3b45f208f70f6c420cd9bf872a80d39bc22225aa93eabe2619d8
|
7
|
+
data.tar.gz: 82759f854a7eef1867082729122dabe99630dd99839505c404b1134bfbdf285d5cb13e6f3b4adcc9881a1b33191f10ea9bc4a249a35607ec81c830bd70de7f31
|
data/bin/calc
CHANGED
@@ -8,16 +8,26 @@ require 'calcex'
|
|
8
8
|
$stdout.print "> "
|
9
9
|
$stdout.flush
|
10
10
|
|
11
|
-
text = gets
|
12
|
-
|
13
11
|
$calc = Calculator.new()
|
12
|
+
entro = true #Varaible para saber si entro datos
|
13
|
+
text = gets
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
while entro do
|
16
|
+
begin
|
17
|
+
puts "=> " + $calc.eval(text).to_s
|
18
|
+
rescue ParseError
|
19
|
+
puts "Parse Error"
|
20
|
+
rescue UnrecognizedTokenException
|
21
|
+
puts "UnrecognizedTokenException"
|
22
|
+
rescue
|
23
|
+
puts "Unkown exception"
|
24
|
+
end
|
25
|
+
$stdout.print "> "
|
26
|
+
if text = gets then #Verifica si entro otra linea
|
27
|
+
entro = true
|
28
|
+
else
|
29
|
+
entro = false
|
30
|
+
end
|
23
31
|
end
|
32
|
+
|
33
|
+
|
data/lib/ast.rb
CHANGED
@@ -58,10 +58,19 @@ class DivideNode < BinaryNode
|
|
58
58
|
return @left.evaluate() / @right.evaluate()
|
59
59
|
end
|
60
60
|
end
|
61
|
+
#modulo--------------------------------------------------
|
62
|
+
class ModuleNode < BinaryNode
|
63
|
+
def initialize(left, right)
|
64
|
+
super(left,right)
|
65
|
+
end
|
61
66
|
|
67
|
+
def evaluate()
|
68
|
+
return @left.evaluate() % @right.evaluate()
|
69
|
+
end
|
70
|
+
end
|
71
|
+
#------------------------------------------------------------
|
62
72
|
|
63
73
|
class StoreNode < UnaryNode
|
64
|
-
#
|
65
74
|
def initialize(subTree)
|
66
75
|
super(subTree)
|
67
76
|
end
|
@@ -71,13 +80,59 @@ class StoreNode < UnaryNode
|
|
71
80
|
end
|
72
81
|
end
|
73
82
|
|
83
|
+
#plus---------------------------------
|
84
|
+
class PlusNode < UnaryNode
|
85
|
+
def initialize(subTree)
|
86
|
+
super(subTree)
|
87
|
+
end
|
88
|
+
def evaluate
|
89
|
+
$calc.memory =$calc.memory + subTree.evaluate()
|
90
|
+
end
|
91
|
+
end
|
92
|
+
#----------------------------------------
|
93
|
+
#minus-------------------------------------
|
94
|
+
class MinusNode < UnaryNode
|
95
|
+
def initialize(subTree)
|
96
|
+
super(subTree)
|
97
|
+
end
|
98
|
+
def evaluate
|
99
|
+
$calc.memory =$calc.memory - subTree.evaluate()
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
#----------------------------------------
|
74
104
|
class RecallNode
|
75
|
-
|
105
|
+
|
76
106
|
def evaluate
|
77
107
|
$calc.memory
|
78
108
|
end
|
79
109
|
end
|
80
|
-
|
110
|
+
#------------------------------------
|
111
|
+
|
112
|
+
class AssignableNode < UnaryNode
|
113
|
+
def initialize(valor1,nombre)
|
114
|
+
super(valor1)
|
115
|
+
@name=nombre
|
116
|
+
end
|
117
|
+
|
118
|
+
def evaluate
|
119
|
+
guardar=@subTree.evaluate()
|
120
|
+
$calc.addVar(@name,guardar)
|
121
|
+
return guardar
|
122
|
+
end
|
123
|
+
end
|
124
|
+
#-----------------------------------------
|
125
|
+
|
126
|
+
|
127
|
+
#C----------------------------------------
|
128
|
+
class ClearNode
|
129
|
+
def evaluate
|
130
|
+
$calc.memory=$calc.memory-$calc.memory#0
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
#----------------------------------------
|
135
|
+
|
81
136
|
class NumNode
|
82
137
|
def initialize(num) #
|
83
138
|
@num = num
|
data/lib/calculator.rb
CHANGED
@@ -7,6 +7,7 @@ class Calculator
|
|
7
7
|
|
8
8
|
def initialize()
|
9
9
|
@memory = 0
|
10
|
+
@varmap = Hash.new() #crea un mapax
|
10
11
|
end
|
11
12
|
|
12
13
|
def eval(expr)
|
@@ -14,4 +15,12 @@ class Calculator
|
|
14
15
|
ast = parser.parse()
|
15
16
|
return ast.evaluate()
|
16
17
|
end
|
18
|
+
|
19
|
+
def addVar(nombre,valor)
|
20
|
+
@varmap[nombre]=valor
|
21
|
+
end
|
22
|
+
def getVar(valor)
|
23
|
+
return @varmap[valor]
|
24
|
+
end
|
25
|
+
|
17
26
|
end
|
data/lib/parser.rb
CHANGED
@@ -8,7 +8,7 @@ class Parser
|
|
8
8
|
@scan = Scanner.new(istream)
|
9
9
|
#recibe un flujo de datos
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def parse()
|
13
13
|
return Prog()
|
14
14
|
end
|
@@ -32,21 +32,21 @@ class Parser
|
|
32
32
|
def Expr()
|
33
33
|
return RestExpr(Term())
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def RestExpr(e)
|
37
37
|
t = @scan.getToken()
|
38
38
|
#leo el token
|
39
39
|
|
40
40
|
if t.type == :add then
|
41
|
-
|
41
|
+
return RestExpr(AddNode.new(e,Term()))
|
42
42
|
end
|
43
43
|
|
44
44
|
if t.type == :sub then
|
45
45
|
return RestExpr(SubNode.new(e,Term()))
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
@scan.putBackToken()
|
49
|
-
|
49
|
+
|
50
50
|
|
51
51
|
return e
|
52
52
|
end
|
@@ -67,7 +67,7 @@ class Parser
|
|
67
67
|
# raise ParseError.new
|
68
68
|
RestTerm(Storable())
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def RestTerm(e)
|
72
72
|
|
73
73
|
# puts "RestTerm not implemented"
|
@@ -75,12 +75,15 @@ class Parser
|
|
75
75
|
#lo borramos
|
76
76
|
t = @scan.getToken
|
77
77
|
if t.type == :times
|
78
|
-
return RestTerm
|
78
|
+
return RestTerm(TimesNode.new(e, Storable()))
|
79
79
|
end
|
80
80
|
if t.type == :divide
|
81
81
|
#mira el tipo de token
|
82
82
|
return RestTerm(DivideNode.new(e, Storable()))
|
83
83
|
end
|
84
|
+
if t.type == :mod
|
85
|
+
return RestTerm(ModuleNode.new(e, Storable()))
|
86
|
+
end
|
84
87
|
@scan.putBackToken
|
85
88
|
|
86
89
|
return e
|
@@ -91,19 +94,44 @@ class Parser
|
|
91
94
|
# puts "Storable not implemented"
|
92
95
|
# raise ParseError.new # "Parse Error"
|
93
96
|
#lo borramos
|
94
|
-
|
95
|
-
|
97
|
+
#-------------------------------------------
|
98
|
+
# result=Factor()
|
99
|
+
# t = @scan.getToken
|
100
|
+
# if t.type== :keyword then
|
101
|
+
# if t.lex == "S" then
|
102
|
+
# return StoreNode.new(result)
|
103
|
+
#end
|
104
|
+
# puts "Expected S found: ",t.lex
|
105
|
+
# raise ParseError.new
|
106
|
+
# end
|
107
|
+
# @scan.putBackToken
|
108
|
+
# return result
|
109
|
+
# end
|
110
|
+
#----------------------------------------------------
|
111
|
+
return MemOperation(Factor())
|
112
|
+
end
|
113
|
+
#------------------------------------------------------
|
114
|
+
|
115
|
+
|
116
|
+
def MemOperation(result)
|
117
|
+
# result=Factor()
|
118
|
+
t= @scan.getToken
|
96
119
|
if t.type== :keyword then
|
97
120
|
if t.lex == "S" then
|
98
121
|
return StoreNode.new(result)
|
122
|
+
elsif t.lex == "P" then
|
123
|
+
return PlusNode.new(result)
|
124
|
+
elsif t.lex == "M" then
|
125
|
+
return MinusNode.new(result)
|
99
126
|
end
|
100
|
-
puts "Expected S found: ",t.lex
|
101
|
-
raise
|
127
|
+
puts "Expected S || P || M found: ",t.lex
|
128
|
+
raise ParseError
|
102
129
|
end
|
103
130
|
@scan.putBackToken
|
104
|
-
|
131
|
+
return result
|
105
132
|
end
|
106
133
|
|
134
|
+
|
107
135
|
def Factor()
|
108
136
|
|
109
137
|
# puts "Factor not implemented"
|
@@ -117,22 +145,43 @@ class Parser
|
|
117
145
|
if t.type == :keyword then
|
118
146
|
if t.lex == "R" then
|
119
147
|
return RecallNode.new
|
148
|
+
elsif t.lex == "C" then
|
149
|
+
return ClearNode.new
|
120
150
|
end
|
121
|
-
puts "Expected R found: " + t.lex
|
151
|
+
puts "Expected R || C found: " + t.lex
|
122
152
|
raise ParseError.new
|
123
153
|
end
|
124
154
|
if t.type == :lparen then
|
125
155
|
result = Expr()
|
126
156
|
t=@scan.getToken
|
127
|
-
|
128
157
|
if t.type == :rparen then
|
129
158
|
return result
|
130
159
|
end
|
131
|
-
|
132
160
|
puts "Expected ) found: " + t.type.to_s
|
133
161
|
raise ParseError.new
|
134
162
|
end
|
163
|
+
if t.type == :identifier then
|
164
|
+
return Assignable(t)
|
165
|
+
end
|
135
166
|
puts "Expected number,R ( found: " + t.type.to_s
|
136
167
|
raise ParseError
|
137
168
|
end
|
169
|
+
|
170
|
+
|
171
|
+
def Assignable(t)
|
172
|
+
r=@scan.getToken
|
173
|
+
if r.type == :Asignav
|
174
|
+
return assign(t)
|
175
|
+
end
|
176
|
+
nombre=t.lex
|
177
|
+
@scan.putBackToken
|
178
|
+
return NumNode.new($calc.getVar(nombre))
|
179
|
+
end
|
180
|
+
|
181
|
+
def assign(t)
|
182
|
+
result=Expr()
|
183
|
+
paso=result.evaluate()
|
184
|
+
nombre=t.lex
|
185
|
+
return AssignableNode.new(NumNode.new(paso), nombre)
|
138
186
|
end
|
187
|
+
end
|
data/lib/scanner.rb
CHANGED
@@ -7,7 +7,7 @@ class Scanner
|
|
7
7
|
def initialize(inStream)
|
8
8
|
@istream = inStream
|
9
9
|
#flujo de entrada
|
10
|
-
@keywords = Set.new(["S","R"])
|
10
|
+
@keywords = Set.new(["S","R","P","M","C","="])
|
11
11
|
@lineCount = 1
|
12
12
|
@colCount = -1
|
13
13
|
@needToken = true
|
@@ -44,7 +44,7 @@ class Scanner
|
|
44
44
|
column = @colCount
|
45
45
|
line = @lineCount
|
46
46
|
if isLetter(c) then state=1
|
47
|
-
|
47
|
+
#pregunta de que tipo de caracter
|
48
48
|
elsif isDigit(c) then state=2
|
49
49
|
elsif c == ?+ then state = 3
|
50
50
|
elsif c == ?- then state = 4
|
@@ -52,6 +52,8 @@ class Scanner
|
|
52
52
|
elsif c == ?/ then state = 6
|
53
53
|
elsif c == ?( then state = 7
|
54
54
|
elsif c == ?) then state = 8
|
55
|
+
elsif c == ?% then state = 9
|
56
|
+
elsif c == ?= then state = 10
|
55
57
|
elsif c == ?\n then
|
56
58
|
@colCount = -1
|
57
59
|
@lineCount = @lineCount+1
|
@@ -100,7 +102,15 @@ class Scanner
|
|
100
102
|
when 8
|
101
103
|
type = :rparen
|
102
104
|
foundOne = true
|
105
|
+
when 9
|
106
|
+
type = :mod
|
107
|
+
foundOne = true
|
108
|
+
when 10
|
109
|
+
type = :Asignav
|
110
|
+
foundOne = true
|
103
111
|
end
|
112
|
+
|
113
|
+
|
104
114
|
|
105
115
|
if !foundOne then
|
106
116
|
lex.concat(c)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calc_jgomez88
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kent D. Lee - Juan Francisco Cardona Mc-juan camilo gomez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: An calculator implementation on ruby
|
14
14
|
email: fcardona@eafit.edu.co-jgomez88@eafit.edu.co
|
@@ -44,7 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
44
44
|
version: '0'
|
45
45
|
requirements: []
|
46
46
|
rubyforge_project:
|
47
|
-
rubygems_version: 2.4.
|
47
|
+
rubygems_version: 2.4.8
|
48
48
|
signing_key:
|
49
49
|
specification_version: 4
|
50
50
|
summary: Another calculator in ruby
|