ascode 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9aece182feab64b111905b9b6e7726bd9740bf2ec70b73a3db768c648d84d828
4
- data.tar.gz: 51e28b6149fec7fd287ca800c125be7a5756b92c445687a0fa901fe00c4539a6
3
+ metadata.gz: 8673a2b92556eee81f6f27f3cdf04715439084468ab40a30df31c3aff7f8e355
4
+ data.tar.gz: 804972be81f40132cb5c8625aec8fcf974937a5c3b4bdef0bd91f1b5265b6524
5
5
  SHA512:
6
- metadata.gz: 10b757893cac2833915eb3a70cc79c47917a2dcbe676fca054c473b5e2dde3e36d8082827399b6a6bc6d16242ff816b55b38d2d841d1bcfcf5a8b35a9f27a1eb
7
- data.tar.gz: 9f84e46035edb327d7e00da64fb08a28078a54282610308b9032a7f46c782cce084adce6d8039b4a886a2de575df5a80338723c46c6d6f4ffed1bf9f7d8109cd
6
+ metadata.gz: '08979b039e095c115dc5e7a62c0faef24d79e2df1716c32f4c2068eeb3f45bd98d069badd5760991db715abc2656e057b6cba346f74feb386059610b47d25c98'
7
+ data.tar.gz: 6a2202d1f503b9a32347aaf5c844101880a0aa9ff793718296ae38526e08ad1909b664fe3717a75f60c5ae85487544115464d01f974641a754477c194d4974cd
@@ -1,8 +1,11 @@
1
- Short|Long|`pop`s|`push`es|Description
1
+ Character|Name|`pop`s|`push`es|Description
2
2
  ---|---|---|---|---
3
- `➤`|`output`|`a`||Prints `a` to stdout
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`
@@ -38,21 +38,38 @@ module Ascode
38
38
  end
39
39
 
40
40
  def minus
41
- a = pop.to_f
42
- b = pop.to_f
41
+ a = pop
42
+ b = pop
43
43
  push a - b
44
44
  end
45
45
 
46
46
  def divide
47
- a = pop.to_f
48
- b = pop.to_f
47
+ a = pop
48
+ b = pop
49
49
  push a / b
50
50
  end
51
51
 
52
52
  def multiply
53
- a = pop.to_f
54
- b = pop.to_f
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
- add_push_buffer
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
- parse_push char
27
+ buffer_push char
25
28
  elsif char == ' '
26
- add_push_buffer
29
+ ast_add_buffer
27
30
  else
28
- add_push_buffer
31
+ ast_add_buffer
29
32
  parse_function char
30
33
  end
31
34
  end
32
35
 
33
- def parse_push(char)
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 add_push_buffer
42
- if @push_buffer
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
- def parse_function(char)
49
- function = @fun.csv_data.to_enum.find do |value|
50
- value[:short] == char
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
- puts '[Error] Unexpected identifier: \'' + char + '\'' unless function
54
- add_action function[:long]
62
+ ast_add_action 'push', @push_buffer
63
+ @push_buffer = false
55
64
  end
56
65
 
57
- def add_action(name, what = nil)
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
@@ -12,4 +12,4 @@ module Ascode
12
12
  end
13
13
 
14
14
  # Test
15
- Ascode.run('st Te+➤ 5 5*➤')
15
+ Ascode.run('5 5*ê↺5*±')
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.8
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-13 00:00:00.000000000 Z
11
+ date: 2018-01-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: