poison 0.1.0.dev
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.
- data/LICENSE +22 -0
- data/README +1 -0
- data/Rakefile +58 -0
- data/bin/poison +119 -0
- data/lib/poison.rb +2 -0
- data/lib/poison/bootstrap.rb +4 -0
- data/lib/poison/bootstrap/compiler.rb +2 -0
- data/lib/poison/bootstrap/compiler/compiler.rb +46 -0
- data/lib/poison/bootstrap/compiler/grammar.rb +7095 -0
- data/lib/poison/bootstrap/compiler/node.rb +11 -0
- data/lib/poison/bootstrap/compiler/parser.rb +17 -0
- data/lib/poison/bootstrap/library.rb +1 -0
- data/lib/poison/bootstrap/library/code_loader.rb +16 -0
- data/lib/poison/bootstrap/parser.rb +0 -0
- data/lib/poison/bootstrap/syntax.rb +221 -0
- data/lib/poison/version.rb +14 -0
- data/spec/compiler/assign_spec.rb +114 -0
- data/spec/compiler/message_spec.rb +41 -0
- data/spec/compiler/value_spec.rb +57 -0
- data/spec/custom.rb +4 -0
- data/spec/custom/matchers/parse_as.rb +21 -0
- data/spec/custom/runner/relates.rb +97 -0
- data/spec/custom/utils/options.rb +21 -0
- data/spec/custom/utils/script.rb +26 -0
- data/spec/spec_helper.rb +3 -0
- metadata +94 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module Poison
|
2
|
+
class Parser
|
3
|
+
def initialize(machine, source)
|
4
|
+
@parser = machine.new
|
5
|
+
@source = source
|
6
|
+
end
|
7
|
+
|
8
|
+
def parse
|
9
|
+
@syntax = Syntax.new @parser.parse(@source)
|
10
|
+
|
11
|
+
unless @syntax
|
12
|
+
raise SyntaxError.new(@parser.failure_reason)
|
13
|
+
end
|
14
|
+
@syntax
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'poison/bootstrap/library/code_loader'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Poison
|
2
|
+
class CodeLoader
|
3
|
+
def self.execute_file(name)
|
4
|
+
source = File.read name
|
5
|
+
execute_script source
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.execute_script(source)
|
9
|
+
compiler = Compiler.new source
|
10
|
+
ast = compiler.parse
|
11
|
+
|
12
|
+
# just give some output for now
|
13
|
+
ast.graph
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
File without changes
|
@@ -0,0 +1,221 @@
|
|
1
|
+
module Poison
|
2
|
+
class SyntaxError < Exception; end
|
3
|
+
|
4
|
+
class Syntax
|
5
|
+
def initialize(parse_tree)
|
6
|
+
@syntax = parse_tree.node
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_sexp
|
10
|
+
@syntax.to_sexp
|
11
|
+
end
|
12
|
+
|
13
|
+
def graph
|
14
|
+
@syntax.graph
|
15
|
+
end
|
16
|
+
|
17
|
+
class Node
|
18
|
+
def to_sexp
|
19
|
+
end
|
20
|
+
|
21
|
+
def graph
|
22
|
+
Rubinius::AST::AsciiGrapher.new(self, Node).print
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Script < Node
|
27
|
+
attr_accessor :statements
|
28
|
+
|
29
|
+
def initialize(statements)
|
30
|
+
@statements = statements
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_sexp
|
34
|
+
[:script, @statements.to_sexp]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Statements < Node
|
39
|
+
def initialize(statements)
|
40
|
+
@statements = statements
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_sexp
|
44
|
+
if @statements.size == 1
|
45
|
+
@statements.first.to_sexp
|
46
|
+
else
|
47
|
+
@statements.map { |s| s.to_sexp }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Assign < Node
|
53
|
+
def initialize(left, right)
|
54
|
+
@left = left
|
55
|
+
@right = right
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_sexp
|
59
|
+
[:assign, @left.to_sexp, @right.to_sexp]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class BinaryOperator
|
64
|
+
def initialize(left, right)
|
65
|
+
@left = left
|
66
|
+
@right = right
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_sexp
|
70
|
+
[sexp_name, @left.to_sexp, @right.to_sexp]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class Or < BinaryOperator
|
75
|
+
def sexp_name
|
76
|
+
:or
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class And < BinaryOperator
|
81
|
+
def sexp_name
|
82
|
+
:and
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class Pipe < BinaryOperator
|
87
|
+
def sexp_name
|
88
|
+
:pipe
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class Caret < BinaryOperator
|
93
|
+
def sexp_name
|
94
|
+
:caret
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Amp < BinaryOperator
|
99
|
+
def sexp_name
|
100
|
+
:amp
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class Bitl < BinaryOperator
|
105
|
+
def sexp_name
|
106
|
+
:bitl
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Bitr < BinaryOperator
|
111
|
+
def sexp_name
|
112
|
+
:bitr
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class Plus < BinaryOperator
|
117
|
+
def sexp_name
|
118
|
+
:plus
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
class Minus < BinaryOperator
|
123
|
+
def sexp_name
|
124
|
+
:minus
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class Times < BinaryOperator
|
129
|
+
def sexp_name
|
130
|
+
:times
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class Div < BinaryOperator
|
135
|
+
def sexp_name
|
136
|
+
:div
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
class Rem < BinaryOperator
|
141
|
+
def sexp_name
|
142
|
+
:rem
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class Pow < BinaryOperator
|
147
|
+
def sexp_name
|
148
|
+
:pow
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class Expression < Node
|
153
|
+
attr_accessor :expression
|
154
|
+
|
155
|
+
def initialize(expression)
|
156
|
+
@expression = expression
|
157
|
+
end
|
158
|
+
|
159
|
+
def to_sexp
|
160
|
+
[:expr].concat @expression.map { |e| e.to_sexp }
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
class Message < Node
|
165
|
+
attr_accessor :name
|
166
|
+
|
167
|
+
def initialize(name)
|
168
|
+
@name = name
|
169
|
+
end
|
170
|
+
|
171
|
+
def to_sexp
|
172
|
+
[:message, [@name, nil, nil]]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
class Value < Node
|
177
|
+
attr_accessor :value
|
178
|
+
|
179
|
+
def initialize(value)
|
180
|
+
@value = value
|
181
|
+
end
|
182
|
+
|
183
|
+
def to_sexp
|
184
|
+
[:value, @value.to_sexp]
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
class Literal < Node
|
189
|
+
attr_accessor :value
|
190
|
+
|
191
|
+
def initialize(value)
|
192
|
+
@value = value
|
193
|
+
end
|
194
|
+
|
195
|
+
def to_sexp
|
196
|
+
[@value, nil, nil]
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
class NilKind < Literal
|
201
|
+
def initialize
|
202
|
+
@value = nil
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class Boolean < Literal
|
207
|
+
end
|
208
|
+
|
209
|
+
class Integer < Literal
|
210
|
+
end
|
211
|
+
|
212
|
+
class Real < Literal
|
213
|
+
end
|
214
|
+
|
215
|
+
class Imaginary < Literal
|
216
|
+
end
|
217
|
+
|
218
|
+
class String < Literal
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "The Assign node" do
|
4
|
+
relates "a = 1" do
|
5
|
+
parse do
|
6
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
7
|
+
[:expr, [:value, [1, nil, nil]]]]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
relates "a ||= 1" do
|
12
|
+
parse do
|
13
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
14
|
+
[:or, [:expr, [:message, ["a", nil, nil]]],
|
15
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
relates "a &&= 1" do
|
20
|
+
parse do
|
21
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
22
|
+
[:and, [:expr, [:message, ["a", nil, nil]]],
|
23
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
relates "a |= 1" do
|
28
|
+
parse do
|
29
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
30
|
+
[:pipe, [:expr, [:message, ["a", nil, nil]]],
|
31
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
relates "a ^= 1" do
|
36
|
+
parse do
|
37
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
38
|
+
[:caret, [:expr, [:message, ["a", nil, nil]]],
|
39
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
relates "a &= 1" do
|
44
|
+
parse do
|
45
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
46
|
+
[:amp, [:expr, [:message, ["a", nil, nil]]],
|
47
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
relates "a <<= 1" do
|
52
|
+
parse do
|
53
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
54
|
+
[:bitl, [:expr, [:message, ["a", nil, nil]]],
|
55
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
relates "a >>= 1" do
|
60
|
+
parse do
|
61
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
62
|
+
[:bitr, [:expr, [:message, ["a", nil, nil]]],
|
63
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
relates "a += 1" do
|
68
|
+
parse do
|
69
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
70
|
+
[:plus, [:expr, [:message, ["a", nil, nil]]],
|
71
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
relates "a -= 1" do
|
76
|
+
parse do
|
77
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
78
|
+
[:minus, [:expr, [:message, ["a", nil, nil]]],
|
79
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
relates "a *= 1" do
|
84
|
+
parse do
|
85
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
86
|
+
[:times, [:expr, [:message, ["a", nil, nil]]],
|
87
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
relates "a /= 1" do
|
92
|
+
parse do
|
93
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
94
|
+
[:div, [:expr, [:message, ["a", nil, nil]]],
|
95
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
relates "a %= 1" do
|
100
|
+
parse do
|
101
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
102
|
+
[:rem, [:expr, [:message, ["a", nil, nil]]],
|
103
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
relates "a **= 1" do
|
108
|
+
parse do
|
109
|
+
[:assign, [:expr, [:message, ["a", nil, nil]]],
|
110
|
+
[:pow, [:expr, [:message, ["a", nil, nil]]],
|
111
|
+
[:expr, [:value, [1, nil, nil]]]]]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "The Message node" do
|
4
|
+
relates "print" do
|
5
|
+
parse do
|
6
|
+
[:expr, [:message, ["print", nil, nil]]]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
relates <<-ruby do
|
11
|
+
"hello" print
|
12
|
+
ruby
|
13
|
+
|
14
|
+
parse do
|
15
|
+
[:expr, [:value, ["hello", nil, nil]],
|
16
|
+
[:message, ["print", nil, nil]]]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
relates <<-ruby do
|
21
|
+
1 string print
|
22
|
+
ruby
|
23
|
+
|
24
|
+
parse do
|
25
|
+
[:expr, [:value, [1, nil, nil]],
|
26
|
+
[:message, ["string", nil, nil]],
|
27
|
+
[:message, ["print", nil, nil]]]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
relates <<-ruby do
|
32
|
+
name string print
|
33
|
+
ruby
|
34
|
+
|
35
|
+
parse do
|
36
|
+
[:expr, [:message, ["name", nil, nil]],
|
37
|
+
[:message, ["string", nil, nil]],
|
38
|
+
[:message, ["print", nil, nil]]]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "The Value node" do
|
4
|
+
relates "1" do
|
5
|
+
parse do
|
6
|
+
[:expr, [:value, [1, nil, nil]]]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
relates "2.4" do
|
11
|
+
parse do
|
12
|
+
[:expr, [:value, [2.4, nil, nil]]]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
relates "3.2i" do
|
17
|
+
parse do
|
18
|
+
[:expr, [:value, ["3.2i", nil, nil]]]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
relates "0x42" do
|
23
|
+
parse do
|
24
|
+
[:expr, [:value, [66, nil, nil]]]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
relates "nil" do
|
29
|
+
parse do
|
30
|
+
[:expr, [:value, [nil, nil, nil]]]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
relates "true" do
|
35
|
+
parse do
|
36
|
+
[:expr, [:value, [true, nil, nil]]]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
relates "false" do
|
41
|
+
parse do
|
42
|
+
[:expr, [:value, [false, nil, nil]]]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
relates '"hello"' do
|
47
|
+
parse do
|
48
|
+
[:expr, [:value, ["hello", nil, nil]]]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
relates "'world'" do
|
53
|
+
parse do
|
54
|
+
[:expr, [:value, ["world", nil, nil]]]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|