myco 0.1.0.dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +2 -0
  3. data/bin/myco +7 -0
  4. data/lib/myco/backtrace.rb +56 -0
  5. data/lib/myco/bootstrap/component.rb +142 -0
  6. data/lib/myco/bootstrap/empty_object.rb +4 -0
  7. data/lib/myco/bootstrap/file_toplevel.rb +5 -0
  8. data/lib/myco/bootstrap/find_constant.rb +86 -0
  9. data/lib/myco/bootstrap/instance.rb +52 -0
  10. data/lib/myco/bootstrap/meme.rb +160 -0
  11. data/lib/myco/bootstrap/void.rb +40 -0
  12. data/lib/myco/bootstrap.my +15 -0
  13. data/lib/myco/bootstrap.rb +10 -0
  14. data/lib/myco/command.my +33 -0
  15. data/lib/myco/core/BasicObject.my +46 -0
  16. data/lib/myco/core/Category.my +5 -0
  17. data/lib/myco/core/Decorator.my +18 -0
  18. data/lib/myco/core/FileToplevel.my +23 -0
  19. data/lib/myco/core/Object.my +24 -0
  20. data/lib/myco/core/Switch.my +31 -0
  21. data/lib/myco/eval.rb +63 -0
  22. data/lib/myco/parser/ast/constant_access.rb +29 -0
  23. data/lib/myco/parser/ast/constant_define.rb +40 -0
  24. data/lib/myco/parser/ast/constant_reopen.rb +47 -0
  25. data/lib/myco/parser/ast/declare_category.rb +51 -0
  26. data/lib/myco/parser/ast/declare_decorator.rb +35 -0
  27. data/lib/myco/parser/ast/declare_file.rb +54 -0
  28. data/lib/myco/parser/ast/declare_meme.rb +44 -0
  29. data/lib/myco/parser/ast/declare_object.rb +75 -0
  30. data/lib/myco/parser/ast/declare_string.rb +37 -0
  31. data/lib/myco/parser/ast/invoke.rb +66 -0
  32. data/lib/myco/parser/ast/local_variable_access_ambiguous.rb +38 -0
  33. data/lib/myco/parser/ast/misc.rb +61 -0
  34. data/lib/myco/parser/ast/myco_module_scope.rb +58 -0
  35. data/lib/myco/parser/ast/quest.rb +82 -0
  36. data/lib/myco/parser/ast.rb +15 -0
  37. data/lib/myco/parser/builder.output +3995 -0
  38. data/lib/myco/parser/builder.racc +585 -0
  39. data/lib/myco/parser/builder.rb +1592 -0
  40. data/lib/myco/parser/lexer.rb +2306 -0
  41. data/lib/myco/parser/lexer.rl +393 -0
  42. data/lib/myco/parser/lexer_char_classes.rl +56 -0
  43. data/lib/myco/parser/lexer_common.rb +95 -0
  44. data/lib/myco/parser/lexer_skeleton.rl +154 -0
  45. data/lib/myco/parser/peg_parser.kpeg +759 -0
  46. data/lib/myco/parser/peg_parser.rb +7094 -0
  47. data/lib/myco/parser.rb +40 -0
  48. data/lib/myco/tools/OptionParser.my +38 -0
  49. data/lib/myco/tools/mycompile.my +51 -0
  50. data/lib/myco/toolset.rb +16 -0
  51. data/lib/myco/version.rb +22 -0
  52. data/lib/myco.rb +15 -0
  53. metadata +247 -0
