alphalang 0.2.6 → 0.2.7

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: 6dbe6c0cb099f96c68feadb26492b409cdb71d2db52fd5e6436a6c142d273584
4
- data.tar.gz: 215b6ea3d011610dbdb3d2021025c29361df8d6cc4dba74a7a8dabf0d7596fdb
3
+ metadata.gz: 03e9f2d6c36766c890ac954b41a9bf02f2fe70e1f4ac4a3d40843ff03c228b28
4
+ data.tar.gz: bd5b500b199a1e32964a311847a28f39ca3b6059c2f06e0e8fcbd608106a641a
5
5
  SHA512:
6
- metadata.gz: c99ce78b496f2eb91ddb26c799fe51e18e5fb0f2d23d546fcadff0cc7a293c28af455ecad577d43b1e9c4e156f781d17b9ba4b4f7f856861158b68301c23ef77
7
- data.tar.gz: d6fd552131866752356ce35a82c1ce032dc1863597b1ba618e9f9924fc1d9c2c86a8e595fe64358757156150125ba937350bd422e5818f77f453be9be0882a1a
6
+ metadata.gz: 9ad4f5de676ecdd7afc6d630c4a3934aba3d45623a8b45e19196574b7453641b077c5c5ac3a2d1c4edad06cacfaa17b28d7abf778fd894c7c4494c01a9d56654
7
+ data.tar.gz: 39f631c8dff1ecd6879786cee70656cb6c6b018db070d49d8c7e5cc6fccf8de018ba0ccf0608cdf11c00670f36d63eb2dcce5780c4cd2122b5b0a4cbc6e1ab9a
data/bin/alphalang CHANGED
@@ -56,7 +56,7 @@ list_locales_flag = options[:listlocales]
56
56
  list_locale_flag = options[:listlocale]
57
57
 
58
58
  if create_locale_flag
59
- require_relative '../lib/lang_creator'
59
+ require_relative '../lib/locale_creator'
60
60
  create_locale_file
61
61
  return
62
62
  end
@@ -104,7 +104,9 @@ if verify_flag
104
104
  puts 'Flag for verification found. Ignoring input file.'
105
105
  sleep 1
106
106
  end
107
+ TEST_UNIT_ACTIVE = true
107
108
  require_relative '../lib/tester/test_unit'
108
109
  else
110
+ TEST_UNIT_ACTIVE = false
109
111
  LangParser.new(language_flag, verbose_flag).parse_file(ARGV[0])
110
112
  end
@@ -5,11 +5,15 @@ require_relative 'locale_lister'
5
5
  def set_default_locale(new_locale)
6
6
  available_locales = get_locale_files
7
7
 
8
- available_locales.each do |locale|
9
- if locale == new_locale
10
- File.open("#{LOCALES_PATH}/default", 'w') { |f| f.write(new_locale)}
11
- puts "[alphalang] Default syntax locale is now set to #{locale}."
12
- return
8
+ available_locales.each do |available_locale|
9
+ if available_locale == new_locale
10
+ begin
11
+ File.open("#{LOCALES_PATH}/default", 'w') { |f| f.write(new_locale) }
12
+ puts "[alphalang] Default syntax locale is now set to #{new_locale}."
13
+ rescue Errno::ENOENT
14
+ puts '[alphalang] Failed to change default locale. Likely permissions error on your machine.'
15
+ puts "Could not open #{LOCALES_PATH}/default}"
16
+ end
13
17
  end
14
18
  end
15
19
  end
data/lib/locale_lister.rb CHANGED
@@ -30,22 +30,24 @@ end
30
30
 
31
31
  def print_clean_locale_array(locale_name, clean_array)
32
32
  longest_word = clean_array.max_by(&:length).size
33
- padding = ' ' * (longest_word/2-5)
33
+ padding = ' ' * (longest_word / 2 - 5)
34
34
 
35
35
  header = "#{padding}[alphalang] Syntax for locale <#{locale_name}>.#{padding}"
36
36
  puts header
37
37
  puts '+' * (header.size - 2)
38
+
38
39
  clean_line = ''
39
40
  clean_array.each_with_index do |word, index|
40
41
  if index.even?
41
42
  clean_line += "+ #{word}"
42
43
  else
43
- clean_line += (' ' * (20 -clean_line.size)) + "#{word}"
44
+ clean_line += (' ' * (20 - clean_line.size)) + "#{word}"
44
45
  clean_line += (' ' * (header.size - clean_line.size - 3) + '+')
45
46
  puts clean_line
46
47
  clean_line = ''
47
48
  end
48
49
  end
50
+
49
51
  puts '+' * (header.size - 2)
50
52
  end
51
53
 
@@ -53,9 +55,7 @@ def list_specific_locale_file()
53
55
  list_locale_files
54
56
  specific_locale = gets.chomp
55
57
 
56
- if specific_locale == 'default'
57
- specific_locale = File.read("#{LOCALES_PATH}/#{specific_locale}")
58
- end
58
+ specific_locale = File.read("#{LOCALES_PATH}/#{specific_locale}") if specific_locale == 'default'
59
59
 
