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 |