turmali 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +61 -0
- data/Rakefile +6 -0
- data/bin/tml +31 -0
- data/lib/.DS_Store +0 -0
- data/lib/turmali.rb +2 -0
- data/lib/turmali/.DS_Store +0 -0
- data/lib/turmali/grammar.y +228 -0
- data/lib/turmali/interpreter.rb +156 -0
- data/lib/turmali/lexer.rb +129 -0
- data/lib/turmali/nodes.rb +88 -0
- data/lib/turmali/parser.rb +683 -0
- data/lib/turmali/runtime/bootstrap.rb +48 -0
- data/lib/turmali/runtime/class.rb +36 -0
- data/lib/turmali/runtime/context.rb +9 -0
- data/lib/turmali/runtime/method.rb +20 -0
- data/lib/turmali/runtime/object.rb +19 -0
- data/lib/turmali/version.rb +3 -0
- data/turmali.gemspec +36 -0
- metadata +113 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
require "turmali/parser"
|
2
|
+
require "turmali/runtime/object"
|
3
|
+
require "turmali/runtime/method"
|
4
|
+
require "turmali/runtime/context"
|
5
|
+
require "turmali/runtime/class"
|
6
|
+
require "turmali/runtime/bootstrap"
|
7
|
+
|
8
|
+
# First, we create an simple wrapper class to encapsulate the interpretation process.
|
9
|
+
# All this does is parse the code and call `eval` on the node at the top of the AST.
|
10
|
+
class Interpreter
|
11
|
+
def initialize
|
12
|
+
@parser = Parser.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def eval(code)
|
16
|
+
@parser.parse(code).eval(RootContext)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# The `Nodes` class will always be at the top of the AST. Its only purpose it to
|
21
|
+
# contain other nodes. It correspond to a block of code or a series of expressions.
|
22
|
+
#
|
23
|
+
# The `eval` method of every node is the "interpreter" part of our language.
|
24
|
+
# All nodes know how to evalualte themselves and return the result of their evaluation.
|
25
|
+
# The `context` variable is the `Context` in which the node is evaluated (local
|
26
|
+
# variables, current self and current class).
|
27
|
+
class Nodes
|
28
|
+
def eval(context)
|
29
|
+
return_value = nil
|
30
|
+
nodes.each do |node|
|
31
|
+
return_value = node.eval(context)
|
32
|
+
end
|
33
|
+
return_value || Constants["nil"] # Last result is return value (or nil if none).
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# We're using `Constants` that we created before when bootstrapping the runtime to access
|
38
|
+
# the objects and classes from inside the runtime.
|
39
|
+
#
|
40
|
+
# Next, we implement `eval` on other node types. Think of that `eval` method as how the
|
41
|
+
# node bring itself to life inside the runtime.
|
42
|
+
class NumberNode
|
43
|
+
def eval(context)
|
44
|
+
Constants["Number"].new_with_value(value)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class StringNode
|
49
|
+
def eval(context)
|
50
|
+
Constants["String"].new_with_value(value)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class TrueNode
|
55
|
+
def eval(context)
|
56
|
+
Constants["true"]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class FalseNode
|
61
|
+
def eval(context)
|
62
|
+
Constants["false"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class NilNode
|
67
|
+
def eval(context)
|
68
|
+
Constants["nil"]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class GetConstantNode
|
73
|
+
def eval(context)
|
74
|
+
Constants[name]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class GetLocalNode
|
79
|
+
def eval(context)
|
80
|
+
context.locals[name]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# When setting the value of a constant or a local variable, the `value` attribute
|
85
|
+
# is a node, created by the parser. We need to evaluate the node first, to convert
|
86
|
+
# it to an object, before storing it into a variable or constant.
|
87
|
+
class SetConstantNode
|
88
|
+
def eval(context)
|
89
|
+
Constants[name] = value.eval(context)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class SetLocalNode
|
94
|
+
def eval(context)
|
95
|
+
context.locals[name] = value.eval(context)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# The `CallNode` for calling a method is a little more complex. It needs to set the receiver
|
100
|
+
# first and then evaluate the arguments before calling the method.
|
101
|
+
class CallNode
|
102
|
+
def eval(context)
|
103
|
+
if receiver
|
104
|
+
value = receiver.eval(context)
|
105
|
+
else
|
106
|
+
value = context.current_self # Default to `self` if no receiver.
|
107
|
+
end
|
108
|
+
|
109
|
+
evaluated_arguments = arguments.map { |arg| arg.eval(context) }
|
110
|
+
value.call(method, evaluated_arguments)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Defining a method, using the `def` keyword, is done by adding a method to the current class.
|
115
|
+
class DefNode
|
116
|
+
def eval(context)
|
117
|
+
method = TurmaliMethod.new(params, body)
|
118
|
+
context.current_class.runtime_methods[name] = method
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Defining a class is done in three steps:
|
123
|
+
#
|
124
|
+
# 1. Reopen or define the class.
|
125
|
+
# 2. Create a special context of evaluation (set `current_self` and `current_class` to the new class).
|
126
|
+
# 3. Evaluate the body of the class inside that context.
|
127
|
+
#
|
128
|
+
# Check back how `DefNode` was implemented, adding methods to `context.current_class`. Here is
|
129
|
+
# where we set the value of `current_class`.
|
130
|
+
class ClassNode
|
131
|
+
def eval(context)
|
132
|
+
turmali_class = Constants[name] # Check if class is already defined
|
133
|
+
|
134
|
+
unless turmali_class # Class doesn't exist yet
|
135
|
+
turmali_class = TurmaliClass.new
|
136
|
+
Constants[name] = turmali_class # Define the class in the runtime
|
137
|
+
end
|
138
|
+
|
139
|
+
class_context = Context.new(turmali_class, turmali_class)
|
140
|
+
body.eval(class_context)
|
141
|
+
|
142
|
+
turmali_class
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Finally, to implement `if` in our language,
|
147
|
+
# we turn the condition node into a Ruby value to use Ruby's `if`.
|
148
|
+
class IfNode
|
149
|
+
def eval(context)
|
150
|
+
if condition.eval(context).ruby_value
|
151
|
+
body.eval(context)
|
152
|
+
else # If no body is evaluated, we return nil.
|
153
|
+
Constants["nil"]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# Our lexer will be used like so: `Lexer.new.tokenize("code")`,
|
2
|
+
# and will return an array of tokens (a token being a tuple of `[TOKEN_TYPE, TOKEN_VALUE]`).
|
3
|
+
class Lexer
|
4
|
+
# First we define the special keywords of our language in a constant.
|
5
|
+
# It will be used later on in the tokenizing process to disambiguate
|
6
|
+
# an identifier (method name, local variable, etc.) from a keyword.
|
7
|
+
KEYWORDS = ["def", "class", "if", "true", "false", "nil"]
|
8
|
+
|
9
|
+
def tokenize(code)
|
10
|
+
code.chomp! # Remove extra line breaks
|
11
|
+
tokens = [] # This will hold the generated tokens
|
12
|
+
|
13
|
+
# We need to know how deep we are in the indentation so
|
14
|
+
# we keep track of the current indentation level we are in, and previous ones in the stack
|
15
|
+
# so that when we dedent, we can check if we're on the correct level.
|
16
|
+
current_indent = 0 # number of spaces in the last indent
|
17
|
+
indent_stack = []
|
18
|
+
|
19
|
+
# Here is how to implement a very simple scanner.
|
20
|
+
# Advance one character at the time until you find something to parse.
|
21
|
+
# We'll use regular expressions to scan from the current position (`i`)
|
22
|
+
# up to the end of the code.
|
23
|
+
i = 0 # Current character position
|
24
|
+
while i < code.size
|
25
|
+
chunk = code[i..-1]
|
26
|
+
|
27
|
+
# Each of the following `if/elsif`s will test the current code chunk with
|
28
|
+
# a regular expression. The order is important as we want to match `if`
|
29
|
+
# as a keyword, and not a method name, we'll need to apply it first.
|
30
|
+
#
|
31
|
+
# First, we'll scan for names: method names and variable names, which we'll call identifiers.
|
32
|
+
# Also scanning for special reserved keywords such as `if`, `def`
|
33
|
+
# and `true`.
|
34
|
+
if identifier = chunk[/\A([a-z]\w*)/, 1]
|
35
|
+
if KEYWORDS.include?(identifier) # keywords will generate [:IF, "if"]
|
36
|
+
tokens << [identifier.upcase.to_sym, identifier]
|
37
|
+
else
|
38
|
+
tokens << [:IDENTIFIER, identifier]
|
39
|
+
end
|
40
|
+
i += identifier.size # skip what we just parsed
|
41
|
+
|
42
|
+
# Now scanning for constants, names starting with a capital letter.
|
43
|
+
# Which means, class names are constants in our language.
|
44
|
+
elsif constant = chunk[/\A([A-Z]\w*)/, 1]
|
45
|
+
tokens << [:CONSTANT, constant]
|
46
|
+
i += constant.size
|
47
|
+
|
48
|
+
# Next, matching numbers. Our language will only support integers. But to add support for floats,
|
49
|
+
# you'd simply need to add a similar rule and adapt the regular expression accordingly.
|
50
|
+
elsif number = chunk[/\A([0-9]+)/, 1]
|
51
|
+
tokens << [:NUMBER, number.to_i]
|
52
|
+
i += number.size
|
53
|
+
|
54
|
+
# Of course, matching strings too. Anything between `"..."`.
|
55
|
+
elsif string = chunk[/\A"([^"]*)"/, 1]
|
56
|
+
tokens << [:STRING, string]
|
57
|
+
i += string.size + 2 # skip two more to exclude the `"`.
|
58
|
+
|
59
|
+
# And here's the indentation magic! We have to take care of 3 cases:
|
60
|
+
#
|
61
|
+
# if true: # 1) The block is created.
|
62
|
+
# line 1
|
63
|
+
# line 2 # 2) New line inside a block, at the same level.
|
64
|
+
# continue # 3) Dedent.
|
65
|
+
#
|
66
|
+
# This `elsif` takes care of the first case. The number of spaces will determine
|
67
|
+
# the indent level.
|
68
|
+
elsif indent = chunk[/\A\:\n( +)/m, 1] # Matches ": <newline> <spaces>"
|
69
|
+
if indent.size <= current_indent # indent should go up when creating a block
|
70
|
+
raise "Bad indent level, got #{indent.size} indents, " +
|
71
|
+
"expected > #{current_indent}"
|
72
|
+
end
|
73
|
+
current_indent = indent.size
|
74
|
+
indent_stack.push(current_indent)
|
75
|
+
tokens << [:INDENT, indent.size]
|
76
|
+
i += indent.size + 2
|
77
|
+
|
78
|
+
# The next `elsif` takes care of the two last cases:
|
79
|
+
#
|
80
|
+
# * Case 2: We stay in the same block if the indent level (number of spaces) is the
|
81
|
+
# same as `current_indent`.
|
82
|
+
# * Case 3: Close the current block, if indent level is lower than `current_indent`.
|
83
|
+
elsif indent = chunk[/\A\n( *)/m, 1] # Matches "<newline> <spaces>"
|
84
|
+
if indent.size == current_indent # Case 2
|
85
|
+
tokens << [:NEWLINE, "\n"] # Nothing to do, we're still in the same block
|
86
|
+
elsif indent.size < current_indent # Case 3
|
87
|
+
while indent.size < current_indent
|
88
|
+
indent_stack.pop
|
89
|
+
current_indent = indent_stack.last || 0
|
90
|
+
tokens << [:DEDENT, indent.size]
|
91
|
+
end
|
92
|
+
tokens << [:NEWLINE, "\n"]
|
93
|
+
else # indent.size > current_indent, error!
|
94
|
+
raise "Missing ':'" # Cannot increase indent level without using ":"
|
95
|
+
end
|
96
|
+
i += indent.size + 1
|
97
|
+
|
98
|
+
# Long operators such as `||`, `&&`, `==`, etc.
|
99
|
+
# will be matched by the following block.
|
100
|
+
# One character long operators are matched by the catch all `else` at the bottom.
|
101
|
+
elsif operator = chunk[/\A(\|\||&&|==|!=|<=|>=)/, 1]
|
102
|
+
tokens << [operator, operator]
|
103
|
+
i += operator.size
|
104
|
+
|
105
|
+
# We're ignoring spaces. Contrary to line breaks, spaces are meaningless in our language.
|
106
|
+
# That's why we don't create tokens for them. They are only used to separate other tokens.
|
107
|
+
elsif chunk.match(/\A /)
|
108
|
+
i += 1
|
109
|
+
|
110
|
+
# Finally, catch all single characters, mainly operators.
|
111
|
+
# We treat all other single characters as a token. Eg.: `( ) , . ! + - <`.
|
112
|
+
else
|
113
|
+
value = chunk[0,1]
|
114
|
+
tokens << [value, value]
|
115
|
+
i += 1
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
# Close all open blocks. If the code ends without dedenting, this will take care of
|
122
|
+
# balancing the `INDENT`...`DEDENT`s.
|
123
|
+
while indent = indent_stack.pop
|
124
|
+
tokens << [:DEDENT, indent_stack.first || 0]
|
125
|
+
end
|
126
|
+
|
127
|
+
tokens
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# The first type is responsible for holding a collection of nodes,
|
2
|
+
# each one representing an expression. You can think of it as the internal
|
3
|
+
# representation of a block of code.
|
4
|
+
#
|
5
|
+
# Here we define nodes as Ruby classes that inherit from a `Struct`. This is a
|
6
|
+
# simple way, in Ruby, to create a class that holds some attributes (values).
|
7
|
+
# It is almost equivalent to:
|
8
|
+
#
|
9
|
+
# class Nodes
|
10
|
+
# def initialize(nodes)
|
11
|
+
# @nodes = nodes
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# def nodes
|
15
|
+
# @nodes
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# n = Nodes.new("this is stored @nodes")
|
20
|
+
# n.nodes # => "this is stored @nodes"
|
21
|
+
#
|
22
|
+
# But Ruby's `Struct` takes care of overriding the `==` operator for us and a bunch of
|
23
|
+
# other things that will make testing easier.
|
24
|
+
class Nodes < Struct.new(:nodes)
|
25
|
+
def <<(node) # Useful method for adding a node on the fly.
|
26
|
+
nodes << node
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Literals are static values that have a Ruby representation. For example, a string, a number,
|
32
|
+
# `true`, `false`, `nil`, etc. We define a node for each one of those and store their Ruby
|
33
|
+
# representation inside their `value` attribute.
|
34
|
+
class LiteralNode < Struct.new(:value); end
|
35
|
+
|
36
|
+
class NumberNode < LiteralNode; end
|
37
|
+
|
38
|
+
class StringNode < LiteralNode; end
|
39
|
+
|
40
|
+
class TrueNode < LiteralNode
|
41
|
+
def initialize
|
42
|
+
super(true)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class FalseNode < LiteralNode
|
47
|
+
def initialize
|
48
|
+
super(false)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class NilNode < LiteralNode
|
53
|
+
def initialize
|
54
|
+
super(nil)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# The node for a method call holds the `receiver`,
|
59
|
+
# the object on which the method is called, the `method` name and its
|
60
|
+
# arguments, which are other nodes.
|
61
|
+
class CallNode < Struct.new(:receiver, :method, :arguments); end
|
62
|
+
|
63
|
+
# Retrieving the value of a constant by its `name` is done by the following node.
|
64
|
+
class GetConstantNode < Struct.new(:name); end
|
65
|
+
|
66
|
+
# And setting its value is done by this one. The `value` will be a node. If we're
|
67
|
+
# storing a number inside a constant, for example, `value` would contain an instance
|
68
|
+
# of `NumberNode`.
|
69
|
+
class SetConstantNode < Struct.new(:name, :value); end
|
70
|
+
|
71
|
+
# Similar to the previous nodes, the next ones are for dealing with local variables.
|
72
|
+
class GetLocalNode < Struct.new(:name); end
|
73
|
+
|
74
|
+
class SetLocalNode < Struct.new(:name, :value); end
|
75
|
+
|
76
|
+
# Each method definition will be stored into the following node. It holds the `name` of the method,
|
77
|
+
# the name of its parameters (`params`) and the `body` to evaluate when the method is called, which
|
78
|
+
# is a tree of node, the root one being a `Nodes` instance.
|
79
|
+
class DefNode < Struct.new(:name, :params, :body); end
|
80
|
+
|
81
|
+
# Class definitions are stored into the following node. Once again, the `name` of the class and
|
82
|
+
# its `body`, a tree of nodes.
|
83
|
+
class ClassNode < Struct.new(:name, :body); end
|
84
|
+
|
85
|
+
# `if` control structures are stored in a node of their own. The `condition` and `body` will also
|
86
|
+
# be nodes that need to be evaluated at some point.
|
87
|
+
# Look at this node if you want to implement other control structures like `while`, `for`, `loop`, etc.
|
88
|
+
class IfNode < Struct.new(:condition, :body); end
|
@@ -0,0 +1,683 @@
|
|
1
|
+
#
|
2
|
+
# DO NOT MODIFY!!!!
|
3
|
+
# This file is automatically generated by Racc 1.4.6
|
4
|
+
# from Racc grammer file "".
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'racc/parser.rb'
|
8
|
+
|
9
|
+
require "turmali/lexer"
|
10
|
+
require "turmali/nodes"
|
11
|
+
|
12
|
+
class Parser < Racc::Parser
|
13
|
+
|
14
|
+
module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 220)
|
15
|
+
def parse(code, show_tokens=false)
|
16
|
+
@tokens = Lexer.new.tokenize(code) # Tokenize the code using our lexer
|
17
|
+
puts @tokens.inspect if show_tokens
|
18
|
+
do_parse # Kickoff the parsing process
|
19
|
+
end
|
20
|
+
|
21
|
+
def next_token
|
22
|
+
@tokens.shift
|
23
|
+
end
|
24
|
+
...end grammar.y/module_eval...
|
25
|
+
##### State transition tables begin ###
|
26
|
+
|
27
|
+
racc_action_table = [
|
28
|
+
27, 25, 26, 16, 18, 19, 20, 21, 22, 23,
|
29
|
+
24, 27, 25, 26, 16, 18, 19, 20, 21, 22,
|
30
|
+
23, 24, 30, 72, 41, 42, 39, 40, 53, 15,
|
31
|
+
30, 17, 41, 42, 39, 40, 30, 16, 16, 30,
|
32
|
+
15, 74, 17, 27, 25, 26, 84, 18, 19, 20,
|
33
|
+
21, 22, 23, 24, 27, 25, 26, 45, 18, 19,
|
34
|
+
20, 21, 22, 23, 24, 17, 17, 30, 72, 41,
|
35
|
+
42, 47, 15, 68, 30, 82, 41, 42, 39, 40,
|
36
|
+
27, 25, 26, 15, 18, 19, 20, 21, 22, 23,
|
37
|
+
24, 27, 25, 26, 48, 18, 19, 20, 21, 22,
|
38
|
+
23, 24, 30, 28, 41, 42, 27, 25, 26, 15,
|
39
|
+
18, 19, 20, 21, 22, 23, 24, 27, 25, 26,
|
40
|
+
15, 18, 19, 20, 21, 22, 23, 24, 86, 79,
|
41
|
+
85, 78, 27, 25, 26, 15, 18, 19, 20, 21,
|
42
|
+
22, 23, 24, 27, 25, 26, 15, 18, 19, 20,
|
43
|
+
21, 22, 23, 24, 46, 49, 45, 51, 27, 25,
|
44
|
+
26, 15, 18, 19, 20, 21, 22, 23, 24, 27,
|
45
|
+
25, 26, 15, 18, 19, 20, 21, 22, 23, 24,
|
46
|
+
72, 88, nil, nil, 27, 25, 26, 15, 18, 19,
|
47
|
+
20, 21, 22, 23, 24, 27, 25, 26, 15, 18,
|
48
|
+
19, 20, 21, 22, 23, 24, nil, nil, nil, nil,
|
49
|
+
27, 25, 26, 15, 18, 19, 20, 21, 22, 23,
|
50
|
+
24, 27, 25, 26, 15, 18, 19, 20, 21, 22,
|
51
|
+
23, 24, nil, nil, nil, nil, 27, 25, 26, 15,
|
52
|
+
18, 19, 20, 21, 22, 23, 24, 27, 25, 26,
|
53
|
+
15, 18, 19, 20, 21, 22, 23, 24, nil, nil,
|
54
|
+
nil, nil, 27, 25, 26, 15, 18, 19, 20, 21,
|
55
|
+
22, 23, 24, 27, 25, 26, 15, 18, 19, 20,
|
56
|
+
21, 22, 23, 24, nil, nil, nil, nil, 27, 25,
|
57
|
+
26, 15, 18, 19, 20, 21, 22, 23, 24, nil,
|
58
|
+
nil, 30, 15, 41, 42, 39, 40, 35, 36, 37,
|
59
|
+
38, 33, 34, 32, 31, nil, nil, 15, 66, 72,
|
60
|
+
nil, 30, nil, 41, 42, 39, 40, 35, 36, 37,
|
61
|
+
38, 33, 34, 32, 31, 30, nil, 41, 42, 39,
|
62
|
+
40, 35, 36, 37, 38, 33, 34, 32, 31, 30,
|
63
|
+
nil, 41, 42, 39, 40, 35, 36, 37, 38, 33,
|
64
|
+
34, 32, 31, 30, nil, 41, 42, 39, 40, 35,
|
65
|
+
36, 37, 38, 33, 34, 32, 31, 30, nil, 41,
|
66
|
+
42, 39, 40, 35, 36, 37, 38, 33, 34, 32,
|
67
|
+
31, 30, nil, 41, 42, 39, 40, 35, 36, 37,
|
68
|
+
38, 33, 34, 32, 31, 30, nil, 41, 42, 39,
|
69
|
+
40, 35, 36, 37, 38, 33, 34, 32, 31, 30,
|
70
|
+
nil, 41, 42, 39, 40, 35, 36, 37, 38, 33,
|
71
|
+
34, 32, 30, nil, 41, 42, 39, 40, 35, 36,
|
72
|
+
37, 38, 33, 34, 30, nil, 41, 42, 39, 40,
|
73
|
+
35, 36, 37, 38, 30, nil, 41, 42, 39, 40,
|
74
|
+
35, 36, 37, 38, 30, nil, 41, 42, 39, 40 ]
|
75
|
+
|
76
|
+
racc_action_check = [
|
77
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
78
|
+
0, 72, 72, 72, 72, 72, 72, 72, 72, 72,
|
79
|
+
72, 72, 61, 48, 61, 61, 61, 61, 30, 0,
|
80
|
+
60, 0, 60, 60, 60, 60, 64, 80, 2, 65,
|
81
|
+
72, 48, 72, 45, 45, 45, 80, 45, 45, 45,
|
82
|
+
45, 45, 45, 45, 29, 29, 29, 53, 29, 29,
|
83
|
+
29, 29, 29, 29, 29, 80, 2, 62, 49, 62,
|
84
|
+
62, 24, 45, 45, 58, 74, 58, 58, 58, 58,
|
85
|
+
15, 15, 15, 29, 15, 15, 15, 15, 15, 15,
|
86
|
+
15, 40, 40, 40, 25, 40, 40, 40, 40, 40,
|
87
|
+
40, 40, 63, 1, 63, 63, 41, 41, 41, 15,
|
88
|
+
41, 41, 41, 41, 41, 41, 41, 47, 47, 47,
|
89
|
+
40, 47, 47, 47, 47, 47, 47, 47, 81, 69,
|
90
|
+
81, 69, 46, 46, 46, 41, 46, 46, 46, 46,
|
91
|
+
46, 46, 46, 27, 27, 27, 47, 27, 27, 27,
|
92
|
+
27, 27, 27, 27, 23, 26, 23, 28, 39, 39,
|
93
|
+
39, 46, 39, 39, 39, 39, 39, 39, 39, 79,
|
94
|
+
79, 79, 27, 79, 79, 79, 79, 79, 79, 79,
|
95
|
+
85, 86, nil, nil, 42, 42, 42, 39, 42, 42,
|
96
|
+
42, 42, 42, 42, 42, 38, 38, 38, 79, 38,
|
97
|
+
38, 38, 38, 38, 38, 38, nil, nil, nil, nil,
|
98
|
+
32, 32, 32, 42, 32, 32, 32, 32, 32, 32,
|
99
|
+
32, 33, 33, 33, 38, 33, 33, 33, 33, 33,
|
100
|
+
33, 33, nil, nil, nil, nil, 34, 34, 34, 32,
|
101
|
+
34, 34, 34, 34, 34, 34, 34, 35, 35, 35,
|
102
|
+
33, 35, 35, 35, 35, 35, 35, 35, nil, nil,
|
103
|
+
nil, nil, 36, 36, 36, 34, 36, 36, 36, 36,
|
104
|
+
36, 36, 36, 37, 37, 37, 35, 37, 37, 37,
|
105
|
+
37, 37, 37, 37, nil, nil, nil, nil, 31, 31,
|
106
|
+
31, 36, 31, 31, 31, 31, 31, 31, 31, nil,
|
107
|
+
nil, 43, 37, 43, 43, 43, 43, 43, 43, 43,
|
108
|
+
43, 43, 43, 43, 43, nil, nil, 31, 43, 50,
|
109
|
+
nil, 50, nil, 50, 50, 50, 50, 50, 50, 50,
|
110
|
+
50, 50, 50, 50, 50, 3, nil, 3, 3, 3,
|
111
|
+
3, 3, 3, 3, 3, 3, 3, 3, 3, 52,
|
112
|
+
nil, 52, 52, 52, 52, 52, 52, 52, 52, 52,
|
113
|
+
52, 52, 52, 83, nil, 83, 83, 83, 83, 83,
|
114
|
+
83, 83, 83, 83, 83, 83, 83, 70, nil, 70,
|
115
|
+
70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
|
116
|
+
70, 71, nil, 71, 71, 71, 71, 71, 71, 71,
|
117
|
+
71, 71, 71, 71, 71, 67, nil, 67, 67, 67,
|
118
|
+
67, 67, 67, 67, 67, 67, 67, 67, 67, 54,
|
119
|
+
nil, 54, 54, 54, 54, 54, 54, 54, 54, 54,
|
120
|
+
54, 54, 55, nil, 55, 55, 55, 55, 55, 55,
|
121
|
+
55, 55, 55, 55, 57, nil, 57, 57, 57, 57,
|
122
|
+
57, 57, 57, 57, 56, nil, 56, 56, 56, 56,
|
123
|
+
56, 56, 56, 56, 59, nil, 59, 59, 59, 59 ]
|
124
|
+
|
125
|
+
racc_action_pointer = [
|
126
|
+
-2, 103, 33, 320, nil, nil, nil, nil, nil, nil,
|
127
|
+
nil, nil, nil, nil, nil, 78, nil, nil, nil, nil,
|
128
|
+
nil, nil, nil, 125, 42, 83, 143, 141, 157, 52,
|
129
|
+
17, 286, 208, 219, 234, 245, 260, 271, 193, 156,
|
130
|
+
89, 104, 182, 286, nil, 41, 130, 115, 10, 55,
|
131
|
+
306, nil, 334, 26, 404, 417, 439, 429, 59, 449,
|
132
|
+
15, 7, 52, 87, 21, 24, nil, 390, nil, 99,
|
133
|
+
362, 376, 9, nil, 64, nil, nil, nil, nil, 167,
|
134
|
+
32, 98, nil, 348, nil, 167, 170, nil, nil ]
|
135
|
+
|
136
|
+
racc_action_default = [
|
137
|
+
-1, -56, -2, -3, -6, -7, -8, -9, -10, -11,
|
138
|
+
-12, -13, -14, -15, -16, -56, -18, -19, -20, -21,
|
139
|
+
-22, -23, -24, -46, -44, -56, -56, -56, -56, -5,
|
140
|
+
-56, -56, -56, -56, -56, -56, -56, -56, -56, -56,
|
141
|
+
-56, -56, -56, -56, -25, -56, -56, -56, -56, -56,
|
142
|
+
-56, 89, -4, -27, -32, -33, -34, -35, -36, -37,
|
143
|
+
-38, -39, -40, -41, -42, -43, -17, -30, -28, -56,
|
144
|
+
-47, -45, -56, -49, -51, -54, -55, -26, -29, -56,
|
145
|
+
-56, -56, -52, -31, -48, -56, -56, -50, -53 ]
|
146
|
+
|
147
|
+
racc_goto_table = [
|
148
|
+
29, 2, 43, 73, 75, 76, 44, 1, 69, 81,
|
149
|
+
nil, nil, nil, nil, 50, nil, 52, nil, 54, 55,
|
150
|
+
56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
|
151
|
+
nil, nil, 67, 70, 71, nil, 77, nil, nil, nil,
|
152
|
+
87, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
153
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
154
|
+
nil, nil, nil, nil, nil, nil, 83, nil, nil, nil,
|
155
|
+
nil, nil, nil, 80, nil, nil, nil, nil, 29 ]
|
156
|
+
|
157
|
+
racc_goto_check = [
|
158
|
+
4, 2, 3, 17, 17, 17, 15, 1, 16, 18,
|
159
|
+
nil, nil, nil, nil, 3, nil, 3, nil, 3, 3,
|
160
|
+
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
161
|
+
nil, nil, 3, 3, 3, nil, 15, nil, nil, nil,
|
162
|
+
17, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
163
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
164
|
+
nil, nil, nil, nil, nil, nil, 3, nil, nil, nil,
|
165
|
+
nil, nil, nil, 2, nil, nil, nil, nil, 4 ]
|
166
|
+
|
167
|
+
racc_goto_pointer = [
|
168
|
+
nil, 7, 1, -13, -2, nil, nil, nil, nil, nil,
|
169
|
+
nil, nil, nil, nil, nil, -17, -37, -45, -65 ]
|
170
|
+
|
171
|
+
racc_goto_default = [
|
172
|
+
nil, nil, nil, 3, 4, 5, 6, 7, 8, 9,
|
173
|
+
10, 11, 12, 13, 14, nil, nil, nil, nil ]
|
174
|
+
|
175
|
+
racc_reduce_table = [
|
176
|
+
0, 0, :racc_error,
|
177
|
+
0, 35, :_reduce_1,
|
178
|
+
1, 35, :_reduce_2,
|
179
|
+
1, 36, :_reduce_3,
|
180
|
+
3, 36, :_reduce_4,
|
181
|
+
2, 36, :_reduce_5,
|
182
|
+
1, 36, :_reduce_6,
|
183
|
+
1, 37, :_reduce_none,
|
184
|
+
1, 37, :_reduce_none,
|
185
|
+
1, 37, :_reduce_none,
|
186
|
+
1, 37, :_reduce_none,
|
187
|
+
1, 37, :_reduce_none,
|
188
|
+
1, 37, :_reduce_none,
|
189
|
+
1, 37, :_reduce_none,
|
190
|
+
1, 37, :_reduce_none,
|
191
|
+
1, 37, :_reduce_none,
|
192
|
+
1, 37, :_reduce_none,
|
193
|
+
3, 37, :_reduce_17,
|
194
|
+
1, 38, :_reduce_none,
|
195
|
+
1, 38, :_reduce_none,
|
196
|
+
1, 39, :_reduce_20,
|
197
|
+
1, 39, :_reduce_21,
|
198
|
+
1, 39, :_reduce_22,
|
199
|
+
1, 39, :_reduce_23,
|
200
|
+
1, 39, :_reduce_24,
|
201
|
+
2, 40, :_reduce_25,
|
202
|
+
4, 40, :_reduce_26,
|
203
|
+
3, 40, :_reduce_27,
|
204
|
+
2, 49, :_reduce_28,
|
205
|
+
3, 49, :_reduce_29,
|
206
|
+
1, 50, :_reduce_30,
|
207
|
+
3, 50, :_reduce_31,
|
208
|
+
3, 41, :_reduce_32,
|
209
|
+
3, 41, :_reduce_33,
|
210
|
+
3, 41, :_reduce_34,
|
211
|
+
3, 41, :_reduce_35,
|
212
|
+
3, 41, :_reduce_36,
|
213
|
+
3, 41, :_reduce_37,
|
214
|
+
3, 41, :_reduce_38,
|
215
|
+
3, 41, :_reduce_39,
|
216
|
+
3, 41, :_reduce_40,
|
217
|
+
3, 41, :_reduce_41,
|
218
|
+
3, 41, :_reduce_42,
|
219
|
+
3, 41, :_reduce_43,
|
220
|
+
1, 42, :_reduce_44,
|
221
|
+
3, 43, :_reduce_45,
|
222
|
+
1, 44, :_reduce_46,
|
223
|
+
3, 45, :_reduce_47,
|
224
|
+
3, 51, :_reduce_48,
|
225
|
+
3, 46, :_reduce_49,
|
226
|
+
6, 46, :_reduce_50,
|
227
|
+
0, 52, :_reduce_51,
|
228
|
+
1, 52, :_reduce_52,
|
229
|
+
3, 52, :_reduce_53,
|
230
|
+
3, 47, :_reduce_54,
|
231
|
+
3, 48, :_reduce_55 ]
|
232
|
+
|
233
|
+
racc_reduce_n = 56
|
234
|
+
|
235
|
+
racc_shift_n = 89
|
236
|
+
|
237
|
+
racc_token_table = {
|
238
|
+
false => 0,
|
239
|
+
:error => 1,
|
240
|
+
:IF => 2,
|
241
|
+
:DEF => 3,
|
242
|
+
:CLASS => 4,
|
243
|
+
:NEWLINE => 5,
|
244
|
+
:NUMBER => 6,
|
245
|
+
:STRING => 7,
|
246
|
+
:TRUE => 8,
|
247
|
+
:FALSE => 9,
|
248
|
+
:NIL => 10,
|
249
|
+
:IDENTIFIER => 11,
|
250
|
+
:CONSTANT => 12,
|
251
|
+
:INDENT => 13,
|
252
|
+
:DEDENT => 14,
|
253
|
+
"." => 15,
|
254
|
+
"!" => 16,
|
255
|
+
"*" => 17,
|
256
|
+
"/" => 18,
|
257
|
+
"+" => 19,
|
258
|
+
"-" => 20,
|
259
|
+
">" => 21,
|
260
|
+
">=" => 22,
|
261
|
+
"<" => 23,
|
262
|
+
"<=" => 24,
|
263
|
+
"==" => 25,
|
264
|
+
"!=" => 26,
|
265
|
+
"&&" => 27,
|
266
|
+
"||" => 28,
|
267
|
+
"=" => 29,
|
268
|
+
"," => 30,
|
269
|
+
"(" => 31,
|
270
|
+
")" => 32,
|
271
|
+
";" => 33 }
|
272
|
+
|
273
|
+
racc_nt_base = 34
|
274
|
+
|
275
|
+
racc_use_result_var = true
|
276
|
+
|
277
|
+
Racc_arg = [
|
278
|
+
racc_action_table,
|
279
|
+
racc_action_check,
|
280
|
+
racc_action_default,
|
281
|
+
racc_action_pointer,
|
282
|
+
racc_goto_table,
|
283
|
+
racc_goto_check,
|
284
|
+
racc_goto_default,
|
285
|
+
racc_goto_pointer,
|
286
|
+
racc_nt_base,
|
287
|
+
racc_reduce_table,
|
288
|
+
racc_token_table,
|
289
|
+
racc_shift_n,
|
290
|
+
racc_reduce_n,
|
291
|
+
racc_use_result_var ]
|
292
|
+
|
293
|
+
Racc_token_to_s_table = [
|
294
|
+
"$end",
|
295
|
+
"error",
|
296
|
+
"IF",
|
297
|
+
"DEF",
|
298
|
+
"CLASS",
|
299
|
+
"NEWLINE",
|
300
|
+
"NUMBER",
|
301
|
+
"STRING",
|
302
|
+
"TRUE",
|
303
|
+
"FALSE",
|
304
|
+
"NIL",
|
305
|
+
"IDENTIFIER",
|
306
|
+
"CONSTANT",
|
307
|
+
"INDENT",
|
308
|
+
"DEDENT",
|
309
|
+
"\".\"",
|
310
|
+
"\"!\"",
|
311
|
+
"\"*\"",
|
312
|
+
"\"/\"",
|
313
|
+
"\"+\"",
|
314
|
+
"\"-\"",
|
315
|
+
"\">\"",
|
316
|
+
"\">=\"",
|
317
|
+
"\"<\"",
|
318
|
+
"\"<=\"",
|
319
|
+
"\"==\"",
|
320
|
+
"\"!=\"",
|
321
|
+
"\"&&\"",
|
322
|
+
"\"||\"",
|
323
|
+
"\"=\"",
|
324
|
+
"\",\"",
|
325
|
+
"\"(\"",
|
326
|
+
"\")\"",
|
327
|
+
"\";\"",
|
328
|
+
"$start",
|
329
|
+
"Program",
|
330
|
+
"Expressions",
|
331
|
+
"Expression",
|
332
|
+
"Terminator",
|
333
|
+
"Literal",
|
334
|
+
"Call",
|
335
|
+
"Operator",
|
336
|
+
"GetConstant",
|
337
|
+
"SetConstant",
|
338
|
+
"GetLocal",
|
339
|
+
"SetLocal",
|
340
|
+
"Def",
|
341
|
+
"Class",
|
342
|
+
"If",
|
343
|
+
"Arguments",
|
344
|
+
"ArgList",
|
345
|
+
"Block",
|
346
|
+
"ParamList" ]
|
347
|
+
|
348
|
+
Racc_debug_parser = false
|
349
|
+
|
350
|
+
##### State transition tables end #####
|
351
|
+
|
352
|
+
# reduce 0 omitted
|
353
|
+
|
354
|
+
module_eval(<<'.,.,', 'grammar.y', 49)
|
355
|
+
def _reduce_1(val, _values, result)
|
356
|
+
result = Nodes.new([])
|
357
|
+
result
|
358
|
+
end
|
359
|
+
.,.,
|
360
|
+
|
361
|
+
module_eval(<<'.,.,', 'grammar.y', 50)
|
362
|
+
def _reduce_2(val, _values, result)
|
363
|
+
result = val[0]
|
364
|
+
result
|
365
|
+
end
|
366
|
+
.,.,
|
367
|
+
|
368
|
+
module_eval(<<'.,.,', 'grammar.y', 67)
|
369
|
+
def _reduce_3(val, _values, result)
|
370
|
+
result = Nodes.new(val)
|
371
|
+
result
|
372
|
+
end
|
373
|
+
.,.,
|
374
|
+
|
375
|
+
module_eval(<<'.,.,', 'grammar.y', 68)
|
376
|
+
def _reduce_4(val, _values, result)
|
377
|
+
result = val[0] << val[2]
|
378
|
+
result
|
379
|
+
end
|
380
|
+
.,.,
|
381
|
+
|
382
|
+
module_eval(<<'.,.,', 'grammar.y', 69)
|
383
|
+
def _reduce_5(val, _values, result)
|
384
|
+
result = val[0]
|
385
|
+
result
|
386
|
+
end
|
387
|
+
.,.,
|
388
|
+
|
389
|
+
module_eval(<<'.,.,', 'grammar.y', 70)
|
390
|
+
def _reduce_6(val, _values, result)
|
391
|
+
result = Nodes.new([])
|
392
|
+
result
|
393
|
+
end
|
394
|
+
.,.,
|
395
|
+
|
396
|
+
# reduce 7 omitted
|
397
|
+
|
398
|
+
# reduce 8 omitted
|
399
|
+
|
400
|
+
# reduce 9 omitted
|
401
|
+
|
402
|
+
# reduce 10 omitted
|
403
|
+
|
404
|
+
# reduce 11 omitted
|
405
|
+
|
406
|
+
# reduce 12 omitted
|
407
|
+
|
408
|
+
# reduce 13 omitted
|
409
|
+
|
410
|
+
# reduce 14 omitted
|
411
|
+
|
412
|
+
# reduce 15 omitted
|
413
|
+
|
414
|
+
# reduce 16 omitted
|
415
|
+
|
416
|
+
module_eval(<<'.,.,', 'grammar.y', 85)
|
417
|
+
def _reduce_17(val, _values, result)
|
418
|
+
result = val[1]
|
419
|
+
result
|
420
|
+
end
|
421
|
+
.,.,
|
422
|
+
|
423
|
+
# reduce 18 omitted
|
424
|
+
|
425
|
+
# reduce 19 omitted
|
426
|
+
|
427
|
+
module_eval(<<'.,.,', 'grammar.y', 103)
|
428
|
+
def _reduce_20(val, _values, result)
|
429
|
+
result = NumberNode.new(val[0])
|
430
|
+
result
|
431
|
+
end
|
432
|
+
.,.,
|
433
|
+
|
434
|
+
module_eval(<<'.,.,', 'grammar.y', 104)
|
435
|
+
def _reduce_21(val, _values, result)
|
436
|
+
result = StringNode.new(val[0])
|
437
|
+
result
|
438
|
+
end
|
439
|
+
.,.,
|
440
|
+
|
441
|
+
module_eval(<<'.,.,', 'grammar.y', 105)
|
442
|
+
def _reduce_22(val, _values, result)
|
443
|
+
result = TrueNode.new
|
444
|
+
result
|
445
|
+
end
|
446
|
+
.,.,
|
447
|
+
|
448
|
+
module_eval(<<'.,.,', 'grammar.y', 106)
|
449
|
+
def _reduce_23(val, _values, result)
|
450
|
+
result = FalseNode.new
|
451
|
+
result
|
452
|
+
end
|
453
|
+
.,.,
|
454
|
+
|
455
|
+
module_eval(<<'.,.,', 'grammar.y', 107)
|
456
|
+
def _reduce_24(val, _values, result)
|
457
|
+
result = NilNode.new
|
458
|
+
result
|
459
|
+
end
|
460
|
+
.,.,
|
461
|
+
|
462
|
+
module_eval(<<'.,.,', 'grammar.y', 119)
|
463
|
+
def _reduce_25(val, _values, result)
|
464
|
+
result = CallNode.new(nil, val[0], val[1])
|
465
|
+
result
|
466
|
+
end
|
467
|
+
.,.,
|
468
|
+
|
469
|
+
module_eval(<<'.,.,', 'grammar.y', 121)
|
470
|
+
def _reduce_26(val, _values, result)
|
471
|
+
result = CallNode.new(val[0], val[2], val[3])
|
472
|
+
result
|
473
|
+
end
|
474
|
+
.,.,
|
475
|
+
|
476
|
+
module_eval(<<'.,.,', 'grammar.y', 122)
|
477
|
+
def _reduce_27(val, _values, result)
|
478
|
+
result = CallNode.new(val[0], val[2], [])
|
479
|
+
result
|
480
|
+
end
|
481
|
+
.,.,
|
482
|
+
|
483
|
+
module_eval(<<'.,.,', 'grammar.y', 126)
|
484
|
+
def _reduce_28(val, _values, result)
|
485
|
+
result = []
|
486
|
+
result
|
487
|
+
end
|
488
|
+
.,.,
|
489
|
+
|
490
|
+
module_eval(<<'.,.,', 'grammar.y', 127)
|
491
|
+
def _reduce_29(val, _values, result)
|
492
|
+
result = val[1]
|
493
|
+
result
|
494
|
+
end
|
495
|
+
.,.,
|
496
|
+
|
497
|
+
module_eval(<<'.,.,', 'grammar.y', 131)
|
498
|
+
def _reduce_30(val, _values, result)
|
499
|
+
result = val
|
500
|
+
result
|
501
|
+
end
|
502
|
+
.,.,
|
503
|
+
|
504
|
+
module_eval(<<'.,.,', 'grammar.y', 132)
|
505
|
+
def _reduce_31(val, _values, result)
|
506
|
+
result = val[0] << val[2]
|
507
|
+
result
|
508
|
+
end
|
509
|
+
.,.,
|
510
|
+
|
511
|
+
module_eval(<<'.,.,', 'grammar.y', 143)
|
512
|
+
def _reduce_32(val, _values, result)
|
513
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
514
|
+
result
|
515
|
+
end
|
516
|
+
.,.,
|
517
|
+
|
518
|
+
module_eval(<<'.,.,', 'grammar.y', 144)
|
519
|
+
def _reduce_33(val, _values, result)
|
520
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
521
|
+
result
|
522
|
+
end
|
523
|
+
.,.,
|
524
|
+
|
525
|
+
module_eval(<<'.,.,', 'grammar.y', 145)
|
526
|
+
def _reduce_34(val, _values, result)
|
527
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
528
|
+
result
|
529
|
+
end
|
530
|
+
.,.,
|
531
|
+
|
532
|
+
module_eval(<<'.,.,', 'grammar.y', 146)
|
533
|
+
def _reduce_35(val, _values, result)
|
534
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
535
|
+
result
|
536
|
+
end
|
537
|
+
.,.,
|
538
|
+
|
539
|
+
module_eval(<<'.,.,', 'grammar.y', 147)
|
540
|
+
def _reduce_36(val, _values, result)
|
541
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
542
|
+
result
|
543
|
+
end
|
544
|
+
.,.,
|
545
|
+
|
546
|
+
module_eval(<<'.,.,', 'grammar.y', 148)
|
547
|
+
def _reduce_37(val, _values, result)
|
548
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
549
|
+
result
|
550
|
+
end
|
551
|
+
.,.,
|
552
|
+
|
553
|
+
module_eval(<<'.,.,', 'grammar.y', 149)
|
554
|
+
def _reduce_38(val, _values, result)
|
555
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
556
|
+
result
|
557
|
+
end
|
558
|
+
.,.,
|
559
|
+
|
560
|
+
module_eval(<<'.,.,', 'grammar.y', 150)
|
561
|
+
def _reduce_39(val, _values, result)
|
562
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
563
|
+
result
|
564
|
+
end
|
565
|
+
.,.,
|
566
|
+
|
567
|
+
module_eval(<<'.,.,', 'grammar.y', 151)
|
568
|
+
def _reduce_40(val, _values, result)
|
569
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
570
|
+
result
|
571
|
+
end
|
572
|
+
.,.,
|
573
|
+
|
574
|
+
module_eval(<<'.,.,', 'grammar.y', 152)
|
575
|
+
def _reduce_41(val, _values, result)
|
576
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
577
|
+
result
|
578
|
+
end
|
579
|
+
.,.,
|
580
|
+
|
581
|
+
module_eval(<<'.,.,', 'grammar.y', 153)
|
582
|
+
def _reduce_42(val, _values, result)
|
583
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
584
|
+
result
|
585
|
+
end
|
586
|
+
.,.,
|
587
|
+
|
588
|
+
module_eval(<<'.,.,', 'grammar.y', 154)
|
589
|
+
def _reduce_43(val, _values, result)
|
590
|
+
result = CallNode.new(val[0], val[1], [val[2]])
|
591
|
+
result
|
592
|
+
end
|
593
|
+
.,.,
|
594
|
+
|
595
|
+
module_eval(<<'.,.,', 'grammar.y', 159)
|
596
|
+
def _reduce_44(val, _values, result)
|
597
|
+
result = GetConstantNode.new(val[0])
|
598
|
+
result
|
599
|
+
end
|
600
|
+
.,.,
|
601
|
+
|
602
|
+
module_eval(<<'.,.,', 'grammar.y', 163)
|
603
|
+
def _reduce_45(val, _values, result)
|
604
|
+
result = SetConstantNode.new(val[0], val[2])
|
605
|
+
result
|
606
|
+
end
|
607
|
+
.,.,
|
608
|
+
|
609
|
+
module_eval(<<'.,.,', 'grammar.y', 167)
|
610
|
+
def _reduce_46(val, _values, result)
|
611
|
+
result = GetLocalNode.new(val[0])
|
612
|
+
result
|
613
|
+
end
|
614
|
+
.,.,
|
615
|
+
|
616
|
+
module_eval(<<'.,.,', 'grammar.y', 171)
|
617
|
+
def _reduce_47(val, _values, result)
|
618
|
+
result = SetLocalNode.new(val[0], val[2])
|
619
|
+
result
|
620
|
+
end
|
621
|
+
.,.,
|
622
|
+
|
623
|
+
module_eval(<<'.,.,', 'grammar.y', 183)
|
624
|
+
def _reduce_48(val, _values, result)
|
625
|
+
result = val[1]
|
626
|
+
result
|
627
|
+
end
|
628
|
+
.,.,
|
629
|
+
|
630
|
+
module_eval(<<'.,.,', 'grammar.y', 189)
|
631
|
+
def _reduce_49(val, _values, result)
|
632
|
+
result = DefNode.new(val[1], [], val[2])
|
633
|
+
result
|
634
|
+
end
|
635
|
+
.,.,
|
636
|
+
|
637
|
+
module_eval(<<'.,.,', 'grammar.y', 191)
|
638
|
+
def _reduce_50(val, _values, result)
|
639
|
+
result = DefNode.new(val[1], val[3], val[5])
|
640
|
+
result
|
641
|
+
end
|
642
|
+
.,.,
|
643
|
+
|
644
|
+
module_eval(<<'.,.,', 'grammar.y', 195)
|
645
|
+
def _reduce_51(val, _values, result)
|
646
|
+
result = []
|
647
|
+
result
|
648
|
+
end
|
649
|
+
.,.,
|
650
|
+
|
651
|
+
module_eval(<<'.,.,', 'grammar.y', 196)
|
652
|
+
def _reduce_52(val, _values, result)
|
653
|
+
result = val
|
654
|
+
result
|
655
|
+
end
|
656
|
+
.,.,
|
657
|
+
|
658
|
+
module_eval(<<'.,.,', 'grammar.y', 197)
|
659
|
+
def _reduce_53(val, _values, result)
|
660
|
+
result = val[0] << val[2]
|
661
|
+
result
|
662
|
+
end
|
663
|
+
.,.,
|
664
|
+
|
665
|
+
module_eval(<<'.,.,', 'grammar.y', 203)
|
666
|
+
def _reduce_54(val, _values, result)
|
667
|
+
result = ClassNode.new(val[1], val[2])
|
668
|
+
result
|
669
|
+
end
|
670
|
+
.,.,
|
671
|
+
|
672
|
+
module_eval(<<'.,.,', 'grammar.y', 208)
|
673
|
+
def _reduce_55(val, _values, result)
|
674
|
+
result = IfNode.new(val[1], val[2])
|
675
|
+
result
|
676
|
+
end
|
677
|
+
.,.,
|
678
|
+
|
679
|
+
def _reduce_none(val, _values, result)
|
680
|
+
val[0]
|
681
|
+
end
|
682
|
+
|
683
|
+
end # class Parser
|