carbon-compiler 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitattributes +17 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +39 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +9 -0
- data/Vagrantfile +84 -0
- data/carbon-compiler.gemspec +28 -0
- data/lib/carbon/compiler.rb +20 -0
- data/lib/carbon/compiler/directive.rb +48 -0
- data/lib/carbon/compiler/directive/import.rb +17 -0
- data/lib/carbon/compiler/errors.rb +7 -0
- data/lib/carbon/compiler/location.rb +136 -0
- data/lib/carbon/compiler/metanostic.rb +123 -0
- data/lib/carbon/compiler/metanostic/defaults.rb +41 -0
- data/lib/carbon/compiler/metanostic/defaults.yml +138 -0
- data/lib/carbon/compiler/metanostic/diagnostic.rb +112 -0
- data/lib/carbon/compiler/metanostic/list.rb +109 -0
- data/lib/carbon/compiler/metanostic/mode.rb +162 -0
- data/lib/carbon/compiler/metanostic/state.rb +174 -0
- data/lib/carbon/compiler/metanostic/template.erb +11 -0
- data/lib/carbon/compiler/node.rb +18 -0
- data/lib/carbon/compiler/node/base.rb +213 -0
- data/lib/carbon/compiler/node/definition.rb +19 -0
- data/lib/carbon/compiler/node/definition/class.rb +24 -0
- data/lib/carbon/compiler/node/definition/class/element.rb +18 -0
- data/lib/carbon/compiler/node/definition/directive.rb +22 -0
- data/lib/carbon/compiler/node/definition/directive/function.rb +18 -0
- data/lib/carbon/compiler/node/definition/enum.rb +20 -0
- data/lib/carbon/compiler/node/definition/enum/element.rb +17 -0
- data/lib/carbon/compiler/node/definition/function.rb +44 -0
- data/lib/carbon/compiler/node/definition/function/body.rb +17 -0
- data/lib/carbon/compiler/node/definition/function/name.rb +18 -0
- data/lib/carbon/compiler/node/definition/function/parameter.rb +18 -0
- data/lib/carbon/compiler/node/definition/function/parameters.rb +17 -0
- data/lib/carbon/compiler/node/definition/module.rb +23 -0
- data/lib/carbon/compiler/node/definition/struct.rb +24 -0
- data/lib/carbon/compiler/node/definition/struct/element.rb +18 -0
- data/lib/carbon/compiler/node/etype.rb +66 -0
- data/lib/carbon/compiler/node/etype/option.rb +25 -0
- data/lib/carbon/compiler/node/etype/star.rb +13 -0
- data/lib/carbon/compiler/node/expression.rb +18 -0
- data/lib/carbon/compiler/node/expression/assignment.rb +22 -0
- data/lib/carbon/compiler/node/expression/call.rb +22 -0
- data/lib/carbon/compiler/node/expression/call/access.rb +24 -0
- data/lib/carbon/compiler/node/expression/call/attribute.rb +23 -0
- data/lib/carbon/compiler/node/expression/call/enum.rb +25 -0
- data/lib/carbon/compiler/node/expression/call/module.rb +24 -0
- data/lib/carbon/compiler/node/expression/call/parameters.rb +17 -0
- data/lib/carbon/compiler/node/expression/call/self.rb +17 -0
- data/lib/carbon/compiler/node/expression/call/unified.rb +27 -0
- data/lib/carbon/compiler/node/expression/literal.rb +83 -0
- data/lib/carbon/compiler/node/expression/operation.rb +20 -0
- data/lib/carbon/compiler/node/expression/operation/and.rb +20 -0
- data/lib/carbon/compiler/node/expression/operation/neq.rb +21 -0
- data/lib/carbon/compiler/node/expression/operation/normal.rb +20 -0
- data/lib/carbon/compiler/node/expression/operation/or.rb +20 -0
- data/lib/carbon/compiler/node/expression/unit.rb +16 -0
- data/lib/carbon/compiler/node/name.rb +27 -0
- data/lib/carbon/compiler/node/root.rb +23 -0
- data/lib/carbon/compiler/node/statement.rb +24 -0
- data/lib/carbon/compiler/node/statement/catch.rb +20 -0
- data/lib/carbon/compiler/node/statement/condition.rb +14 -0
- data/lib/carbon/compiler/node/statement/else.rb +17 -0
- data/lib/carbon/compiler/node/statement/elsif.rb +18 -0
- data/lib/carbon/compiler/node/statement/finally.rb +17 -0
- data/lib/carbon/compiler/node/statement/for.rb +18 -0
- data/lib/carbon/compiler/node/statement/if.rb +18 -0
- data/lib/carbon/compiler/node/statement/let.rb +18 -0
- data/lib/carbon/compiler/node/statement/match.rb +14 -0
- data/lib/carbon/compiler/node/statement/return.rb +17 -0
- data/lib/carbon/compiler/node/statement/try.rb +19 -0
- data/lib/carbon/compiler/node/statement/while.rb +19 -0
- data/lib/carbon/compiler/parser.rb +63 -0
- data/lib/carbon/compiler/parser/common.rb +79 -0
- data/lib/carbon/compiler/parser/expressions.rb +39 -0
- data/lib/carbon/compiler/parser/expressions/precedence.rb +134 -0
- data/lib/carbon/compiler/parser/expressions/primary.rb +120 -0
- data/lib/carbon/compiler/parser/firsts.rb +74 -0
- data/lib/carbon/compiler/parser/helpers.rb +61 -0
- data/lib/carbon/compiler/parser/root.rb +57 -0
- data/lib/carbon/compiler/parser/root/class.rb +34 -0
- data/lib/carbon/compiler/parser/root/directive.rb +87 -0
- data/lib/carbon/compiler/parser/root/enum.rb +45 -0
- data/lib/carbon/compiler/parser/root/function.rb +90 -0
- data/lib/carbon/compiler/parser/root/struct.rb +34 -0
- data/lib/carbon/compiler/parser/root/trait.rb +44 -0
- data/lib/carbon/compiler/parser/statements.rb +86 -0
- data/lib/carbon/compiler/parser/statements/if.rb +50 -0
- data/lib/carbon/compiler/parser/statements/match.rb +39 -0
- data/lib/carbon/compiler/parser/statements/try.rb +49 -0
- data/lib/carbon/compiler/project.rb +37 -0
- data/lib/carbon/compiler/project/file.rb +64 -0
- data/lib/carbon/compiler/scanner.rb +82 -0
- data/lib/carbon/compiler/scanner/main.rb +76 -0
- data/lib/carbon/compiler/scanner/token.rb +58 -0
- data/lib/carbon/compiler/version.rb +8 -0
- data/lib/carbon/compiler/visitor.rb +13 -0
- data/lib/carbon/compiler/visitor/base.rb +52 -0
- data/lib/carbon/compiler/visitor/generation.rb +45 -0
- data/lib/carbon/compiler/visitor/generation/asserts.rb +30 -0
- data/lib/carbon/compiler/visitor/generation/class.rb +93 -0
- data/lib/carbon/compiler/visitor/generation/context.rb +75 -0
- data/lib/carbon/compiler/visitor/generation/expressions.rb +82 -0
- data/lib/carbon/compiler/visitor/generation/expressions/assignment.rb +105 -0
- data/lib/carbon/compiler/visitor/generation/expressions/calls.rb +89 -0
- data/lib/carbon/compiler/visitor/generation/function.rb +68 -0
- data/lib/carbon/compiler/visitor/generation/statements.rb +131 -0
- data/lib/carbon/compiler/visitor/generation/struct.rb +115 -0
- data/lib/carbon/compiler/visitor/preparation.rb +86 -0
- data/lib/carbon/compiler/visitor/preparation/expressions.rb +26 -0
- data/lib/carbon/compiler/visitor/preparation/function.rb +55 -0
- data/lib/carbon/compiler/visitor/preparation/statements.rb +73 -0
- data/lib/carbon/compiler/visitor/preparation/struct.rb +37 -0
- data/program.ca +16 -0
- data/test.rb +21 -0
- metadata +234 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/definition/directive"
|
5
|
+
require "carbon/compiler/node/definition/enum"
|
6
|
+
require "carbon/compiler/node/definition/function"
|
7
|
+
require "carbon/compiler/node/definition/module"
|
8
|
+
require "carbon/compiler/node/definition/struct"
|
9
|
+
|
10
|
+
module Carbon
|
11
|
+
module Compiler
|
12
|
+
module Node
|
13
|
+
# A Definition. This is in most cases a module, function, struct, enum,
|
14
|
+
# trait, or directive.
|
15
|
+
module Definition
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/definition/struct/element"
|
5
|
+
|
6
|
+
module Carbon
|
7
|
+
module Compiler
|
8
|
+
module Node
|
9
|
+
module Definition
|
10
|
+
# A class definition. This sets up a structured block of memory
|
11
|
+
# for various purposes. A Class's children are its elements.
|
12
|
+
class Class < Base
|
13
|
+
# If this definition is a data definition. A Structure is one of
|
14
|
+
# many possible data definitions.
|
15
|
+
#
|
16
|
+
# @return [true]
|
17
|
+
def data?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Class < Base
|
9
|
+
# An element of a class. This contains name and type information for
|
10
|
+
# a class element.
|
11
|
+
class Element < Base
|
12
|
+
attributes name: 0, type: 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/definition/directive/function"
|
5
|
+
|
6
|
+
module Carbon
|
7
|
+
module Compiler
|
8
|
+
module Node
|
9
|
+
module Definition
|
10
|
+
# A directive. This is normally anything that starts with a colon
|
11
|
+
# in the source file. This contains information about said directive.
|
12
|
+
class Directive < Base
|
13
|
+
attributes name: 0, parameters: 1
|
14
|
+
|
15
|
+
def value
|
16
|
+
name.value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Directive < Base
|
9
|
+
# A directive "function." Mainly, this is a key-value store, with
|
10
|
+
# the keys being the names of the parameters and the values being
|
11
|
+
# the types of the parameters.
|
12
|
+
class Function < Base
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/definition/enum/element"
|
5
|
+
|
6
|
+
module Carbon
|
7
|
+
module Compiler
|
8
|
+
module Node
|
9
|
+
module Definition
|
10
|
+
# An Enum definition. Enums contain a set of elements that have
|
11
|
+
# associated type or value information.
|
12
|
+
class Enum < Base
|
13
|
+
def data?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Enum < Base
|
9
|
+
# An element of an Enumerable. This contains either type or value
|
10
|
+
# information.
|
11
|
+
class Element < Base
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/definition/function/parameter"
|
5
|
+
require "carbon/compiler/node/definition/function/parameters"
|
6
|
+
require "carbon/compiler/node/definition/function/body"
|
7
|
+
require "carbon/compiler/node/definition/function/name"
|
8
|
+
|
9
|
+
module Carbon
|
10
|
+
module Compiler
|
11
|
+
module Node
|
12
|
+
module Definition
|
13
|
+
# A function definition. This contains information about the arguments
|
14
|
+
# to be passed to the function, the "klass" (type) or return type of
|
15
|
+
# the function, the body of a function (if an extern function, this
|
16
|
+
# is null), and the associated {Project::Function} information, when
|
17
|
+
# tied.
|
18
|
+
class Function < Base
|
19
|
+
attributes _name: 0, parameters: 1, type: 2, body: 3
|
20
|
+
|
21
|
+
# If this definition is a behavior definition. Functions are the
|
22
|
+
# only behavior definitions in a module.
|
23
|
+
#
|
24
|
+
# @return [true]
|
25
|
+
def behavior?
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
# The name of the function. This is used in place of an actual
|
30
|
+
# node for various reasons.
|
31
|
+
#
|
32
|
+
# @return [String]
|
33
|
+
def name
|
34
|
+
@children[0].name.value
|
35
|
+
end
|
36
|
+
|
37
|
+
def generics
|
38
|
+
@children[0].generics
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Function < Base
|
9
|
+
# The body of a function. This acts an array containing all of the
|
10
|
+
# statements that make up a function.
|
11
|
+
class Body < Base
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Function < Base
|
9
|
+
# The name of the function. Note that this is mostly unused right
|
10
|
+
# now due to various reasons.
|
11
|
+
class Name < Base
|
12
|
+
attributes name: 0, generics: 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Function < Base
|
9
|
+
# An argument to a function. This contains name and "klass" (type)
|
10
|
+
# information for a specific argument.
|
11
|
+
class Parameter < Base
|
12
|
+
attributes name: 0, type: 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Function < Base
|
9
|
+
# Arguments to a function. This will eventually be turned directly
|
10
|
+
# into an array passed to functions.
|
11
|
+
class Parameters < Base
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
# A module definition. This has one child, a {ModuleName} node.
|
9
|
+
class Module < Base
|
10
|
+
attributes name: 0
|
11
|
+
|
12
|
+
# If this definition is an identity definition. Module definitions
|
13
|
+
# are the only identity definitions in a module.
|
14
|
+
#
|
15
|
+
# @return [true]
|
16
|
+
def identity?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/definition/struct/element"
|
5
|
+
|
6
|
+
module Carbon
|
7
|
+
module Compiler
|
8
|
+
module Node
|
9
|
+
module Definition
|
10
|
+
# A struct definition. This sets up a structured block of memory
|
11
|
+
# for various purposes. A Struct's children are its elements.
|
12
|
+
class Struct < Base
|
13
|
+
# If this definition is a data definition. A Structure is one of
|
14
|
+
# many possible data definitions.
|
15
|
+
#
|
16
|
+
# @return [true]
|
17
|
+
def data?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
module Definition
|
8
|
+
class Struct < Base
|
9
|
+
# An element of a struct. This contains name and "klass" (type)
|
10
|
+
# information for a structure element.
|
11
|
+
class Element < Base
|
12
|
+
attributes name: 0, type: 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "carbon/compiler/node/etype/option"
|
5
|
+
require "carbon/compiler/node/etype/star"
|
6
|
+
|
7
|
+
module Carbon
|
8
|
+
module Compiler
|
9
|
+
module Node
|
10
|
+
class EType < Base
|
11
|
+
def expand(file, typify = true)
|
12
|
+
catch(:invalid) { check_valid_parts(file) } or return {}
|
13
|
+
return blank_mapping if clean?
|
14
|
+
|
15
|
+
# now we know that children[0..-2] are all parts and children[-1] is
|
16
|
+
# an option... we just have to expand the option now.
|
17
|
+
children[-1].expand(file).map do |key, value|
|
18
|
+
value = children[0..-2].concat(value)
|
19
|
+
|
20
|
+
if typify
|
21
|
+
{ Concrete::Type.new(Concrete::Type::Name.new([key], nil)) =>
|
22
|
+
Concrete::Type.new(Concrete::Type::Name.new(value, nil)) }
|
23
|
+
else
|
24
|
+
{ key => value }
|
25
|
+
end
|
26
|
+
end.inject(:merge)
|
27
|
+
end
|
28
|
+
|
29
|
+
def clean?
|
30
|
+
children.none? { |c| c.is_a?(Base) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_type
|
34
|
+
return unless clean?
|
35
|
+
Concrete::Type.new(Concrete::Type::Name.new(children, nil),
|
36
|
+
location: location)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def blank_mapping
|
42
|
+
type = Concrete::Type.new(Concrete::Type::Name.new([children.last],
|
43
|
+
nil))
|
44
|
+
{ type => to_type }
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_valid_parts(file)
|
48
|
+
error_misplaced_option(file) && throw(:invalid) if children[0..-2]\
|
49
|
+
.any? { |c| c.is_a?(Base) }
|
50
|
+
error_included_star(file) && throw(:invalid) if children[-1]\
|
51
|
+
.is_a?(EType::Star)
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
55
|
+
def error_misplaced_option(file)
|
56
|
+
file.emit("Module/Name/InvalidExtended", node.location)
|
57
|
+
end
|
58
|
+
|
59
|
+
def error_included_star(file)
|
60
|
+
file.emit("System/Error", node.location,
|
61
|
+
"Cannot handle star extended types")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Compiler
|
6
|
+
module Node
|
7
|
+
class EType < Base
|
8
|
+
class Option < Base
|
9
|
+
def expand(file)
|
10
|
+
children.map do |child|
|
11
|
+
# child.is_a?(Node::EType) # => true
|
12
|
+
if child.clean?
|
13
|
+
type = child.to_type
|
14
|
+
last = type.name.parts.last
|
15
|
+
{ last => type.name.parts }
|
16
|
+
else
|
17
|
+
child.expand(file, false)
|
18
|
+
end
|
19
|
+
end.inject(:merge)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|