60
60
  return if ABORT_ANSWERS.include?(specific_locale)
61
61
 
@@ -1,6 +1,4 @@
1
- #!/usr/bin/env ruby
2
-
3
- ####################################################
1
+ ###################### Base Nodes
4
2
 
5
3
  class Node
6
4
  attr_accessor :value
@@ -43,6 +41,8 @@ class BoolNode < Node
43
41
  end
44
42
  end
45
43
 
44
+ ###################### Logic Gate Nodes
45
+
46
46
  class AndNode < Node
47
47
  def initialize(lhs, rhs)
48
48
  @lhs, @rhs = lhs, rhs
@@ -83,7 +83,7 @@ class NotNode < Node
83
83
  end
84
84
  end
85
85
 
86
- ####################################################
86
+ ###################### Operation Nodes
87
87
 
88
88
  class CompareNode < Node
89
89
  attr_accessor :lhs, :op, :rhs
@@ -119,7 +119,7 @@ class BinaryOperationNode < Node
119
119
  end
120
120
 
121
121
  if @rhs.evaluate.is_a?(ArrayNode) or @rhs.evaluate.is_a?(Array) and @lhs.evaluate.is_a?(Numeric)
122
- raise SyntaxError, "You can't subtract and array from a number! #{@lhs.evaluate} #{@op} #{@rhs.name}"
122
+ raise SyntaxError, "You can't subtract an array from a number! #{@lhs.evaluate} #{@op} #{@rhs.name}"
123
123
  end
124
124
 
125
125
  if @op == '/'
@@ -130,21 +130,7 @@ class BinaryOperationNode < Node
130
130
  end
131
131
  end
132
132
 
133
- ####################################################
134
-
135
- class CompStmtNode < Node
136
- def initialize(stmt_compstmt)
137
- super
138
- @comp_statements = stmt_compstmt
139
- end
140
-
141
- def evaluate
142
- @comp_statements[0].evaluate
143
- @comp_statements[1].evaluate
144
- end
145
- end
146
-
147
- ####################################################
133
+ ###################### Array / Data Structure Nodes
148
134
 
149
135
  class ArrayNode < Node
150
136
  attr_accessor :lhs, :rhs
@@ -205,3 +191,17 @@ class ArrayNode < Node
205
191
  self
206
192
  end
207
193
  end
194
+
195
+ ###################### Root Program Node
196
+
197
+ class CompStmtNode < Node
198
+ def initialize(stmt_compstmt)
199
+ super
200
+ @comp_statements = stmt_compstmt
201
+ end
202
+
203
+ def evaluate
204
+ @comp_statements[0].evaluate
205
+ @comp_statements[1].evaluate
206
+ end
207
+ end
@@ -2,8 +2,6 @@ require_relative 'stmtnodes'
2
2
 
3
3
  ####################################################
4
4
 
5
- $test_nodes = false
6
-
7
5
  class ScopeManager
8
6
  def initialize(true_value, false_value)
9
7
  @@true_value = true_value
@@ -1,6 +1,6 @@
1
1
  require_relative 'basenodes'
2
2
 
3
- ####################################################
3
+ ###################### Variable Nodes
4
4
 
5
5
  class VariableCallNode < Node
6
6
  attr_accessor :name
@@ -29,7 +29,22 @@ class VariableDecNode < Node
29
29
  end
30
30
  end
31
31
 
32
- ####################################################
32
+ class ArrayCallNode < Node
33
+ def initialize(array, index)
34
+ super(array)
35
+ @index = index.to_i
36
+ end
37
+
38
+ def evaluate
39
+ arr = ScopeManager.lookup_var(@value)
40
+ if @index > arr.size - 1
41
+ raise ArgumentError, "You are trying to access an out of bounds index. Here -> #{@value}[#{@index}]"
42
+ end
43
+ @value = arr[@index]
44
+ end
45
+ end
46
+
47
+ ###################### Function Nodes
33
48
 
34
49
  class FunctionDecNode < Node
35
50
  def initialize(node, value)
@@ -84,7 +99,7 @@ class FuncCallNode < Node
84
99
  end
85
100
  end
86
101
 
87
- ####################################################
102
+ ###################### If Statement Nodes
88
103
 
89
104
  class IfNode < Node
90
105
  attr_accessor :argument
@@ -138,7 +153,7 @@ class IfCompStmtNode < Node
138
153
  end
139
154
  end
140
155
 
141
- ####################################################
156
+ ###################### Loop Nodes
142
157
 
143
158
  class WhileLoopNode < Node
144
159
  attr_accessor :condition
@@ -156,24 +171,7 @@ class WhileLoopNode < Node
156
171
  end
157
172
  end
158
173
 
159
- ####################################################
160
-
161
- class ArrayCallNode < Node
162
- def initialize(array, index)
163
- super(array)
164
- @index = index.to_i
165
- end
166
-
167
- def evaluate
168
- arr = ScopeManager.lookup_var(@value)
169
- if @index > arr.size - 1
170
- raise ArgumentError, "You are trying to access an out of bounds index. Here -> #{@value}[#{@index}]"
171
- end
172
- @value = arr[@index]
173
- end
174
- end
175
-
176
- ####################################################
174
+ ###################### Built-in Functions
177
175
 
