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 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: