alphalang 0.1.6 → 0.1.7

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: daa1ca143b51a415a7888d29f6cec78e41fddaa637685af3534708c40cc6de5a
4
- data.tar.gz: b2c26c887f7fcf6f14f4efab2787d61a1ce9f7df8e6cb872bfc0b2b7184fa961
3
+ metadata.gz: 1f69af7ab6e40605d9118d7125caf0c99ea961bd20108210a91d77ea790e0489
4
+ data.tar.gz: 0bd9593abf719ba7e5704a873f3d5d14aff15a20d424bcc858e7d9a7e45b22f4
5
5
  SHA512:
6
- metadata.gz: f811511f84666e1148ea41d5706ed8289482dd8df76d2f0c3f25ebc8513ccf79b1869f83a35f586cbc6af0c1ded8f3ecf28403dc8495562a7f0d034daa0cc16b
7
- data.tar.gz: e62cf96b852544722eb6aa3c33e9cbbc32bb5eb3fa03aec71d89121736be7c78f2a027e0b1885419eec53385afa2787a1a8b9d5953aa6720cb8571bd3749b8d2
6
+ metadata.gz: 34c909f692a34e3eae601ec4eddcb6361e46480d74a857b277fdbe652d65b2cfa99b6c427661fea5c64720a2122b28e8644f079df2e76b267e53c9bf11c8d26f
7
+ data.tar.gz: 0aebab81771209c1f955abd3954e0ba7b9d4c8544fe2d308779d56d19669085b8cb925e6fbdda1cedd3c6b4a7755b95caa17b509bc9f948e85359025aefaf530
data/bin/alphalang CHANGED
@@ -3,7 +3,7 @@ require 'optparse'
3
3
  require File.expand_path('../lib/alpha', __dir__)
4
4
  require_relative '../lib/rdparse'
5
5
  ALPHA_VER = '0.1.5'.freeze
6
- ABORT_ANSWERS = [' ', '', 'none', 'abort'].freeze # something here? Some cases empty means yes tho..
6
+ ABORT_ANSWERS = [' ', '', 'none', 'abort'].freeze
7
7
  LOCALES_PATH = File.join(__dir__, '../lib/locales')
8
8
  PROTECTED_LOCALES = ['.', '..', 'locale_template', 'default', 'default.old', 'en', 'sv', 'de'].freeze
9
9
 
data/lib/alpha.rb CHANGED
@@ -2,7 +2,6 @@ require_relative './nodes/scopemanager'
2
2
 
3
3
  class LangParser
4
4
  def initialize(locale = 'default', debug_mode = false)
5
-
6
5
  @langParser = Parser.new('lang parser', debug_mode, locale) do
7
6
  token(/;;.*$/)
8
7
  token(/while/) { |_| :WHILE }
@@ -24,7 +23,7 @@ class LangParser
24
23
  token(/./) { |m| m }
25
24
 
26
25
  start :program do
27
- match(:comp_stmt) { |comp_stmt| comp_stmt }
26
+ match(:comp_stmt)
28
27
  match(:terminal)
29
28
  end
30
29
 
@@ -137,7 +136,6 @@ class LangParser
137
136
  match(/\d+/, '.', /\d+/) { |a, dot, b| NumberNode.new((a+dot+b)) }
138
137
  match('-', /\d+/) { |neg, a| NumberNode.new(neg + a) }
139
138
  match(/\d+/) { |a| NumberNode.new(a) }
140
- match(/(false|true)/) { |a| BoolNode.new(a) }
141
139
  match(ScopeManager.true_value) { |a| BoolNode.new(a) }
142
140
  match(ScopeManager.false_value) { |a| BoolNode.new(a) }
143
141
  match(:PRINT, :member) { |_, a| PrintNode.new(a) }
data/lib/lang_creator.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require_relative 'locale_lister'
3
3
 
4
- # Function to read user input for translation
5
4
  def read_translation(line)
6
5
  puts "Enter the translation for: '#{line}' <RET> to accept '#{line}'"
7
6
  translation = gets.chomp
@@ -73,21 +72,16 @@ def create_locale_file()
73
72
  return
74
73
  end
75
74
 
76
- # prompt user for translations
77
75
  prompt_user(new_locale_file_path)
78
-
79
- # Clear the screen
80
76
  system('clear')
81
77
 
82
- # Display the contents of the translation file
83
78
  locale_as_array = clean_locale_file_to_array(new_locale_name)
84
79
  print_clean_locale_array(new_locale_name, locale_as_array)
85
80
 
86
- # Ask user if the translation is correct
87
81
  puts 'Is this correct? [Y/n]'
88
82
  answer = gets.chomp
89
83
 
90
- if answer.downcase == /y|Y/ or answer.empty?
84
+ if answer.downcase.match? /y|Y/ or answer.empty?
91
85
  puts "Locale is saved as #{new_locale_name} in #{LOCALES_PATH}"
92
86
  else
93
87
  puts 'Translation removed'
@@ -149,12 +149,13 @@ class CompStmtNode < Node
149
149
 
150
150
  def evaluate
151
151
  @comp_statements[0].evaluate
152
- @comp_statements[1].evaluate # kanske bör loopas osv??? Root blir nu sista evalueringen.
152
+ @comp_statements[1].evaluate
153
153
  end
154
154
  end
155
155
 
156
156
  ####################################################
157
157
 
158
+ #Arraynoden är ofärdig, används inte korrekt
158
159
  class ArrayNode < Node