178
176
  class PrintNode
179
177
  attr_accessor :value
@@ -184,11 +182,11 @@ class PrintNode
184
182
 
185
183
  def evaluate
186
184
  if @value.evaluate.is_a?(ArrayNode)
187
- print "Array #{@value.name}: "
188
- puts @value.evaluate
185
+ print "Array #{@value.name}: " unless TEST_UNIT_ACTIVE
186
+ puts @value.evaluate unless TEST_UNIT_ACTIVE
189
187
  elsif @value.evaluate.is_a?(Array)
190
- print "Array #{@value.name}: "
191
- puts @value.evaluate.join(', ')
188
+ print "Array #{@value.name}: " unless TEST_UNIT_ACTIVE
189
+ puts @value.evaluate.join(', ') unless TEST_UNIT_ACTIVE
192
190
  else
193
191
  if @value.evaluate == PrintNode
194
192
  if @value.value.is_a?(VariableCallNode)
@@ -197,7 +195,7 @@ class PrintNode
197
195
  raise SyntaxError, "You have a duplicate 'print' statement! Printing #{@value.value} twice."
198
196
  end
199
197
  end
200
- puts @value.evaluate
198
+ puts @value.evaluate unless TEST_UNIT_ACTIVE
201
199
  end
202
200
  self.class
203
201
  end
@@ -0,0 +1,14 @@
1
+ x = 1
2
+
3
+ def foo(bar)
4
+ y = 0
5
+ while bar < 20
6
+ print bar
7
+ bar = bar + 1
8
+ y = bar
9
+ end
10
+ print y
11
+ y
12
+ end
13
+
14
+ foo(x)
@@ -0,0 +1,5 @@
1
+ x = 1
2
+
3
+ def foo(bar)
4
+ y = bar
5
+ end
@@ -1,7 +1,17 @@
1
1
  a = 1
2
2
  b = 1
3
- print b
3
+
4
4
  def fib(x)
5
+ if 2 < x
6
+
7
+ temp = a + b
8
+ a = b
9
+ b = temp
10
+
11
+ fib(x - 1)
12
+ else
13
+ b
14
+ end
5
15
  end
6
16
 
7
- fib(100)
17
+ print fib(11)
@@ -239,3 +239,64 @@ class TesCompactIf < Test::Unit::TestCase
239
239
  #{$end}"))
240
240
  end
241
241
  end
242
+
243
+ class TestPrograms < Test::Unit::TestCase
244
+ def test_fibonacci
245
+ program = "
246
+ a = 1
247
+ b = 1
248
+
249
+ #{$def} fib(x)
250
+ #{$if} 2 < x
251
+
252
+ temp = a + b
253
+ a = b
254
+ b = temp
255
+
256
+ fib(x - 1)
257
+ #{$else}
258
+ b
259
+ #{$end}
260
+ #{$end}
261
+
262
+ fib(11)
263
+ "
264
+ assert_equal(89, LangParser.new.calc_test(program))
265
+ end
266
+
267
+ def test_func_with_while
268
+ program = "
269
+ x = 1
270
+
271
+ #{$def} foo(bar)
272
+ #{$while} bar < 20
273
+ #{$print} bar
274
+ bar = bar + 1
275
+ #{$end}
276
+ #{$end}
277
+
278
+ foo(x)
279
+ "
280
+ assert_equal(WhileLoopNode, LangParser.new.calc_test(program))
281
+ end
282
+
283
+ def test_func_with_while_return_value
284
+ program = "
285
+ x = 1
286
+
287
+ #{$def} foo(bar)
288
+ y = 0
289
+ #{$while} bar < 20
290
+ #{$print} bar
291
+ bar = bar + 1
292
+ y = bar
293
+ #{$end}
294
+ #{$print} y
295
+ y
296
+ #{$end}
297
+
298
+ foo(x)
299
+ "
300
+ assert_equal(20, LangParser.new.calc_test(program))
301
+ end
302
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alphalang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - mattias, victor
@@ -60,7 +60,7 @@ extra_rdoc_files: []
60
60
  files:
61
61
  - bin/alphalang
62
62
  - lib/alpha.rb
63
- - lib/lang_creator.rb
63
+ - lib/locale_creator.rb
64
64
  - lib/locale_defaulter.rb
65
65
  - lib/locale_deleter.rb
66
66
  - lib/locale_lister.rb
@@ -74,6 +74,8 @@ files:
74
74
  - lib/nodes/scopemanager.rb
75
75
  - lib/nodes/stmtnodes.rb
76
76
  - lib/rdparse.rb
77
+ - lib/tester/assign.alpha
78
+ - lib/tester/assign.alpha~
77
79
  - lib/tester/demo_de.alpha
78
80
  - lib/tester/demo_emoji.alpha
79
81
  - lib/tester/demo_emoji.alpha~
File without changes