alphalang 0.1.6 → 0.1.8
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 +4 -4
- data/bin/alphalang +1 -1
- data/lib/alpha.rb +1 -3
- data/lib/lang_creator.rb +1 -7
- data/lib/nodes/basenodes.rb +2 -1
- data/lib/nodes/scopemanager.rb +2 -2
- data/lib/nodes/stmtnodes.rb +3 -0
- data/lib/rdparse.rb +81 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9264317b60fae6805130ff9692189ba73bf08530c025d8a732c0c520b19a466
|
4
|
+
data.tar.gz: e7bff4ae6de5fbade8cbc6b0a779ddd06259fad639b3650239fbb5f39d0adff9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c8f5078f5f91b224847c2c43134e84fb053d3ba6b5eb456104ae7a4f0f267009ee78077fc8e338e1bb5002616d16627491469df240492f045546b20d4a18c5a
|
7
|
+
data.tar.gz: daf389f2da9e82cd86a921639b5d8843ef4c45b33ef294d2c93a3281d64dfb0d6674c36f16aac04e76ef2f75c160865554e8325e57bb3c5864462a4739fc9f4f
|
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
|
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)
|
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
|
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'
|
data/lib/nodes/basenodes.rb
CHANGED
@@ -149,12 +149,13 @@ class CompStmtNode < Node
|
|
149
149
|
|
150
150
|
def evaluate
|
151
151
|
@comp_statements[0].evaluate
|
152
|
-
@comp_statements[1].evaluate
|
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
|
|
data/lib/nodes/scopemanager.rb
CHANGED
@@ -37,7 +37,7 @@ class ScopeManager
|
|
37
37
|
return @@scopes[temp_scope_lvl][name]
|
38
38
|
end
|
39
39
|
end
|
40
|
-
raise
|
40
|
+
raise SyntaxError, "Variable '#{name}' is not defined" unless @value
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.increment_scope_level
|
@@ -51,7 +51,7 @@ class ScopeManager
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.lookup_func(name)
|
54
|
-
raise
|
54
|
+
raise SyntaxError, "Function '#{name}' is not defined" if @@scopes[0][name].is_a?(NilClass)
|
55
55
|
return @@scopes[0][name]
|
56
56
|
end
|
57
57
|
|
data/lib/nodes/stmtnodes.rb
CHANGED
@@ -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
|
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,86 @@ 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
|
+
if block_start_line == nil || block_end_line == nil
|
192
|
+
raise ParseError, "Error with <#{problematic_token}> somewhere around line #{block_end_line}#{block_start_line}"
|
193
|
+
end
|
194
|
+
index = 0
|
195
|
+
result = []
|
196
|
+
@file_string.each_line do |line|
|
197
|
+
if index > block_start_line and index < block_end_line
|
198
|
+
|
199
|
+
if line.match?(/;;.*$/)
|
200
|
+
line = line.split(';;')[0]
|
201
|
+
end
|
202
|
+
|
203
|
+
if line.match?(/#{problematic_token}\s+$/)
|
204
|
+
result << "ParseError, #{line.strip}() is missing an expression on line #{index + 1}"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
index += 1
|
208
|
+
end
|
209
|
+
raise ParseError, result[-1]
|
210
|
+
end
|
211
|
+
|
212
|
+
def find_faulty_expression_within_ends
|
213
|
+
puts 'TODO: Implement search for faulty token between two of the same guides'
|
214
|
+
raise ParseError, "Most likely mismatched '#{@token_list['END'.downcase]}' token."
|
215
|
+
end
|
216
|
+
|
217
|
+
def find_faulty_line
|
218
|
+
if @tokens[@max_pos-0].is_a?(NilClass)
|
219
|
+
if @max_pos >= 3
|
220
|
+
puts "Problem is in the end of the file after:\n #{@tokens[@max_pos - 3]}#{@tokens[@max_pos - 2]}#{@tokens[@max_pos - 1]}"
|
221
|
+
else
|
222
|
+
puts "Problem is right in the beginning of the file."
|
223
|
+
end
|
224
|
+
raise ParseError
|
225
|
+
end
|
226
|
+
|
227
|
+
problematic_token = "#{@tokens[@max_pos - 1].downcase}"
|
228
|
+
before_problem = "#{@tokens[@max_pos - 2].downcase}"
|
229
|
+
after_problem = "#{@tokens[@max_pos - 0].downcase}"
|
230
|
+
|
231
|
+
after_problem = "[" + after_problem + "]" if !after_problem.match?(/[a-z]/)
|
232
|
+
before_problem = "[" + before_problem + "]" if !before_problem.match?(/[a-z]/)
|
233
|
+
|
234
|
+
translated_problematic_token = @token_list[problematic_token]
|
235
|
+
|
236
|
+
if translated_problematic_token.is_a?(NilClass)
|
237
|
+
raise ParseError, "Faulty expression likely between two '#{@token_list['end']}' tokens."
|
238
|
+
end
|
239
|
+
|
240
|
+
index = 0
|
241
|
+
problem_match_hash = {}
|
242
|
+
found_end = false
|
243
|
+
@file_string.each_line do |line|
|
244
|
+
|
245
|
+
if line.match?(before_problem) && found_end == false
|
246
|
+
problem_match_hash[before_problem] = index
|
247
|
+
end
|
248
|
+
|
249
|
+
if line.match?(after_problem) && index > problem_match_hash[before_problem]
|
250
|
+
problem_match_hash[after_problem] = index
|
251
|
+
found_end = true
|
252
|
+
end
|
253
|
+
index += 1
|
254
|
+
end
|
255
|
+
|
256
|
+
non_empty_line_before_problem = problem_match_hash[before_problem]
|
257
|
+
non_empty_line_after_problem = problem_match_hash[after_problem]
|
258
|
+
|
259
|
+
unless after_problem == before_problem
|
260
|
+
find_faulty_expression_within_block(non_empty_line_before_problem, non_empty_line_after_problem, problematic_token)
|
261
|
+
else
|
262
|
+
find_faulty_expression_within_ends
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
189
266
|
def parse(string)
|
190
267
|
# First, split the string according to the "token" instructions given.
|
191
268
|
# Afterwards @tokens contains all tokens that are to be parsed.
|
269
|
+
@file_string = string
|
192
270
|
tokenize(string)
|
193
271
|
|
194
272
|
# These variables are used to match if the total number of tokens
|
@@ -205,7 +283,8 @@ class Parser
|
|
205
283
|
raise ParseError, 'Mismatched parenthesis! In Emacs: M-x check-parens RET'
|
206
284
|
end
|
207
285
|
|
208
|
-
raise ParseError, "Parse error. expected: '#{@expected.join(', ')}', found '#{@tokens[@max_pos]}'"
|
286
|
+
# raise ParseError, "Parse error. expected: '#{@expected.join(', ')}', found '#{@tokens[@max_pos]}'"
|
287
|
+
return find_faulty_line
|
209
288
|
end
|
210
289
|
return result
|
211
290
|
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.
|
4
|
+
version: 0.1.8
|
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-
|
11
|
+
date: 2024-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logger
|