Class: BabelBridge::Shell

Inherits:
Object
  • Object
show all
Defined in:
lib/babel_bridge/shell.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parser) ⇒ Shell

Returns a new instance of Shell.



6
7
8
# File 'lib/babel_bridge/shell.rb', line 6

def initialize(parser)
  @parser = parser
end

Instance Attribute Details

#parserObject

Returns the value of attribute parser.



5
6
7
# File 'lib/babel_bridge/shell.rb', line 5

def parser
  @parser
end

Instance Method Details

#errputs(str) ⇒ Object



39
40
41
# File 'lib/babel_bridge/shell.rb', line 39

def errputs(str)
  @stderr.puts str
end

#evaluate(parse_tree_node, &block) ⇒ Object

Providing a block overrides all evaluate behavor and simply: yield parse_tree_node, self elsif parse_tree_node responds to “evaluate”: puts_result parse_tree_node.evaluate else pretty-print the parse-tree rescue and pretty-print errors



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/babel_bridge/shell.rb', line 18

def evaluate(parse_tree_node, &block)
  if block
    yield parse_tree_node, self
  elsif parse_tree_node.respond_to? :evaluate
    puts_result parse_tree_node.evaluate
  else
    pretty_print_parse_tree parse_tree_node
  end
rescue Exception => e
  errputs "Error evaluating parse tree: #{e}\n" + ["Backtrace:",e.backtrace].flatten.join("\n  ")
  pretty_print_parse_tree parse_tree_node
end

#pretty_print_parse_tree(parse_tree_node) ⇒ Object



10
11
12
# File 'lib/babel_bridge/shell.rb', line 10

def pretty_print_parse_tree(parse_tree_node)
  puts "\nParse tree:\n  #{parse_tree_node.inspect.gsub("\n","\n  ")}\n\n"
end

#puts(str) ⇒ Object



31
32
33
# File 'lib/babel_bridge/shell.rb', line 31

def puts(str)
  @stdout.puts str
end

#puts_result(str) ⇒ Object



35
36
37
# File 'lib/babel_bridge/shell.rb', line 35

def puts_result(str)
  @stdout.puts " => "+str.inspect
end

#start(options = {}, &block) ⇒ Object

Each line of input is parsed. If parser fails, output explaination of why. If parser succeeds, evaluate parse_tree_node, &block



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/babel_bridge/shell.rb', line 46

def start(options={},&block)
  @stdout = options[:stdout] || $stdout
  @stderr = options[:stdout] || @stdout
  @stdin = options[:stdin] || $stdin
  while line = @stdin == $stdin ? Readline.readline("> ", true) : @stdin.gets      
    line.strip!
    next if line.length==0
    parse_tree_node = parser.parse line
    if parse_tree_node
      evaluate parse_tree_node, &block
    else
      errputs parser.parser_failure_info :verbose => true
    end
  end
end