159
160
  attr_accessor :lhs, :rhs
160
161
 
@@ -72,12 +72,14 @@ class FuncCallNode < Node
72
72
  ScopeManager.decrement_scope_level
73
73
 
74
74
  # If function return value is an "Assign" then we declare that variable in the global scope.
75
+ # This should be a ScopeManager method, add_variable_to_global_scope is missing.
75
76
  old_scope_lvl = ScopeManager.scope_lvl
76
77
  if func_return_value.is_a?(VariableDecNode)
77
78
  ScopeManager.scope_lvl = 0
78
79
  func_return_value.evaluate
79
80
  ScopeManager.scope_lvl = old_scope_lvl
80
81
  end
82
+
81
83
  return func_return_value
82
84
  end
83
85
  end
@@ -196,6 +198,7 @@ class PauseNode < Node
196
198
  end
197
199
 
198
200
  def evaluate
201
+ @value = 0 if @value.evaluate.negative?
199
202
  sleep @value.evaluate
200
203
  end
201
204
  end
data/lib/rdparse.rb CHANGED
@@ -132,6 +132,7 @@ class Parser
132
132
  @rules = {}
133
133
  @start = nil
134
134
  @language_name = language_name
135
+ @file_string = ''
135
136
 
136
137
  create_tokens_from_locale(locale)
137
138
 
@@ -145,7 +146,7 @@ class Parser
145
146
  instance_eval(&block)
146
147
  end
147
148
 
148
- # Recreate the tokenlist using locale_template and the chosen locale file
149
+ # Recreate the tokenlist using the chosen locale file
149
150
  def create_tokens_from_locale(locale)
150
151
  if locale == 'default'
151
152
  lang_file = File.read("#{LOCALES_PATH}/#{locale}")
@@ -186,9 +187,78 @@ class Parser
186
187
  end # until
187
188
  end
188
189
 
190
+ def find_faulty_expression_within_block(block_start_line, block_end_line, problematic_token)
191
+ index = 0
192
+ result = []
193
+ @file_string.each_line do |line|
194
+ if index > block_start_line and index < block_end_line
195
+
196
+ if line.match?(/;;.*$/)
197
+ line = line.split(';;')[0]
198
+ end
199
+
200
+ if line.match?(/#{problematic_token}\s+$/)
201
+ result << "ParseError, #{line.strip}() is missing an expression on line #{index + 1}"
202
+ end
203
+ end
204
+ index += 1
205
+ end
206
+ raise ParseError, result[-1]
207
+ end
208
+
209
+ def find_faulty_expression_within_ends
210
+ puts 'TODO: Implement search for faulty token between two of the same guides'
211
+ raise ParseError, "Most likely mismatched '#{@token_list['END'.downcase]}' token."
212
+ end
213
+
214
+ def find_faulty_line
215
+ problematic_token = "#{@tokens[@max_pos - 1].downcase}"
216
+ before_problem = "#{@tokens[@max_pos - 2].downcase}"
217
+ after_problem = "#{@tokens[@max_pos - 0].downcase}"
218
+
219
+ if @max_pos - 5 <= 0
220
+ puts 'problem in the beginning of file, figure it out'
221
+ return
222
+ elsif @max_pos + 5 < @max_pos
223
+ puts 'problem in the end of file, figure it out'
224
+ return
225
+ end
226
+
227
+ translated_problematic_token = @token_list[problematic_token]
228
+
229
+ if translated_problematic_token.is_a?(NilClass)
230
+ raise ParseError, "Faulty expression likely between two '#{@token_list['END'.downcase]}' tokens."
231
+ end
232
+
233
+ index = 0
234
+ problem_match_hash = {}
235
+ found_end = false
236
+ @file_string.each_line do |line|
237
+ if line.match?(before_problem) && found_end == false
238
+ problem_match_hash[before_problem] = index
239
+ end
240
+
241
+ if line.match?(after_problem) && index > problem_match_hash[before_problem]
242
+ problem_match_hash[after_problem] = index
243
+ found_end = true
244
+ end
245
+ index += 1
246
+ end
247
+
248
+ non_empty_line_before_problem = problem_match_hash[before_problem]
249
+ non_empty_line_after_problem = problem_match_hash[after_problem]
250
+
251
+ unless after_problem == before_problem
252
+ find_faulty_expression_within_block(non_empty_line_before_problem, non_empty_line_after_problem, problematic_token)
253
+ else
254
+ find_faulty_expression_within_ends
255
+ end
256
+ end
257
+
189
258
  def parse(string)
190
259
  # First, split the string according to the "token" instructions given.
191
260
  # Afterwards @tokens contains all tokens that are to be parsed.
261
+ @file_string = string
192
262
  tokenize(string)
193
263
 
194
264
  # These variables are used to match if the total number of tokens
@@ -205,7 +275,8 @@ class Parser
205
275
  raise ParseError, 'Mismatched parenthesis! In Emacs: M-x check-parens RET'
206
276
  end
207
277
 
208
- raise ParseError, "Parse error. expected: '#{@expected.join(', ')}', found '#{@tokens[@max_pos]}'"
278
+ # raise ParseError, "Parse error. expected: '#{@expected.join(', ')}', found '#{@tokens[@max_pos]}'"
279
+ return find_faulty_line
209
280
  end
210
281
  return result
211
282
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alphalang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
- - mattias
7
+ - mattias, victor
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-06 00:00:00.000000000 Z
11
+ date: 2024-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logger