ascode 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ascode/functions.md +5 -2
- data/lib/ascode/interpreter.rb +23 -6
- data/lib/ascode/parser.rb +28 -17
- data/lib/ascode.rb +1 -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: 8673a2b92556eee81f6f27f3cdf04715439084468ab40a30df31c3aff7f8e355
|
4
|
+
data.tar.gz: 804972be81f40132cb5c8625aec8fcf974937a5c3b4bdef0bd91f1b5265b6524
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08979b039e095c115dc5e7a62c0faef24d79e2df1716c32f4c2068eeb3f45bd98d069badd5760991db715abc2656e057b6cba346f74feb386059610b47d25c98'
|
7
|
+
data.tar.gz: 6a2202d1f503b9a32347aaf5c844101880a0aa9ff793718296ae38526e08ad1909b664fe3717a75f60c5ae85487544115464d01f974641a754477c194d4974cd
|
data/lib/ascode/functions.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
|
1
|
+
Character|Name|`pop`s|`push`es|Description
|
2
2
|
---|---|---|---|---
|
3
|
-
|
3
|
+
`>`|`output`|`a`||Prints `a` to stdout
|
4
4
|
`^`|`pop`|`a`||
|
5
5
|
`+`|`plus`|`a`, `b`|`c`|`c` = `a` + `b`
|
6
6
|
`-`|`minus`|`a`, `b`|`c`|`c` = `a` - `b`
|
7
7
|
`/`|`divide`|`a`, `b`|`c`|`c` = `a` / `b`
|
8
8
|
`*`|`multiply`|`a`, `b`|`c`|`c` = `a` * `b`
|
9
|
+
`ê`|`even`|`a`|`b`|`b` = `1` if `a` is even, `0` otherwise
|
10
|
+
`↺`|`invert`|`a`|`b`|`b` = `1` if `a` = `0`, otherwise `0`
|
11
|
+
`±`|`change_sign`|`a`|`b`|`b` = `-1` * `a`
|
data/lib/ascode/interpreter.rb
CHANGED
@@ -38,21 +38,38 @@ module Ascode
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def minus
|
41
|
-
a = pop
|
42
|
-
b = pop
|
41
|
+
a = pop
|
42
|
+
b = pop
|
43
43
|
push a - b
|
44
44
|
end
|
45
45
|
|
46
46
|
def divide
|
47
|
-
a = pop
|
48
|
-
b = pop
|
47
|
+
a = pop
|
48
|
+
b = pop
|
49
49
|
push a / b
|
50
50
|
end
|
51
51
|
|
52
52
|
def multiply
|
53
|
-
a = pop
|
54
|
-
b = pop
|
53
|
+
a = pop
|
54
|
+
b = pop
|
55
55
|
push a * b
|
56
56
|
end
|
57
|
+
|
58
|
+
def even
|
59
|
+
push pop.even? ? 1 : 0
|
60
|
+
end
|
61
|
+
|
62
|
+
def invert
|
63
|
+
a = pop
|
64
|
+
if a.zero?
|
65
|
+
push 1
|
66
|
+
else
|
67
|
+
push 0
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def change_sign
|
72
|
+
push(-1 * pop)
|
73
|
+
end
|
57
74
|
end
|
58
75
|
end
|
data/lib/ascode/parser.rb
CHANGED
@@ -10,27 +10,39 @@ module Ascode
|
|
10
10
|
def parse
|
11
11
|
@ast = []
|
12
12
|
@push_buffer = false
|
13
|
+
@implicit_output = true
|
13
14
|
|
14
15
|
@code.split('').to_enum.each do |char|
|
15
16
|
parse_character char
|
16
17
|
end
|
17
|
-
|
18
|
+
ast_add_buffer
|
19
|
+
|
20
|
+
ast_add_action 'output' if @implicit_output
|
18
21
|
|
19
22
|
@ast
|
20
23
|
end
|
21
24
|
|
22
25
|
def parse_character(char)
|
23
26
|
if char =~ /[\w.,:;!?]/
|
24
|
-
|
27
|
+
buffer_push char
|
25
28
|
elsif char == ' '
|
26
|
-
|
29
|
+
ast_add_buffer
|
27
30
|
else
|
28
|
-
|
31
|
+
ast_add_buffer
|
29
32
|
parse_function char
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
|
-
def
|
36
|
+
def parse_function(char)
|
37
|
+
function = @fun.csv_data.to_enum.find do |value|
|
38
|
+
value[:short] == char
|
39
|
+
end
|
40
|
+
|
41
|
+
puts '[Error] Unexpected identifier: \'' + char + '\'' unless function
|
42
|
+
ast_add_action function[:long]
|
43
|
+
end
|
44
|
+
|
45
|
+
def buffer_push(char)
|
34
46
|
if @push_buffer
|
35
47
|
@push_buffer += char
|
36
48
|
else
|
@@ -38,23 +50,22 @@ module Ascode
|
|
38
50
|
end
|
39
51
|
end
|
40
52
|
|
41
|
-
def
|
42
|
-
|
43
|
-
add_action 'push', @push_buffer
|
44
|
-
@push_buffer = false
|
45
|
-
end
|
46
|
-
end
|
53
|
+
def ast_add_buffer
|
54
|
+
return unless @push_buffer
|
47
55
|
|
48
|
-
|
49
|
-
|
50
|
-
|
56
|
+
if @push_buffer =~ /^[0-9]+$/
|
57
|
+
@push_buffer = @push_buffer.to_i
|
58
|
+
elsif @push_buffer =~ /^[0-9.]+$/
|
59
|
+
@push_buffer = @push_buffer.to_f
|
51
60
|
end
|
52
61
|
|
53
|
-
|
54
|
-
|
62
|
+
ast_add_action 'push', @push_buffer
|
63
|
+
@push_buffer = false
|
55
64
|
end
|
56
65
|
|
57
|
-
def
|
66
|
+
def ast_add_action(name, what = nil)
|
67
|
+
@implicit_output = false if name == 'output'
|
68
|
+
|
58
69
|
data = { action: name }
|
59
70
|
data[:what] = what if what
|
60
71
|
@ast.push data
|
data/lib/ascode.rb
CHANGED
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.0.
|
4
|
+
version: 0.0.9
|
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-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|