@@ -0,0 +1,61 @@
1
+
2
+ module CodeTools::AST
3
+
4
+ module ProcessorMethods
5
+ def process_null line
6
+ NullLiteral.new line
7
+ end
8
+
9
+ def process_void line
10
+ VoidLiteral.new line
11
+ end
12
+ end
13
+
14
+ class NullLiteral < NilLiteral
15
+ def to_sexp
16
+ [:null]
17
+ end
18
+ end
19
+
20
+ # Replace NilLiteral with NullLiteral and let original NilLiteral "disappear"
21
+ NilLiteral = NullLiteral
22
+
23
+ class VoidLiteral < Node
24
+ def bytecode(g)
25
+ pos(g)
26
+
27
+ # TODO: create push_void helper to abstract this out (and elsewhere)
28
+ g.push_cpath_top
29
+ g.find_const :Myco
30
+ g.find_const :Void
31
+ end
32
+
33
+ def to_sexp
34
+ [:void]
35
+ end
36
+ end
37
+
38
+
39
+ # Patch the And (and Or) Node bytecode to use .false? to determine falsehood
40
+ # This accomodates treating Void (or any other non-builtin) as falsey
41
+ # TODO: use new branch instruction when it gets added to Rubinius
42
+ class And
43
+ def bytecode(g, use_git=true)
44
+ @left.bytecode(g)
45
+ g.dup
46
+ lbl = g.new_label
47
+
48
+ g.send :false?, 0
49
+ if use_git
50
+ g.git lbl
51
+ else
52
+ g.gif lbl
53
+ end
54
+
55
+ g.pop
56
+ @right.bytecode(g)
57
+ lbl.set!
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,58 @@
1
+
2
+ module CodeTools::AST
3
+
4
+ class MycoModuleScope < ModuleScope
5
+ def initialize(line, body)
6
+ @line = line
7
+ @name = :MycoModuleScope # TODO: remove/fix
8
+ @body = body
9
+ end
10
+
11
+ def bytecode(g)
12
+ pos(g)
13
+
14
+ attach_and_call g, :__myco_module_init__, true
15
+ end
16
+
17
+ # TODO: figure out how to keep in sync with ClosedScope#attach_and_call impl
18
+ def attach_and_call(g, arg_name, scoped=false, pass_block=false)
19
+ name = @name || arg_name
20
+ meth = new_generator(g, name)
21
+
22
+ meth.push_state self
23
+ meth.for_module_body = true
24
+
25
+ if scoped
26
+ meth.push_self
27
+ meth.add_scope
28
+ end
29
+
30
+ meth.state.push_name name
31
+
32
+ body_bytecode meth # (@body.bytecode meth) in original implementation
33
+
34
+ meth.state.pop_name
35
+
36
+ meth.ret
37
+ meth.close
38
+
39
+ meth.local_count = local_count
40
+ meth.local_names = local_names
41
+
42
+ meth.pop_state
43
+
44
+ g.create_block meth
45
+ g.swap
46
+ g.push_scope
47
+ g.push_true
48
+ g.send :call_under, 3
49
+
50
+ return meth
51
+ end
52
+
53
+ def body_bytecode g
54
+ @body.bytecode g
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,82 @@
1
+
2
+ module CodeTools::AST
3
+
4
+ module ProcessorMethods
5
+ def process_quest line, receiver, questable
6
+ Quest.new line, receiver, questable
7
+ end
8
+ end
9
+
10
+ class Quest < Node
11
+ attr_accessor :receiver
12
+ attr_accessor :questable
13
+
14
+ def initialize line, receiver, questable
15
+ @line = line
16
+ @receiver = receiver
17
+ @questable = questable
18
+
19
+ @void_literal = VoidLiteral.new @line
20
+
21
+ @questable.receiver = FakeReceiver.new @line
22
+ end
23
+
24
+ def bytecode g
25
+ pos(g)
26
+
27
+ ##
28
+ # unless @receiver.respond_to?(@questable.name).false?
29
+ # execute_statement @questable
30
+ # else
31
+ # return void
32
+ # end
33
+
34
+ else_label = g.new_label
35
+ end_label = g.new_label
36
+
37
+ @receiver.bytecode g
38
+ g.dup_top # dup the receiver to save it for later
39
+ g.push_literal @questable.name
40
+ g.send :respond_to?, 1
41
+ g.send :false?, 0
42
+ g.goto_if_true else_label
43
+
44
+ # The duped receiver is still at the top of the stack,
45
+ # and @questable.receiver has been set to an instance of FakeReceiver
46
+ # to let the true receiver pass through instead.
47
+ @questable.bytecode g
48
+ g.goto end_label
49
+
50
+ else_label.set!
51
+ g.pop # pop the duped receiver - it won't be used after all
52
+ g.push_cpath_top
53
+ g.find_const :Myco
54
+ g.find_const :Void
55
+
56
+ end_label.set!
57
+ end
58
+
59
+ def to_sexp
60
+ [:quest, @receiver.to_sexp, @questable.to_sexp]
61
+ end
62
+
63
+ class FakeReceiver < Node
64
+ def initialize line
65
+ @line = line
66
+ end
67
+
68
+ def bytecode g
69
+ pos(g)
70
+ # Do nothing here - this would normally be ill-advised,
71
+ # because Nodes are expected to push an item onto the stack,
72
+ # but here we are intentionally not doing so because
73
+ # the real receiver should already at the top of the stack
74
+ end
75
+
76
+ def to_sexp
77
+ [:qrcvr]
78
+ end
79
+ end
80
+ end
81
+
82
+ end
@@ -0,0 +1,15 @@
1
+
2
+ require_relative "ast/constant_access"
3
+ require_relative "ast/constant_define"
4
+ require_relative "ast/constant_reopen"
5
+ require_relative "ast/declare_category"
6
+ require_relative "ast/declare_decorator"
7
+ require_relative "ast/declare_file"
8
+ require_relative "ast/declare_meme"
9
+ require_relative "ast/declare_object"
10
+ require_relative "ast/declare_string"
11
+ require_relative "ast/invoke"
12
+ require_relative "ast/local_variable_access_ambiguous"
13
+ require_relative "ast/quest"
14
+
15
+ require_relative "ast/misc"