calc_jgomez88 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|