loxxy 0.1.11 → 0.1.12
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/CHANGELOG.md +18 -5
- data/lib/loxxy/ast/ast_builder.rb +1 -1
- data/lib/loxxy/back_end/engine.rb +2 -0
- data/lib/loxxy/back_end/lox_class.rb +12 -2
- data/lib/loxxy/back_end/lox_function.rb +0 -1
- data/lib/loxxy/back_end/lox_instance.rb +31 -0
- data/lib/loxxy/version.rb +1 -1
- data/spec/interpreter_spec.rb +14 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 665b2f201c4e369bb46b4b62cd8398f8d1f6f563b073fb6e1595b767f306c627
|
4
|
+
data.tar.gz: 7bd3ca2024f2f05150d3fd8af9cdaee28d6dc4d2bbe48ebfe6ae9fd78166fc7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cffb636754ac0140aa7873955c75d8e6a048a0806cacf22484de91bacecb4fdb7d55127f7ff6e2f5602ff02f1eb9f24de788a6be0053768c68f12b9cdd0caab
|
7
|
+
data.tar.gz: 331fb47a8a46a9ea6a086556814b95aba7d7a4d7a3c600f82acacfd38dd567c657ca79f6ce683e17e64e8104167692a2b49e7628bac9d8536a5bd0625ceab347
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## [0.1.12] - 2021-04-03
|
2
|
+
- Intermediate version: `Loxxy` does instance creation (default constructor)
|
3
|
+
|
4
|
+
### New
|
5
|
+
- Method `BackEnd::LoxClass#call` made class callable (for invoking the constructor)
|
6
|
+
- Class `BackEnd::LoxInstance` runtime representation of a Lox instance (object).
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
- Method `BackEnd::Engine#after_call_expr` Added Lox class as callable thing.
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
- Method `Ast::ASTBuilder#reduce_class_body` couldn't handle properly empty classes
|
13
|
+
|
1
14
|
## [0.1.11] - 2021-04-03
|
2
15
|
- Intermediate version: `Loxxy` does class declarations
|
3
16
|
|
@@ -13,9 +26,9 @@
|
|
13
26
|
- Method `BackEnd::Engine#after_class_stmt`
|
14
27
|
- Method `BackEnd::Resolver#after_class_stmt`
|
15
28
|
- Method `BackEnd::Resolver#before_class_stmt`
|
16
|
-
- Class `BackEnd::LoxClass`
|
29
|
+
- Class `BackEnd::LoxClass` runtime representation of a Lox class.
|
17
30
|
|
18
|
-
###
|
31
|
+
### Changed
|
19
32
|
- File `grammar.rb` refactoring of class declaration syntax rules
|
20
33
|
|
21
34
|
## [0.1.10] - 2021-03-31
|
@@ -28,7 +41,7 @@
|
|
28
41
|
## [0.1.09] - 2021-03-28
|
29
42
|
- Fix and test suite for return statements
|
30
43
|
|
31
|
-
###
|
44
|
+
### CHANGED
|
32
45
|
- `Loxxy` reports an error when a return statement occurs in top-level scope
|
33
46
|
|
34
47
|
### Fixed
|
@@ -40,7 +53,7 @@
|
|
40
53
|
### New
|
41
54
|
- Class `BackEnd::Resolver` implements the variable resolution (whenever a variable is in use, locate the declaration of that variable)
|
42
55
|
|
43
|
-
###
|
56
|
+
### CHANGED
|
44
57
|
- Class `Ast::Visitor` changes in some method signatures
|
45
58
|
- Class `BackEnd::Engine` new attribute `resolver` that points to a `BackEnd::Resolver` instance
|
46
59
|
- Class `BackEnd::Engine` several methods dealing with variables have been adapted to take the resolver into account.
|
@@ -132,7 +145,7 @@
|
|
132
145
|
- Method `BackEnd::Engine#after_fun_stmt`
|
133
146
|
- Method `BackEnd::NativeFunction#call`
|
134
147
|
- Method `BackEnd::NativeFunction#to_str`
|
135
|
-
- Method `BackEnd::LoxFunction`
|
148
|
+
- Method `BackEnd::LoxFunction` runtime representation of a Lox function.
|
136
149
|
|
137
150
|
### Changed
|
138
151
|
- Method `BackEnd::Engine#after_call_expr`
|
@@ -175,7 +175,7 @@ module Loxxy
|
|
175
175
|
|
176
176
|
# rule('class_body' => 'LEFT_BRACE methods_opt RIGHT_BRACE')
|
177
177
|
def reduce_class_body(_production, _range, _tokens, theChildren)
|
178
|
-
theChildren[1]
|
178
|
+
theChildren[1].nil? ? [] : theChildren[1]
|
179
179
|
end
|
180
180
|
|
181
181
|
# rule('method_plus' => 'method_plus function')
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../datatype/all_datatypes'
|
4
|
+
require_relative 'lox_instance'
|
4
5
|
|
5
6
|
module Loxxy
|
6
7
|
module BackEnd
|
7
|
-
#
|
8
|
+
# Runtime representation of a Lox class.
|
8
9
|
class LoxClass
|
9
10
|
# @return [String] The name of the class
|
10
11
|
attr_reader :name
|
@@ -25,6 +26,15 @@ module Loxxy
|
|
25
26
|
stack.push self
|
26
27
|
end
|
27
28
|
|
29
|
+
def arity
|
30
|
+
0
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(engine, _visitor)
|
34
|
+
instance = LoxInstance.new(self, engine)
|
35
|
+
engine.stack.push(instance)
|
36
|
+
end
|
37
|
+
|
28
38
|
# Logical negation.
|
29
39
|
# As a function is a truthy thing, its negation is thus false.
|
30
40
|
# @return [Datatype::False]
|
@@ -32,7 +42,7 @@ module Loxxy
|
|
32
42
|
Datatype::False.instance
|
33
43
|
end
|
34
44
|
|
35
|
-
# Text representation of a Lox
|
45
|
+
# Text representation of a Lox class
|
36
46
|
def to_str
|
37
47
|
name
|
38
48
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../datatype/all_datatypes'
|
4
|
+
|
5
|
+
module Loxxy
|
6
|
+
module BackEnd
|
7
|
+
# Runtime representation of a Lox object (instance).
|
8
|
+
class LoxInstance
|
9
|
+
# @return BackEnd::LoxClass] the class this this object belong
|
10
|
+
attr_reader :klass
|
11
|
+
|
12
|
+
attr_reader :stack
|
13
|
+
|
14
|
+
# Create an instance from given class
|
15
|
+
# @param aClass [BackEnd::LoxClass] the class this this object belong
|
16
|
+
def initialize(aClass, anEngine)
|
17
|
+
@klass = aClass
|
18
|
+
@stack = anEngine.stack
|
19
|
+
end
|
20
|
+
|
21
|
+
def accept(_visitor)
|
22
|
+
stack.push self
|
23
|
+
end
|
24
|
+
|
25
|
+
# Text representation of a Lox instance
|
26
|
+
def to_str
|
27
|
+
"#{klass.to_str} instance"
|
28
|
+
end
|
29
|
+
end # class
|
30
|
+
end # module
|
31
|
+
end # module
|
data/lib/loxxy/version.rb
CHANGED
data/spec/interpreter_spec.rb
CHANGED
@@ -468,6 +468,20 @@ LOX_END
|
|
468
468
|
expect(sample_cfg[:ostream].string).to eq('Duck')
|
469
469
|
end
|
470
470
|
|
471
|
+
it 'should support instance creation' do
|
472
|
+
program = <<-LOX_END
|
473
|
+
class Duck {
|
474
|
+
quack() {
|
475
|
+
print "quack";
|
476
|
+
}
|
477
|
+
}
|
478
|
+
var daffy = Duck();
|
479
|
+
print daffy;
|
480
|
+
LOX_END
|
481
|
+
expect { subject.evaluate(program) }.not_to raise_error
|
482
|
+
expect(sample_cfg[:ostream].string).to eq('Duck instance')
|
483
|
+
end
|
484
|
+
|
471
485
|
it 'should print the hello world message' do
|
472
486
|
program = <<-LOX_END
|
473
487
|
var greeting = "Hello"; // Declaring a variable
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loxxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- lib/loxxy/back_end/environment.rb
|
117
117
|
- lib/loxxy/back_end/lox_class.rb
|
118
118
|
- lib/loxxy/back_end/lox_function.rb
|
119
|
+
- lib/loxxy/back_end/lox_instance.rb
|
119
120
|
- lib/loxxy/back_end/resolver.rb
|
120
121
|
- lib/loxxy/back_end/symbol_table.rb
|
121
122
|
- lib/loxxy/back_end/unary_operator.rb
|