ascode 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ascode/interpreter/condition.rb +14 -0
- data/lib/ascode/interpreter/environment.rb +28 -0
- data/lib/ascode/interpreter/io.rb +15 -0
- data/lib/ascode/interpreter/main.rb +43 -0
- data/lib/ascode/interpreter/math.rb +46 -0
- data/lib/ascode/parser/function.rb +4 -2
- data/lib/ascode/parser/functions.md +15 -15
- data/lib/ascode/parser/main.rb +3 -2
- data/lib/ascode.rb +2 -2
- metadata +7 -3
- data/lib/ascode/interpreter.rb +0 -99
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5f4408a0db6f51c967a99742111084fa89aac0c41237313ccbfed61e9d64fe6
|
4
|
+
data.tar.gz: b1ff0ca8a235111caaa549b768f0d4444480e3d15910c8585e6029b71f44f0bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fae634110d25627412c71d7d30f6c87cea3f37764db75149f937387f82b03250306d6822cb9482f8e99ce8415fd0fc2eab80366fca99a00e1b945f83d1a94b31
|
7
|
+
data.tar.gz: af4ffcf2b5779e69583d54e935dbfcc7ffa0aad67d76d2b3694e00b743566aee3ede7c0f748a7908867e85ee93d6cc4996bd87ed10cde69a593a402a27106bbe
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ascode
|
2
|
+
module Interpreter
|
3
|
+
class Condition
|
4
|
+
def self.begin(env, true_ast, false_ast)
|
5
|
+
condition = env.pop
|
6
|
+
ast = condition.nil? || !condition || condition.zero? ? false_ast : true_ast
|
7
|
+
|
8
|
+
(Main.new ast, env).run
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.end(_); end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative "io"
|
2
|
+
|
3
|
+
module Ascode
|
4
|
+
module Interpreter
|
5
|
+
class Environment
|
6
|
+
attr_accessor :ast, :stack
|
7
|
+
|
8
|
+
def initialize(ast = "")
|
9
|
+
@ast = ast
|
10
|
+
@stack = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def push(what)
|
14
|
+
@stack.push what
|
15
|
+
end
|
16
|
+
|
17
|
+
def pop(ask = true)
|
18
|
+
value = @stack.pop
|
19
|
+
if value
|
20
|
+
value
|
21
|
+
elsif ask
|
22
|
+
IO.input itself
|
23
|
+
@stack.pop
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative "environment"
|
2
|
+
require_relative "condition"
|
3
|
+
require_relative "math"
|
4
|
+
require_relative "io"
|
5
|
+
|
6
|
+
module Ascode
|
7
|
+
module Interpreter
|
8
|
+
class Main
|
9
|
+
def initialize(ast, env = Environment.new)
|
10
|
+
@env = env
|
11
|
+
@env.ast = ast
|
12
|
+
|
13
|
+
@map = {
|
14
|
+
"io" => IO,
|
15
|
+
"math" => Math,
|
16
|
+
"condition" => Condition
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
@env.ast.each do |action|
|
22
|
+
name = action[:action]
|
23
|
+
|
24
|
+
if name == "push"
|
25
|
+
@env.push(action[:what])
|
26
|
+
elsif name == "condition"
|
27
|
+
Condition.begin @env, action[:true_block], action[:false_block]
|
28
|
+
else
|
29
|
+
call action[:type], name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def call(type, name)
|
35
|
+
if type == "env"
|
36
|
+
@env.send name
|
37
|
+
else
|
38
|
+
@map[type].send name, @env
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Ascode
|
2
|
+
module Interpreter
|
3
|
+
class Math
|
4
|
+
def self.plus(env)
|
5
|
+
a = env.pop
|
6
|
+
b = env.pop
|
7
|
+
env.push a + b
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.minus(env)
|
11
|
+
a = env.pop
|
12
|
+
b = env.pop
|
13
|
+
env.push a - b
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.divide(env)
|
17
|
+
a = env.pop
|
18
|
+
b = env.pop
|
19
|
+
env.push a / b
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.multiply(env)
|
23
|
+
a = env.pop
|
24
|
+
b = env.pop
|
25
|
+
env.push a * b
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.even(env)
|
29
|
+
env.push env.pop.even? ? 1 : 0
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.invert(env)
|
33
|
+
a = env.pop
|
34
|
+
if a.zero?
|
35
|
+
env.push 1
|
36
|
+
else
|
37
|
+
env.push 0
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.change_sign(env)
|
42
|
+
env.push(-1 * env.pop)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -20,9 +20,10 @@ module Ascode
|
|
20
20
|
value[:short] == char
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
return unless function
|
24
24
|
|
25
25
|
{
|
26
|
+
type: function[:type],
|
26
27
|
action: function[:long]
|
27
28
|
}
|
28
29
|
end
|
@@ -33,7 +34,8 @@ module Ascode
|
|
33
34
|
|
34
35
|
@csv_data.push(
|
35
36
|
short: clear_quotes(src[0]),
|
36
|
-
|
37
|
+
type: clear_quotes(src[1]),
|
38
|
+
long: clear_quotes(src[2])
|
37
39
|
)
|
38
40
|
end
|
39
41
|
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
Character|Name|`pop`s|`push`es|Description
|
2
|
-
|
3
|
-
`I`|`input`||`a`|`stdin` -> `a`
|
4
|
-
`O`|`output`|`a`||`a` -> `stdout`
|
5
|
-
`P`|`pop`|`a`||
|
6
|
-
`[`|`
|
7
|
-
`:`|`
|
8
|
-
`]`|`
|
9
|
-
`+`|`plus`|`a`, `b`|`c`|`c` = `a` + `b`
|
10
|
-
`-`|`minus`|`a`, `b`|`c`|`c` = `a` - `b`
|
11
|
-
`/`|`divide`|`a`, `b`|`c`|`c` = `a` / `b`
|
12
|
-
`*`|`multiply`|`a`, `b`|`c`|`c` = `a` * `b`
|
13
|
-
`e`|`even`|`a`|`b`|`b` = `1` if `a` is even, `0` otherwise
|
14
|
-
`!`|`invert`|`a`|`b`|`b` = `1` if `a` = `0`, otherwise `0`
|
15
|
-
`s`|`change_sign`|`a`|`b`|`b` = `-1` * `a`
|
1
|
+
Character|Type|Name|`pop`s|`push`es|Description
|
2
|
+
---|---|---|---|---|---
|
3
|
+
`I`|`io`|`input`||`a`|`stdin` -> `a`
|
4
|
+
`O`|`io`|`output`|`a`||`a` -> `stdout`
|
5
|
+
`P`|`env`|`pop`|`a`||
|
6
|
+
`[`|`condition`|`begin`|`a`|| If `a` = `0`, `nil` or `false`, then part after `:` is executed
|
7
|
+
`:`|`condition`|`else`|||
|
8
|
+
`]`|`condition`|`end`|||
|
9
|
+
`+`|`math`|`plus`|`a`, `b`|`c`|`c` = `a` + `b`
|
10
|
+
`-`|`math`|`minus`|`a`, `b`|`c`|`c` = `a` - `b`
|
11
|
+
`/`|`math`|`divide`|`a`, `b`|`c`|`c` = `a` / `b`
|
12
|
+
`*`|`math`|`multiply`|`a`, `b`|`c`|`c` = `a` * `b`
|
13
|
+
`e`|`math`|`even`|`a`|`b`|`b` = `1` if `a` is even, `0` otherwise
|
14
|
+
`!`|`math`|`invert`|`a`|`b`|`b` = `1` if `a` = `0`, otherwise `0`
|
15
|
+
`s`|`math`|`change_sign`|`a`|`b`|`b` = `-1` * `a`
|
data/lib/ascode/parser/main.rb
CHANGED
@@ -26,7 +26,7 @@ module Ascode
|
|
26
26
|
character char, index
|
27
27
|
end
|
28
28
|
|
29
|
-
@ast.push(action: "output") if @implicit_output
|
29
|
+
@ast.push(type: "io", action: "output") if @implicit_output
|
30
30
|
|
31
31
|
@ast
|
32
32
|
end
|
@@ -44,7 +44,7 @@ module Ascode
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def literal(index, num)
|
47
|
-
add = num ?
|
47
|
+
add = num ? -1 : 1
|
48
48
|
|
49
49
|
literal = Literal.new @code, index
|
50
50
|
@ast.push literal.parse
|
@@ -59,6 +59,7 @@ module Ascode
|
|
59
59
|
|
60
60
|
def function(char)
|
61
61
|
function = @function.parse char
|
62
|
+
return unless function
|
62
63
|
@implicit_output = false if function[:action] == "output"
|
63
64
|
@ast.push function
|
64
65
|
end
|
data/lib/ascode.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative "ascode/interpreter"
|
1
|
+
require_relative "ascode/interpreter/main"
|
2
2
|
require_relative "ascode/parser/main"
|
3
3
|
|
4
4
|
module Ascode
|
@@ -6,7 +6,7 @@ module Ascode
|
|
6
6
|
parser = Parser::Main.new code
|
7
7
|
ast = parser.parse
|
8
8
|
|
9
|
-
interpreter = Interpreter.new ast
|
9
|
+
interpreter = Interpreter::Main.new ast
|
10
10
|
interpreter.run
|
11
11
|
end
|
12
12
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ascode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Varaksa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Esoteric golfing language. In active development, so behavior may be
|
14
14
|
changed without prior notice.
|
@@ -21,7 +21,11 @@ files:
|
|
21
21
|
- README.md
|
22
22
|
- lib/ascode.rb
|
23
23
|
- lib/ascode/converter.rb
|
24
|
-
- lib/ascode/interpreter.rb
|
24
|
+
- lib/ascode/interpreter/condition.rb
|
25
|
+
- lib/ascode/interpreter/environment.rb
|
26
|
+
- lib/ascode/interpreter/io.rb
|
27
|
+
- lib/ascode/interpreter/main.rb
|
28
|
+
- lib/ascode/interpreter/math.rb
|
25
29
|
- lib/ascode/parser/condition_block.rb
|
26
30
|
- lib/ascode/parser/function.rb
|
27
31
|
- lib/ascode/parser/functions.md
|
data/lib/ascode/interpreter.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
require_relative "converter"
|
2
|
-
|
3
|
-
module Ascode
|
4
|
-
class Interpreter
|
5
|
-
def initialize(ast, stack = [])
|
6
|
-
@ast = ast
|
7
|
-
|
8
|
-
@stack = stack
|
9
|
-
end
|
10
|
-
|
11
|
-
def run
|
12
|
-
@ast.each do |action|
|
13
|
-
name = action[:action]
|
14
|
-
|
15
|
-
if name == "push"
|
16
|
-
push(action[:what])
|
17
|
-
elsif name == "condition"
|
18
|
-
condition_begin action[:true_block], action[:false_block]
|
19
|
-
else
|
20
|
-
send(name)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def push(what)
|
26
|
-
@stack.push what
|
27
|
-
end
|
28
|
-
|
29
|
-
def pop(ask = true)
|
30
|
-
value = @stack.pop
|
31
|
-
if value
|
32
|
-
value
|
33
|
-
elsif ask
|
34
|
-
input
|
35
|
-
@stack.pop
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def input
|
40
|
-
push Converter.convert gets
|
41
|
-
end
|
42
|
-
|
43
|
-
def output
|
44
|
-
puts pop(false)
|
45
|
-
end
|
46
|
-
|
47
|
-
def condition_begin(true_ast, false_ast)
|
48
|
-
condition = pop
|
49
|
-
ast = condition.nil? || !condition || condition.zero? ? false_ast : true_ast
|
50
|
-
|
51
|
-
(Interpreter.new ast, @stack).run
|
52
|
-
end
|
53
|
-
|
54
|
-
def condition_else; end
|
55
|
-
|
56
|
-
def condition_end; end
|
57
|
-
|
58
|
-
def plus
|
59
|
-
a = pop
|
60
|
-
b = pop
|
61
|
-
push a + b
|
62
|
-
end
|
63
|
-
|
64
|
-
def minus
|
65
|
-
a = pop
|
66
|
-
b = pop
|
67
|
-
push a - b
|
68
|
-
end
|
69
|
-
|
70
|
-
def divide
|
71
|
-
a = pop
|
72
|
-
b = pop
|
73
|
-
push a / b
|
74
|
-
end
|
75
|
-
|
76
|
-
def multiply
|
77
|
-
a = pop
|
78
|
-
b = pop
|
79
|
-
push a * b
|
80
|
-
end
|
81
|
-
|
82
|
-
def even
|
83
|
-
push pop.even? ? 1 : 0
|
84
|
-
end
|
85
|
-
|
86
|
-
def invert
|
87
|
-
a = pop
|
88
|
-
if a.zero?
|
89
|
-
push 1
|
90
|
-
else
|
91
|
-
push 0
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def change_sign
|
96
|
-
push(-1 * pop)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|