Class: Parser
Overview
Parser is used to validate the user input and parse it to the tokenizer
Constant Summary
Constants included
from Environment
Environment::PROD, Environment::TEST
Instance Method Summary
collapse
Methods included from Validator
#balanced_brackets?, #balanced_quotes?, #valid_function, #valid_var, #valid_var_name
#arg_err_build, #data_type_err, #no_procedure_build, #unbalanced_brackets_error, #unbalanced_quotes_error, #unbound_symbol_err
Constructor Details
#initialize(env_type = Environment::TEST) ⇒ Parser
Returns a new instance of Parser.
17
18
19
20
|
# File 'lib/lisp/interpreter/parser.rb', line 17
def initialize(env_type = Environment::TEST)
@env_type = env_type
@tokenizer = Tokenizer.new
end
|
Instance Method Details
#display_result(result) ⇒ Object
121
122
123
124
|
# File 'lib/lisp/interpreter/parser.rb', line 121
def display_result(result)
to_print = find_result_type result, @tokenizer.syntax_methods
puts to_print
end
|
#finalize_result(result) ⇒ Object
102
103
104
105
106
|
# File 'lib/lisp/interpreter/parser.rb', line 102
def finalize_result(result)
result = format_result result
display_result result if @env_type == Environment::PROD
result
end
|
#find_result_type(res, methods) ⇒ Object
114
115
116
117
118
119
|
# File 'lib/lisp/interpreter/parser.rb', line 114
def find_result_type(res, methods)
return '#<Closure>' if res.is_a? Proc
is_func = (methods.key? res.to_s) || res.to_s.match(/c[ad]{2,}r/)
return '#<Function ' + res.to_s + '>' if is_func
res.to_s
end
|
108
109
110
111
112
|
# File 'lib/lisp/interpreter/parser.rb', line 108
def format_result(result)
to_remove = result.to_s.list? || result.to_s.pair? || result.to_s.quote?
result = result.delete('\'') if to_remove
result
end
|
#parse(token) ⇒ Object
82
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/lisp/interpreter/parser.rb', line 82
def parse(token)
return read_file token if token.start_with? 'ghci'
token_error = validate_token token
result =
if token_error.nil?
@tokenizer.tokenize split_token token
else
token_error
end
finalize_result result unless result.to_s.empty?
end
|
#read_file(token) ⇒ Object
74
75
76
77
78
79
80
|
# File 'lib/lisp/interpreter/parser.rb', line 74
def read_file(token)
res = read_file_helper token
return finalize_result res if res.is_a? String
filename = token[5..-1]
return read_file_executor filename if File.exist? filename
finalize_result 'File with name "' + filename + '" does not exist!'
end
|
#read_file_executor(file) ⇒ Object
68
69
70
71
72
|
# File 'lib/lisp/interpreter/parser.rb', line 68
def read_file_executor(file)
f = File.open(file)
expr = ''
read_file_reader f, expr
end
|
#read_file_helper(token) ⇒ Object
47
48
49
50
51
52
53
54
|
# File 'lib/lisp/interpreter/parser.rb', line 47
def read_file_helper(token)
pattern = /^ghci .*\.[.ss|.scm]+$/
result = (token =~ pattern)
return unless result.nil?
token = token[5..-1].nil? ? token[4..-1] : token[5..-1]
msg = 'File with name "' + token + '" is not valid scheme file'
msg
end
|
#read_file_reader(f, expr) ⇒ Object
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/lisp/interpreter/parser.rb', line 56
def read_file_reader(f, expr)
last_value = ''
f.each do |line|
expr << line
if (validate_token expr).nil? && expr != ''
last_value = parse expr
expr = ''
end
end
last_value
end
|
22
23
24
25
26
27
28
29
30
31
32
33
|
# File 'lib/lisp/interpreter/parser.rb', line 22
def run
loop do
print 'zakichan> ' if @env_type == Environment::PROD
token = ''
until (validate_token token).nil? && token != ''
crr_input = STDIN.gets.chomp + ' '
token << crr_input
break if crr_input == ''
end
parse token
end
end
|
#split_token(token) ⇒ Object
35
36
37
38
39
40
41
42
43
44
45
|
# File 'lib/lisp/interpreter/parser.rb', line 35
def split_token(token)
result = []
token.split(/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/).each do |t|
if !t.string? && (t.include?('(') || t.include?(')'))
t.to_s.split(/(\(|\))/).each { |p| result << p }
else
result << t
end
end
result
end
|
#validate_token(token) ⇒ Object
94
95
96
97
98
99
100
|
# File 'lib/lisp/interpreter/parser.rb', line 94
def validate_token(token)
if !balanced_brackets? token
unbalanced_brackets_error
elsif !balanced_quotes? token
unbalanced_quotes_error
end
end
|