Class: Parser

Inherits:
Object show all
Includes:
Environment, ErrorMessages, Validator
Defined in:
lib/lisp/interpreter/parser.rb

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

Methods included from ErrorMessages

#unbalanced_brackets_error, #unbalanced_quotes_error

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

#parse(token) ⇒ Object



47
48
49
50
51
52
53
54
55
56
# File 'lib/lisp/interpreter/parser.rb', line 47

def parse(token)
  token_error = validate_token token
  result =
    if token_error.nil?
      @tokenizer.tokenize split_token token
    else
      token_error
    end
  print_result result unless result.to_s.empty?
end


66
67
68
69
70
71
# File 'lib/lisp/interpreter/parser.rb', line 66

def print_result(result)
  to_remove = result.to_s.list? || result.to_s.pair? || result.to_s.quote?
  result = result.delete('\'') if to_remove
  puts result if @env_type == Environment::PROD
  result
end

#runObject



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



58
59
60
61
62
63
64
# File 'lib/lisp/interpreter/parser.rb', line 58

def validate_token(token)
  if !balanced_brackets? token
    unbalanced_brackets_error
  elsif !balanced_quotes? token
    unbalanced_quotes_error
  end
end