loxxy 0.0.14 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/README.md +7 -10
- data/lib/loxxy/back_end/engine.rb +1 -1
- data/lib/loxxy/datatype/number.rb +22 -6
- data/lib/loxxy/version.rb +1 -1
- data/spec/datatype/lx_string_spec.rb +5 -0
- data/spec/datatype/number_spec.rb +10 -0
- data/spec/interpreter_spec.rb +7 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7624afc97e5e8d3cee171dc9fbbe7a45c45698595109a5281d9f58fcaebd73ec
|
4
|
+
data.tar.gz: 67ec959b7758245f414314ea9c8b0a2bbf40a5e01133f17325fa40ab720858f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adcb9cf6b353b09cf623df330fbdff35255571f8781dfd0b46ea6ab32c02cf55bd0130f94414cd91aa8cb798b1ea7cd4aef4844acc556147b5e4b387d099b8c0
|
7
|
+
data.tar.gz: 47230281481b965fe1dddd74f763568a0ca125454800984c41fb29629d26c37ae8f7fa0320a38ca784abe605dfb5dc14f4a9c26b0d269240ea07c5e2feb6241b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
## [0.0.15] - 2021-01-11
|
2
|
+
- The interpreter can evaluate substraction between two numbers.
|
3
|
+
|
4
|
+
## Added
|
5
|
+
- Method `Datatype::Number#-` implmenting the subtraction operation
|
6
|
+
|
7
|
+
## Changed
|
8
|
+
- File `README.md` minor editorial changes.
|
9
|
+
- File `lx_string_spec.rb` Added test for string concatentation
|
10
|
+
- File `number_spec.rb` Added tests for addition and subtraction operations
|
11
|
+
- File `interpreter_spec.rb` Added tests for subtraction operation
|
12
|
+
|
13
|
+
## [0.0.14] - 2021-01-10
|
14
|
+
- The interpreter can evaluate addition of numbers and string concatenation
|
15
|
+
|
16
|
+
## Added
|
17
|
+
- Method `Ast::ASTVisitor::visit_binary_expr` for visiting binary expressions
|
18
|
+
- Method `Ast::LoxBinaryExpr#accept` for visitor pattern
|
19
|
+
- Method `BackEnd::Engine#after_binary_expr` to trigger execution of binary operator
|
20
|
+
- `Boolean` class hierarchy: added methos `true?` and `false?` to ease spec test writing
|
21
|
+
- Method `Datatype::LXString#+` implementation of the string concatenation
|
22
|
+
- Method `Datatype::Number#+` implementation of the addition of numbers
|
23
|
+
|
24
|
+
## Changed
|
25
|
+
- File `interpreter_spec.rb` Added tests for addition operation and string concatenation
|
26
|
+
|
27
|
+
|
1
28
|
## [0.0.13] - 2021-01-10
|
2
29
|
- The interpreter can evaluate directly simple literals.
|
3
30
|
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
[![Gem Version](https://badge.fury.io/rb/loxxy.svg)](https://badge.fury.io/rb/loxxy)
|
3
3
|
[![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat)](https://github.com/famished-tiger/loxxy/blob/main/LICENSE.txt)
|
4
4
|
|
5
|
-
|
5
|
+
### What is loxxy?
|
6
6
|
A Ruby implementation of the [Lox programming language](https://craftinginterpreters.com/the-lox-language.html ),
|
7
7
|
a simple language used in Bob Nystrom's online book [Crafting Interpreters](https://craftinginterpreters.com/ ).
|
8
8
|
|
@@ -16,7 +16,7 @@ a simple language used in Bob Nystrom's online book [Crafting Interpreters](http
|
|
16
16
|
The project is still in inception and the interpreter is being implemented...
|
17
17
|
Currently it can execute a tiny subset of __Lox__ language.
|
18
18
|
|
19
|
-
|
19
|
+
But the __loxxy__ gem hosts also a parser class `RawPaser` that can parse, in principle, any valid Lox input.
|
20
20
|
|
21
21
|
## What's the fuss about Lox?
|
22
22
|
... Nothing...
|
@@ -74,7 +74,7 @@ require 'loxxy'
|
|
74
74
|
|
75
75
|
lox = Loxxy::Interpreter.new
|
76
76
|
|
77
|
-
lox_program = '
|
77
|
+
lox_program = '47 - 5; // THE answer'
|
78
78
|
result = lox.evaluate(lox_program) # => Loxxy::Datatype::Number
|
79
79
|
|
80
80
|
# `result` is a Ruby object, so let's use it...
|
@@ -138,7 +138,6 @@ Here are the language features currently supported by the interpreter:
|
|
138
138
|
- [Operators and Special Chars](#operators-and-special-chars)
|
139
139
|
- [Datatypes](#datatypes)
|
140
140
|
- [Statements](#statements)
|
141
|
-
- `print` statement.
|
142
141
|
|
143
142
|
### Comments
|
144
143
|
|
@@ -166,6 +165,7 @@ The parser recognizes all the __Lox__ operators, delimiters and separators:
|
|
166
165
|
|
167
166
|
Of these, the interpreter implements:
|
168
167
|
`+` (addition of two numbers or string concatenation)
|
168
|
+
`-` (difference between two numbers)
|
169
169
|
|
170
170
|
#### Delimiters
|
171
171
|
The parser knows all the __Lox__ grouping delimiters:
|
@@ -183,19 +183,18 @@ The parser recognizes them all but the interpreter accepts the semicolons only.
|
|
183
183
|
|
184
184
|
### Datatypes
|
185
185
|
|
186
|
-
|
186
|
+
loxxy supports all the standard __Lox__ datatypes:
|
187
187
|
- `Boolean`: Can be `true` or `false`
|
188
188
|
- `Number`: Can be an integer or a floating-point numbers. For example: `123, 12.34, -45.67`
|
189
189
|
- `String`: Sequence of characters surrounded by `"`. For example: `"Hello!"`
|
190
190
|
- `Nil`: Used to define a null value, denoted by the `nil` keyword
|
191
191
|
|
192
|
-
All the Lox literals (booleans, numbers, strings and nil),
|
193
|
-
|
194
192
|
## Statements
|
195
193
|
### Implemented expressions
|
196
194
|
Loxxy implements expressions:
|
197
|
-
-
|
195
|
+
- Plain literals only; or,
|
198
196
|
- Addition of two numbers; or,
|
197
|
+
- Subtraction of two numbers; or,
|
199
198
|
- Concatenation of two strings
|
200
199
|
|
201
200
|
### Implemented statements
|
@@ -208,8 +207,6 @@ Loxxy implements the following statements:
|
|
208
207
|
print "Hello" + ", " + "world!";
|
209
208
|
```
|
210
209
|
|
211
|
-
|
212
|
-
|
213
210
|
## Installation
|
214
211
|
|
215
212
|
Add this line to your application's Gemfile:
|
@@ -24,16 +24,32 @@ module Loxxy
|
|
24
24
|
|
25
25
|
# Perform the addition of two Lox numbers or
|
26
26
|
# one Lox number and a Ruby Numeric
|
27
|
-
# @param
|
27
|
+
# @param other [Loxxy::Datatype::Number, Numeric]
|
28
28
|
# @return [Loxxy::Datatype::Number]
|
29
|
-
def +(
|
30
|
-
case
|
29
|
+
def +(other)
|
30
|
+
case other
|
31
|
+
when Number
|
32
|
+
self.class.new(value + other.value)
|
33
|
+
when Numeric
|
34
|
+
self.class.new(value + other)
|
35
|
+
else
|
36
|
+
err_msg = "`+': #{other.class} can't be coerced into #{self.class} (TypeError)"
|
37
|
+
raise TypeError, err_msg
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Perform the subtraction of two Lox numbers or
|
42
|
+
# one Lox number and a Ruby Numeric
|
43
|
+
# @param other [Loxxy::Datatype::Number, Numeric]
|
44
|
+
# @return [Loxxy::Datatype::Number]
|
45
|
+
def -(other)
|
46
|
+
case other
|
31
47
|
when Number
|
32
|
-
self.class.new(value
|
48
|
+
self.class.new(value - other.value)
|
33
49
|
when Numeric
|
34
|
-
self.class.new(value
|
50
|
+
self.class.new(value - other)
|
35
51
|
else
|
36
|
-
err_msg = "
|
52
|
+
err_msg = "`-': #{other.class} can't be coerced into #{self.class} (TypeError)"
|
37
53
|
raise TypeError, err_msg
|
38
54
|
end
|
39
55
|
end
|
data/lib/loxxy/version.rb
CHANGED
@@ -51,6 +51,11 @@ module Loxxy
|
|
51
51
|
result = subject == ''
|
52
52
|
expect(result).to be_false
|
53
53
|
end
|
54
|
+
|
55
|
+
it 'performs the concatenation with another string' do
|
56
|
+
concatenation = LXString.new('str') + LXString.new('ing')
|
57
|
+
expect(concatenation == 'string').to be_true
|
58
|
+
end
|
54
59
|
end
|
55
60
|
end # describe
|
56
61
|
end # module
|
@@ -41,6 +41,16 @@ module Loxxy
|
|
41
41
|
it 'should give its display representation' do
|
42
42
|
expect(subject.to_str).to eq(sample_value.to_s)
|
43
43
|
end
|
44
|
+
|
45
|
+
it 'should compute the addition with another number' do
|
46
|
+
addition = subject + Number.new(10)
|
47
|
+
expect(addition == -2.34).to be_true
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should compute the subtraction with another number' do
|
51
|
+
subtraction = subject - Number.new(10)
|
52
|
+
expect(subtraction == -22.34).to be_true
|
53
|
+
end
|
44
54
|
end
|
45
55
|
end # describe
|
46
56
|
end # module
|
data/spec/interpreter_spec.rb
CHANGED
@@ -33,12 +33,18 @@ module Loxxy
|
|
33
33
|
expect(result).to be_kind_of(Loxxy::Datatype::True)
|
34
34
|
end
|
35
35
|
|
36
|
-
it 'should evaluate
|
36
|
+
it 'should evaluate an addition of two numbers' do
|
37
37
|
result = subject.evaluate('123 + 456; // => 579')
|
38
38
|
expect(result).to be_kind_of(Loxxy::Datatype::Number)
|
39
39
|
expect(result == 579).to be_true
|
40
40
|
end
|
41
41
|
|
42
|
+
it 'should evaluate a substraction of two numbers' do
|
43
|
+
result = subject.evaluate('4 - 3; // => 1')
|
44
|
+
expect(result).to be_kind_of(Loxxy::Datatype::Number)
|
45
|
+
expect(result == 1).to be_true
|
46
|
+
end
|
47
|
+
|
42
48
|
it 'should evaluate string concatenation' do
|
43
49
|
result = subject.evaluate('"str" + "ing"; // => "string"')
|
44
50
|
expect(result).to be_kind_of(Loxxy::Datatype::LXString)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loxxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rley
|