Class: Baba
- Inherits:
 - 
      Object
      
        
- Object
 - Baba
 
 
- Defined in:
 - lib/baba.rb,
lib/baba/run.rb,
lib/baba/expr.rb,
lib/baba/stmt.rb,
lib/baba/class.rb,
lib/baba/error.rb,
lib/baba/token.rb,
lib/baba/parser.rb,
lib/baba/tokens.rb,
lib/baba/scanner.rb,
lib/baba/version.rb,
lib/baba/callable.rb,
lib/baba/function.rb,
lib/baba/instance.rb,
lib/baba/resolver.rb,
lib/baba/environment.rb,
lib/baba/interpreter.rb,
lib/baba/ruby_object.rb,
lib/baba/runtime_error.rb 
Defined Under Namespace
Modules: Expr, Stmt Classes: BabaClass, BabaRuntimeError, Break, Callable, Environment, Function, Instance, Interpreter, Parser, Resolver, Return, RubyClass, RubyFunction, RubyObject, Scanner, Token
Constant Summary collapse
- LEFT_PAREN =
          
Single character tokens
 0- RIGHT_PAREN =
          
(
 1- COMMA =
          
)
 2- MINUS =
          
,
 3- PLUS =
          
-
 4- SLASH =
          
+
 5- STAR =
          
/
 6- SEMICOLON =
          
*
 7- COLON =
          
;
 39- DOT =
          
: (colons are used when marking a new statement), can also function as {
 44- NOT =
          
One-two character tokens
 8- NOT_EQUAL =
          
! OR not
 9- EQUAL =
          
!= OR not-equal
 10- EQUAL_EQUAL =
          
is OR =
 11- GREATER =
          
OR equals
 12- LESS =
          
> OR greater
 13- GREATER_EQUAL =
          
< OR less
 14- LESS_EQUAL =
          
>= greater-equal
 15- IDENTIFIER =
          
Literals
 16- STRING =
          
??
 17- NUMBER =
          
“”
 18- THING =
          
Keywords
 19- IF =
          
thing (class basically)
 20- ELSE =
          
if
 21- DOES =
          
else
 22- FOR =
          
does (method definition)
 23- BLANK =
          
for
 24- OR =
          
blank (nil)
 25- AND =
          
or OR ||
 26- RETURN =
          
and OR &&
 27- SUPER =
          
return
 28- SELF =
          
super
 29- VAR =
          
self
 30- WHILE =
          
variable
 31- FALSE =
          
while
 32- TRUE =
          
false
 33- KEND =
          
true
 38- BREAK =
          
end, can also function as }
 42- INCLUDE =
          
break
 48- RBEVAL =
          
include
 34- EOF =
          
RBFUNC = 35 # rb_func RBINSTANCECALL = 36 # rb_instance_call
 37- KEYWORDS =
          
There are too many of these lol
 { "thing" => THING, "if" => IF, "else" => ELSE, "does" => DOES, "for" => FOR, "blank" => BLANK, "nil" => BLANK, "or" => OR, "||" => OR, "and" => AND, "&&" => AND, "return" => RETURN, "super" => SUPER, "self" => SELF, "var" => VAR, "while" => WHILE, "false" => FALSE, "true" => TRUE, "end" => KEND, # It's KEND because ruby is dumb "break" => BREAK, "rb_eval" => RBEVAL, "include" => INCLUDE, # "rb_func" => RBFUNC, # "rb_instance_call" => RBINSTANCECALL, "not" => NOT, "not-equals" => NOT_EQUAL, "is" => EQUAL, "equals" => EQUAL_EQUAL, "greater" => GREATER, "less" => LESS, "greater-equal" => GREATER_EQUAL, "less-equal" => LESS_EQUAL, }
- VERSION =
 "1.0.1"- @@had_error =
 false
Class Method Summary collapse
- .had_error ⇒ Object
 - .parser_error(token, what) ⇒ Object
 - .report(line, what, line_contents = nil, character = nil) ⇒ Object
 - .runtime_error(error) ⇒ Object
 - .scanner_error(line, what, contents = nil, character = nil) ⇒ Object
 
Instance Method Summary collapse
- 
  
    
      #initialize  ⇒ Baba 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    
A new instance of Baba.
 - #main ⇒ Object
 - #run(source) ⇒ Object
 - #run_file(path) ⇒ Object
 - #run_interactive ⇒ Object
 
Constructor Details
#initialize ⇒ Baba
Returns a new instance of Baba.
      10 11 12  | 
    
      # File 'lib/baba.rb', line 10 def initialize @interpreter = Interpreter.new end  | 
  
Class Method Details
.had_error ⇒ Object
      46 47 48  | 
    
      # File 'lib/baba/error.rb', line 46 def self.had_error @@had_error end  | 
  
.parser_error(token, what) ⇒ Object
      21 22 23 24 25 26 27  | 
    
      # File 'lib/baba/error.rb', line 21 def self.parser_error(token, what) if (token.type == EOF) report(token.line, "at_end #{what}") else report(token.line, "at '#{token.lexeme}', #{what}") end end  | 
  
.report(line, what, line_contents = nil, character = nil) ⇒ Object
      37 38 39 40 41 42 43 44  | 
    
      # File 'lib/baba/error.rb', line 37 def self.report(line, what, line_contents = nil, character = nil) warn "Error: #{what}\n" warn "#{line} | #{line_contents}" if line_contents warn "#{line} | " + ("~" * character) + "^ HERE" if character && line_contents warn "*" * 30 @@had_error = true end  | 
  
.runtime_error(error) ⇒ Object
      29 30 31 32 33 34 35  | 
    
      # File 'lib/baba/error.rb', line 29 def self.runtime_error(error) if error.token.nil? report(0, error.) return end report(error.token.line, error.) end  | 
  
.scanner_error(line, what, contents = nil, character = nil) ⇒ Object
      4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  | 
    
      # File 'lib/baba/error.rb', line 4 def self.scanner_error(line, what, contents = nil, character = nil) line_contents = nil line_character = nil unless contents.nil? begin line_contents = contents.split("\n")[line - 1] unless character.nil? line_character = character - contents.split("\n")[0..line].join.length end rescue ArgumentError => e warn e. end line_character = nil if line_character.negative? end report(line, what, line_contents, line_character) end  | 
  
Instance Method Details
#main ⇒ Object
      14 15 16 17 18 19 20 21 22 23  | 
    
      # File 'lib/baba.rb', line 14 def main case ARGV.length when 1 run_file(ARGV[0]) when 0 run_interactive else puts "Usage: baba [file]" end end  | 
  
#run(source) ⇒ Object
      7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
    
      # File 'lib/baba/run.rb', line 7 def run(source) scanner = Scanner.new(source) tokens = scanner.scan_tokens parser = Parser.new(tokens) statements = parser.parse return if @@had_error resolver = Resolver.new(@interpreter) resolver.resolve(statements) return if @@had_error @interpreter.interpret(statements) end  | 
  
#run_file(path) ⇒ Object
      25 26 27 28 29 30 31 32  | 
    
      # File 'lib/baba.rb', line 25 def run_file(path) f = File.open(path, "rb+") run(f.read) if @@had_error exit 1 end end  | 
  
#run_interactive ⇒ Object
      36 37 38 39 40 41 42 43 44 45  | 
    
      # File 'lib/baba.rb', line 36 def run_interactive prompt = "irbaba (#{VERSION}) > " use_history = true while buf = Readline.readline(prompt, use_history) break if buf == "exit" run(buf) @@had_error = false end end  |