Class: Parser
- 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
-
#initialize(env_type = Environment::TEST) ⇒ Parser
constructor
A new instance of Parser.
- #parse(token) ⇒ Object
- #print_result(result) ⇒ Object
- #run ⇒ Object
- #split_token(token) ⇒ Object
- #validate_token(token) ⇒ Object
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 |
#print_result(result) ⇒ Object
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 |
#run ⇒ Object
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 |