atomy 0.1.1 → 0.6.3

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.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.md +201 -0
  4. data/bin/atomy +16 -133
  5. data/kernel/array.ay +6 -0
  6. data/kernel/atomy.ay +18 -0
  7. data/kernel/condition.ay +171 -271
  8. data/kernel/control-flow.ay +197 -192
  9. data/kernel/core.ay +120 -0
  10. data/kernel/data.ay +83 -39
  11. data/kernel/define.ay +84 -93
  12. data/kernel/doc.ay +282 -449
  13. data/kernel/dynamic.ay +25 -29
  14. data/kernel/file.ay +9 -0
  15. data/kernel/grammar.ay +267 -0
  16. data/kernel/hash.ay +17 -0
  17. data/kernel/interpolation.ay +59 -0
  18. data/kernel/io.ay +70 -244
  19. data/kernel/let-macro.ay +24 -0
  20. data/kernel/let-pattern.ay +24 -0
  21. data/kernel/loop.ay +80 -0
  22. data/kernel/mutation.ay +53 -0
  23. data/kernel/particles.ay +176 -39
  24. data/kernel/patterns.ay +527 -191
  25. data/kernel/pretty.ay +311 -277
  26. data/kernel/quotes.ay +29 -0
  27. data/kernel/range.ay +4 -0
  28. data/kernel/regexp.ay +23 -0
  29. data/kernel/repl.ay +83 -109
  30. data/kernel/stack-local.ay +21 -0
  31. data/lib/atomy.rb +37 -0
  32. data/lib/atomy/bootstrap.rb +256 -0
  33. data/lib/atomy/code/assign.rb +64 -0
  34. data/lib/atomy/code/block.rb +98 -0
  35. data/lib/atomy/code/class_variable.rb +17 -0
  36. data/lib/atomy/code/constant.rb +21 -0
  37. data/lib/atomy/code/define.rb +242 -0
  38. data/lib/atomy/code/define_function.rb +51 -0
  39. data/lib/atomy/code/define_method.rb +20 -0
  40. data/lib/atomy/code/false.rb +9 -0
  41. data/lib/atomy/code/instance_variable.rb +15 -0
  42. data/lib/atomy/code/integer.rb +13 -0
  43. data/lib/atomy/code/list.rb +17 -0
  44. data/lib/atomy/code/nil.rb +9 -0
  45. data/lib/atomy/code/pattern.rb +23 -0
  46. data/lib/atomy/code/pattern/and.rb +61 -0
  47. data/lib/atomy/code/pattern/quasi_quote.rb +185 -0
  48. data/lib/atomy/code/pattern/splat.rb +29 -0
  49. data/lib/atomy/code/pattern/wildcard.rb +37 -0
  50. data/lib/atomy/code/quasi_quote.rb +118 -0
  51. data/lib/atomy/code/quote.rb +13 -0
  52. data/lib/atomy/code/self.rb +9 -0
  53. data/lib/atomy/code/send.rb +110 -0
  54. data/lib/atomy/code/sequence.rb +23 -0
  55. data/lib/atomy/code/string_literal.rb +53 -0
  56. data/lib/atomy/code/symbol.rb +13 -0
  57. data/lib/atomy/code/true.rb +9 -0
  58. data/lib/atomy/code/undefined.rb +9 -0
  59. data/lib/atomy/code/variable.rb +17 -0
  60. data/lib/atomy/codeloader.rb +218 -0
  61. data/lib/atomy/compiler.rb +57 -0
  62. data/lib/atomy/errors.rb +54 -0
  63. data/lib/atomy/grammar.rb +2278 -0
  64. data/lib/atomy/locals.rb +75 -0
  65. data/lib/atomy/message_structure.rb +277 -0
  66. data/lib/atomy/method.rb +343 -0
  67. data/lib/atomy/module.rb +144 -0
  68. data/lib/atomy/node/constructable.rb +169 -0
  69. data/lib/atomy/node/equality.rb +113 -0
  70. data/lib/atomy/node/meta.rb +206 -0
  71. data/lib/atomy/node/pretty.rb +108 -0
  72. data/lib/atomy/parser.rb +21 -0
  73. data/lib/atomy/pattern.rb +26 -0
  74. data/lib/atomy/pattern/and.rb +59 -0
  75. data/lib/atomy/pattern/attribute.rb +16 -0
  76. data/lib/atomy/pattern/class_variable.rb +15 -0
  77. data/lib/atomy/pattern/equality.rb +42 -0
  78. data/lib/atomy/pattern/instance_variable.rb +15 -0
  79. data/lib/atomy/pattern/kind_of.rb +20 -0
  80. data/lib/atomy/pattern/or.rb +48 -0
  81. data/lib/atomy/pattern/quasi_quote.rb +164 -0
  82. data/lib/atomy/pattern/splat.rb +15 -0
  83. data/lib/atomy/pattern/wildcard.rb +18 -0
  84. data/lib/atomy/rubygems.rb +48 -0
  85. data/lib/atomy/version.rb +3 -0
  86. metadata +169 -134
  87. data/COPYING +0 -30
  88. data/README.md +0 -1
  89. data/kernel/block.ay +0 -30
  90. data/kernel/boot.ay +0 -10
  91. data/kernel/comparison.ay +0 -61
  92. data/kernel/concurrency.ay +0 -84
  93. data/kernel/cosmetics.ay +0 -3
  94. data/kernel/data-delta.ay +0 -105
  95. data/kernel/documentation.ay +0 -135
  96. data/kernel/errors.ay +0 -6
  97. data/kernel/format.ay +0 -13
  98. data/kernel/format/data.ay +0 -89
  99. data/kernel/format/formatter.ay +0 -345
  100. data/kernel/format/parser.ay +0 -13
  101. data/kernel/hashes.ay +0 -39
  102. data/kernel/namespaces.ay +0 -63
  103. data/kernel/node.ay +0 -48
  104. data/kernel/operators.ay +0 -28
  105. data/kernel/precision.ay +0 -148
  106. data/kernel/therie.ay +0 -204
  107. data/lib/ast/binary_send.rb +0 -44
  108. data/lib/ast/block.rb +0 -268
  109. data/lib/ast/constant.rb +0 -88
  110. data/lib/ast/internal/assign.rb +0 -19
  111. data/lib/ast/internal/block_pass.rb +0 -21
  112. data/lib/ast/internal/catch.rb +0 -247
  113. data/lib/ast/internal/class.rb +0 -30
  114. data/lib/ast/internal/class_variable.rb +0 -23
  115. data/lib/ast/internal/define.rb +0 -174
  116. data/lib/ast/internal/ensure.rb +0 -135
  117. data/lib/ast/internal/file.rb +0 -14
  118. data/lib/ast/internal/global_variable.rb +0 -20
  119. data/lib/ast/internal/if_then_else.rb +0 -24
  120. data/lib/ast/internal/instance_variable.rb +0 -17
  121. data/lib/ast/internal/let_macro.rb +0 -35
  122. data/lib/ast/internal/macro_quote.rb +0 -23
  123. data/lib/ast/internal/match.rb +0 -53
  124. data/lib/ast/internal/module.rb +0 -30
  125. data/lib/ast/internal/pattern.rb +0 -17
  126. data/lib/ast/internal/return.rb +0 -29
  127. data/lib/ast/internal/set.rb +0 -19
  128. data/lib/ast/internal/singleton_class.rb +0 -18
  129. data/lib/ast/internal/splat.rb +0 -14
  130. data/lib/ast/internal/when.rb +0 -24
  131. data/lib/ast/list.rb +0 -25
  132. data/lib/ast/macro.rb +0 -37
  133. data/lib/ast/node.rb +0 -599
  134. data/lib/ast/operator.rb +0 -21
  135. data/lib/ast/particle.rb +0 -13
  136. data/lib/ast/primitive.rb +0 -20
  137. data/lib/ast/quasi_quote.rb +0 -20
  138. data/lib/ast/quote.rb +0 -13
  139. data/lib/ast/send.rb +0 -104
  140. data/lib/ast/splice.rb +0 -32
  141. data/lib/ast/string.rb +0 -23
  142. data/lib/ast/unary.rb +0 -44
  143. data/lib/ast/unquote.rb +0 -45
  144. data/lib/ast/variable.rb +0 -64
  145. data/lib/atomy.kpeg.rb +0 -3995
  146. data/lib/code_loader.rb +0 -137
  147. data/lib/compiler/compiler.rb +0 -155
  148. data/lib/compiler/stages.rb +0 -81
  149. data/lib/formatter.kpeg.rb +0 -1394
  150. data/lib/macros.rb +0 -317
  151. data/lib/method.rb +0 -261
  152. data/lib/namespace.rb +0 -236
  153. data/lib/parser.rb +0 -28
  154. data/lib/patterns.rb +0 -276
  155. data/lib/patterns/any.rb +0 -21
  156. data/lib/patterns/attribute.rb +0 -59
  157. data/lib/patterns/block_pass.rb +0 -54
  158. data/lib/patterns/constant.rb +0 -33
  159. data/lib/patterns/default.rb +0 -44
  160. data/lib/patterns/head_tail.rb +0 -63
  161. data/lib/patterns/list.rb +0 -77
  162. data/lib/patterns/match.rb +0 -45
  163. data/lib/patterns/named.rb +0 -55
  164. data/lib/patterns/named_class.rb +0 -46
  165. data/lib/patterns/named_global.rb +0 -46
  166. data/lib/patterns/named_instance.rb +0 -46
  167. data/lib/patterns/particle.rb +0 -29
  168. data/lib/patterns/quasi_quote.rb +0 -184
  169. data/lib/patterns/quote.rb +0 -33
  170. data/lib/patterns/singleton_class.rb +0 -31
  171. data/lib/patterns/splat.rb +0 -57
  172. data/lib/util.rb +0 -37
data/lib/ast/operator.rb DELETED
@@ -1,21 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Operator < Node
4
- attributes [:operators], :associativity, :precedence
5
- generate
6
-
7
- def bytecode(g)
8
- pos(g)
9
- g.push_const :Atomy
10
- g.find_const :Macro
11
- @operators.each do |o|
12
- g.push_literal o
13
- end
14
- g.make_array @operators.size
15
- g.push_literal @associativity
16
- g.push_int @precedence
17
- g.send :set_op_info, 3
18
- end
19
- end
20
- end
21
- end
data/lib/ast/particle.rb DELETED
@@ -1,13 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Particle < Node
4
- attributes :name
5
- generate
6
-
7
- def bytecode(g)
8
- pos(g)
9
- g.push_literal @name.to_sym
10
- end
11
- end
12
- end
13
- end
data/lib/ast/primitive.rb DELETED
@@ -1,20 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Primitive < Node
4
- attributes :value
5
- generate
6
-
7
- def bytecode(g)
8
- pos(g)
9
-
10
- # TODO: `(~#true) will break here
11
- case @value
12
- when :true, :false, :self, :nil, Integer
13
- g.push @value
14
- else
15
- g.push_literal @value
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- module Atomy
2
- module AST
3
- class QuasiQuote < Node
4
- children :expression
5
- generate
6
-
7
- def construct(g, d = nil)
8
- get(g)
9
- g.push_int @line
10
- @expression.construct(g, quote(d))
11
- g.send :new, 2
12
- end
13
-
14
- def bytecode(g)
15
- pos(g)
16
- @expression.recursively(&:resolve).construct(g, 1)
17
- end
18
- end
19
- end
20
- end
data/lib/ast/quote.rb DELETED
@@ -1,13 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Quote < Node
4
- children :expression
5
- generate
6
-
7
- def bytecode(g)
8
- pos(g)
9
- @expression.recursively(&:resolve).construct(g)
10
- end
11
- end
12
- end
13
- end
data/lib/ast/send.rb DELETED
@@ -1,104 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Send < Node
4
- children :receiver, [:arguments], :message?, :block?
5
- attributes :method_name?
6
- slots [:private, "false"], :namespace?
7
- generate
8
-
9
- def self.new(*args)
10
- super.resolve_message
11
- end
12
-
13
- def resolve_message
14
- res = self
15
-
16
- if res.message
17
- res = res.message.as_message(self)
18
- res.message = nil if res.method_name
19
- end
20
-
21
- res
22
- end
23
-
24
- def register_macro(body, let = false)
25
- Atomy::Macro.register(
26
- @method_name,
27
- ([@receiver] + @arguments).collect do |n|
28
- Atomy::Macro.macro_pattern n
29
- end,
30
- body,
31
- let
32
- )
33
- end
34
-
35
- def message_name
36
- Atomy.namespaced(@namespace, @method_name)
37
- end
38
-
39
- def to_send
40
- self
41
- end
42
-
43
- def prepare
44
- resolve.expand
45
- end
46
-
47
- def bytecode(g)
48
- pos(g)
49
-
50
- @receiver.compile(g)
51
-
52
- block = @block
53
- splat = nil
54
-
55
- unless @namespace == "_"
56
- g.push_literal message_name.to_sym
57
- end
58
-
59
- args = 0
60
- @arguments.each do |a|
61
- e = a.prepare
62
- if e.kind_of?(BlockPass)
63
- block = e
64
- break
65
- elsif e.kind_of?(Splat)
66
- splat = e
67
- break
68
- end
69
-
70
- e.bytecode(g)
71
- args += 1
72
- end
73
-
74
- if splat
75
- splat.compile(g)
76
- if block
77
- block.compile(g)
78
- else
79
- g.push_nil
80
- end
81
- if @namespace == "_"
82
- g.send_with_splat @method_name.to_sym, args, @private
83
- else
84
- g.send_with_splat :atomy_send, args + 1
85
- #g.call_custom_with_splat message_name.to_sym, args
86
- end
87
- elsif block
88
- block.compile(g)
89
- if @namespace == "_"
90
- g.send_with_block @method_name.to_sym, args, @private
91
- else
92
- g.send_with_block :atomy_send, args + 1
93
- #g.call_custom_with_block message_name.to_sym, args
94
- end
95
- elsif @namespace == "_"
96
- g.send @method_name.to_sym, args, @private
97
- else
98
- g.send :atomy_send, args + 1
99
- #g.call_custom message_name.to_sym, args
100
- end
101
- end
102
- end
103
- end
104
- end
data/lib/ast/splice.rb DELETED
@@ -1,32 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Splice < Node
4
- children :expression
5
- generate
6
-
7
- def construct(g, d = nil)
8
- pos(g)
9
- # TODO: fail if depth == 0
10
- if d == 1
11
- @expression.compile(g)
12
- else
13
- get(g)
14
- g.push_int @line
15
- @expression.construct(g, unquote(d))
16
- g.send :new, 2
17
- end
18
- end
19
-
20
- def bytecode(g)
21
- pos(g)
22
- # TODO: this should raise an exception since
23
- # it'll only happen outside of a quasiquote.
24
- g.push_literal @expression
25
- end
26
-
27
- def unquote?
28
- true
29
- end
30
- end
31
- end
32
- end
data/lib/ast/string.rb DELETED
@@ -1,23 +0,0 @@
1
- module Atomy
2
- module AST
3
- class String < Node
4
- attributes :value, :raw?
5
- generate
6
-
7
- def bytecode(g)
8
- pos(g)
9
- g.push_literal @value
10
- g.string_dup
11
- end
12
-
13
- def as_message(send)
14
- MacroQuote.new(
15
- @line,
16
- send.receiver.name,
17
- @raw || @value,
18
- send.arguments.collect(&:name)
19
- )
20
- end
21
- end
22
- end
23
- end
data/lib/ast/unary.rb DELETED
@@ -1,44 +0,0 @@
1
- # TODO: ensure binary sends do not end with @
2
- module Atomy
3
- module AST
4
- class Unary < Node
5
- children :receiver
6
- attributes :operator
7
- slots :namespace?
8
- generate
9
-
10
- def register_macro(body, let = false)
11
- Atomy::Macro.register(
12
- @operator + "@",
13
- [Atomy::Macro.macro_pattern(@receiver)],
14
- body,
15
- let
16
- )
17
- end
18
-
19
- def message_name
20
- Atomy.namespaced(@namespace, @operator)
21
- end
22
-
23
- def prepare
24
- resolve.expand
25
- end
26
-
27
- def bytecode(g)
28
- pos(g)
29
- @receiver.compile(g)
30
- if @namespace == "_"
31
- g.send @operator.to_sym, 0
32
- else
33
- g.push_literal message_name.to_sym
34
- g.send :atomy_send, 1
35
- #g.call_custom method_name.to_sym, 0
36
- end
37
- end
38
-
39
- def method_name
40
- @operator + "@"
41
- end
42
- end
43
- end
44
- end
data/lib/ast/unquote.rb DELETED
@@ -1,45 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Unquote < Node
4
- children :expression
5
- generate
6
-
7
- def construct(g, d = nil)
8
- pos(g)
9
- # TODO: fail if depth == 0
10
- if d == 1
11
- @expression.compile(g)
12
- g.send :to_node, 0
13
- elsif @expression.kind_of?(Splice) && d == 2
14
- @expression.get(g)
15
- g.push_int @line
16
- g.push_cpath_top
17
- g.find_const :Atomy
18
- @expression.expression.compile(g)
19
- g.send :unquote_splice, 1
20
- g.send :new, 2
21
- else
22
- get(g)
23
- g.push_int @line
24
- @expression.construct(g, unquote(d))
25
- g.send :new, 2
26
- end
27
- end
28
-
29
- def bytecode(g)
30
- pos(g)
31
- # TODO: this should raise an exception since
32
- # it'll only happen outside of a quasiquote.
33
- g.push_literal @expression
34
- end
35
-
36
- def unquote?
37
- true
38
- end
39
-
40
- def as_message(send)
41
- send
42
- end
43
- end
44
- end
45
- end
data/lib/ast/variable.rb DELETED
@@ -1,64 +0,0 @@
1
- module Atomy
2
- module AST
3
- class Variable < Node
4
- attributes :name
5
- slots :namespace?
6
- generate
7
-
8
- def self.new(*as)
9
- x = super
10
- unless x.namespace
11
- x.namespace, x.name = Atomy.from_namespaced(x.name)
12
- end
13
- x
14
- end
15
-
16
- def register_macro(body, let = false)
17
- Atomy::Macro.register(
18
- method_name,
19
- [],
20
- body,
21
- let
22
- )
23
- end
24
-
25
- def prepare
26
- resolve.expand
27
- end
28
-
29
- def message_name
30
- Atomy.namespaced(@namespace, @name)
31
- end
32
-
33
- def bytecode(g)
34
- pos(g)
35
-
36
- var = g.state.scope.search_local(@name)
37
- if var
38
- var.get_bytecode(g)
39
- else
40
- g.push_self
41
- g.push_literal message_name.to_sym
42
- g.send :atomy_send, 1
43
- #g.call_custom message_name.to_sym, 0
44
- end
45
- end
46
-
47
- # used in macroexpansion
48
- def method_name
49
- name + ":@"
50
- end
51
-
52
- def namespace_symbol
53
- name.to_sym
54
- end
55
-
56
- def as_message(send)
57
- send.dup.tap do |s|
58
- s.method_name = @name
59
- s.namespace = @namespace
60
- end
61
- end
62
- end
63
- end
64
- end
data/lib/atomy.kpeg.rb DELETED
@@ -1,3995 +0,0 @@
1
- class Atomy::Parser
2
- # STANDALONE START
3
- def setup_parser(str, debug=false)
4
- @string = str
5
- @pos = 0
6
- @memoizations = Hash.new { |h,k| h[k] = {} }
7
- @result = nil
8
- @failed_rule = nil
9
- @failing_rule_offset = -1
10
-
11
- setup_foreign_grammar
12
- end
13
-
14
- # This is distinct from setup_parser so that a standalone parser
15
- # can redefine #initialize and still have access to the proper
16
- # parser setup code.
17
- #
18
- def initialize(str, debug=false)
19
- setup_parser(str, debug)
20
- end
21
-
22
- attr_reader :string
23
- attr_reader :failing_rule_offset
24
- attr_accessor :result, :pos
25
-
26
- # STANDALONE START
27
- def current_column(target=pos)
28
- if c = string.rindex("\n", target-1)
29
- return target - c - 1
30
- end
31
-
32
- target + 1
33
- end
34
-
35
- def current_line(target=pos)
36
- cur_offset = 0
37
- cur_line = 0
38
-
39
- string.each_line do |line|
40
- cur_line += 1
41
- cur_offset += line.size
42
- return cur_line if cur_offset >= target
43
- end
44
-
45
- -1
46
- end
47
-
48
- def lines
49
- lines = []
50
- string.each_line { |l| lines << l }
51
- lines
52
- end
53
-
54
- #
55
-
56
- def get_text(start)
57
- @string[start..@pos-1]
58
- end
59
-
60
- def show_pos
61
- width = 10
62
- if @pos < width
63
- "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
64
- else
65
- "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
66
- end
67
- end
68
-
69
- def failure_info
70
- l = current_line @failing_rule_offset
71
- c = current_column @failing_rule_offset
72
-
73
- if @failed_rule.kind_of? Symbol
74
- info = self.class::Rules[@failed_rule]
75
- "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
76
- else
77
- "line #{l}, column #{c}: failed rule '#{@failed_rule}'"
78
- end
79
- end
80
-
81
- def failure_caret
82
- l = current_line @failing_rule_offset
83
- c = current_column @failing_rule_offset
84
-
85
- line = lines[l-1]
86
- "#{line}\n#{' ' * (c - 1)}^"
87
- end
88
-
89
- def failure_character
90
- l = current_line @failing_rule_offset
91
- c = current_column @failing_rule_offset
92
- lines[l-1][c-1, 1]
93
- end
94
-
95
- def failure_oneline
96
- l = current_line @failing_rule_offset
97
- c = current_column @failing_rule_offset
98
-
99
- char = lines[l-1][c-1, 1]
100
-
101
- if @failed_rule.kind_of? Symbol
102
- info = self.class::Rules[@failed_rule]
103
- "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
104
- else
105
- "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
106
- end
107
- end
108
-
109
- class ParseError < RuntimeError
110
- end
111
-
112
- def raise_error
113
- raise ParseError, failure_oneline
114
- end
115
-
116
- def show_error(io=STDOUT)
117
- error_pos = @failing_rule_offset
118
- line_no = current_line(error_pos)
119
- col_no = current_column(error_pos)
120
-
121
- io.puts "On line #{line_no}, column #{col_no}:"
122
-
123
- if @failed_rule.kind_of? Symbol
124
- info = self.class::Rules[@failed_rule]
125
- io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
126
- else
127
- io.puts "Failed to match rule '#{@failed_rule}'"
128
- end
129
-
130
- io.puts "Got: #{string[error_pos,1].inspect}"
131
- line = lines[line_no-1]
132
- io.puts "=> #{line}"
133
- io.print(" " * (col_no + 3))
134
- io.puts "^"
135
- end
136
-
137
- def set_failed_rule(name)
138
- if @pos > @failing_rule_offset
139
- @failed_rule = name
140
- @failing_rule_offset = @pos
141
- end
142
- end
143
-
144
- attr_reader :failed_rule
145
-
146
- def match_string(str)
147
- len = str.size
148
- if @string[pos,len] == str
149
- @pos += len
150
- return str
151
- end
152
-
153
- return nil
154
- end
155
-
156
- def scan(reg)
157
- if m = reg.match(@string[@pos..-1])
158
- width = m.end(0)
159
- @pos += width
160
- return true
161
- end
162
-
163
- return nil
164
- end
165
-
166
- if "".respond_to? :getbyte
167
- def get_byte
168
- if @pos >= @string.size
169
- return nil
170
- end
171
-
172
- s = @string.getbyte @pos
173
- @pos += 1
174
- s
175
- end
176
- else
177
- def get_byte
178
- if @pos >= @string.size
179
- return nil
180
- end
181
-
182
- s = @string[@pos]
183
- @pos += 1
184
- s
185
- end
186
- end
187
-
188
- def parse(rule=nil)
189
- if !rule
190
- _root ? true : false
191
- else
192
- # This is not shared with code_generator.rb so this can be standalone
193
- method = rule.gsub("-","_hyphen_")
194
- __send__("_#{method}") ? true : false
195
- end
196
- end
197
-
198
- class LeftRecursive
199
- def initialize(detected=false)
200
- @detected = detected
201
- end
202
-
203
- attr_accessor :detected
204
- end
205
-
206
- class MemoEntry
207
- def initialize(ans, pos)
208
- @ans = ans
209
- @pos = pos
210
- @uses = 1
211
- @result = nil
212
- end
213
-
214
- attr_reader :ans, :pos, :uses, :result
215
-
216
- def inc!
217
- @uses += 1
218
- end
219
-
220
- def move!(ans, pos, result)
221
- @ans = ans
222
- @pos = pos
223
- @result = result
224
- end
225
- end
226
-
227
- def external_invoke(other, rule, *args)
228
- old_pos = @pos
229
- old_string = @string
230
-
231
- @pos = other.pos
232
- @string = other.string
233
-
234
- begin
235
- if val = __send__(rule, *args)
236
- other.pos = @pos
237
- other.result = @result
238
- else
239
- other.set_failed_rule "#{self.class}##{rule}"
240
- end
241
- val
242
- ensure
243
- @pos = old_pos
244
- @string = old_string
245
- end
246
- end
247
-
248
- def apply(rule)
249
- if m = @memoizations[rule][@pos]
250
- m.inc!
251
-
252
- prev = @pos
253
- @pos = m.pos
254
- if m.ans.kind_of? LeftRecursive
255
- m.ans.detected = true
256
- return nil
257
- end
258
-
259
- @result = m.result
260
-
261
- return m.ans
262
- else
263
- lr = LeftRecursive.new(false)
264
- m = MemoEntry.new(lr, @pos)
265
- @memoizations[rule][@pos] = m
266
- start_pos = @pos
267
-
268
- ans = __send__ rule
269
-
270
- m.move! ans, @pos, @result
271
-
272
- # Don't bother trying to grow the left recursion
273
- # if it's failing straight away (thus there is no seed)
274
- if ans and lr.detected
275
- return grow_lr(rule, start_pos, m)
276
- else
277
- return ans
278
- end
279
-
280
- return ans
281
- end
282
- end
283
-
284
- def grow_lr(rule, start_pos, m)
285
- while true
286
- @pos = start_pos
287
- @result = m.result
288
-
289
- ans = __send__ rule
290
- return nil unless ans
291
-
292
- break if @pos <= m.pos
293
-
294
- m.move! ans, @pos, @result
295
- end
296
-
297
- @result = m.result
298
- @pos = m.pos
299
- return m.ans
300
- end
301
-
302
- class RuleInfo
303
- def initialize(name, rendered)
304
- @name = name
305
- @rendered = rendered
306
- end
307
-
308
- attr_reader :name, :rendered
309
- end
310
-
311
- def self.rule_info(name, rendered)
312
- RuleInfo.new(name, rendered)
313
- end
314
-
315
- #
316
-
317
-
318
- def current_position(target=pos)
319
- cur_offset = 0
320
- cur_line = 0
321
-
322
- line_lengths.each do |len|
323
- cur_line += 1
324
- return [cur_line, target - cur_offset] if cur_offset + len > target
325
- cur_offset += len
326
- end
327
-
328
- [cur_line, cur_offset]
329
- end
330
-
331
- def line_lengths
332
- @line_lengths ||= lines.collect { |l| l.size }
333
- end
334
-
335
- def continue?(x)
336
- y = current_position
337
- y[0] >= x[0] && y[1] > x[1]
338
- end
339
-
340
- def op_info(op)
341
- Atomy::OPERATORS[op] || {}
342
- end
343
-
344
- def prec(o)
345
- op_info(o)[:prec] || 5
346
- end
347
-
348
- def assoc(o)
349
- op_info(o)[:assoc] || :left
350
- end
351
-
352
- def binary(o, l, r)
353
- Atomy::AST::BinarySend.new(l.line, l, r, o)
354
- end
355
-
356
- def resolve(a, e, chain)
357
- return [e, []] if chain.empty?
358
-
359
- b, *rest = chain
360
-
361
- if a && (prec(a) > prec(b) || (prec(a) == prec(b) && assoc(a) == :left))
362
- [e, chain]
363
- else
364
- e2, *rest2 = rest
365
- r, rest3 = resolve(b, e2, rest2)
366
- resolve(a, binary(b, e, r), rest3)
367
- end
368
- end
369
-
370
- def const_chain(l, ns, top = false)
371
- p = nil
372
- ns.each do |n|
373
- if p
374
- p = Atomy::AST::ScopedConstant.new(l, p, n)
375
- elsif top
376
- p = Atomy::AST::ToplevelConstant.new(l, n)
377
- else
378
- p = Atomy::AST::Constant.new(l, n)
379
- end
380
- end
381
- p
382
- end
383
-
384
-
385
- def setup_foreign_grammar; end
386
-
387
- # sp = (" " | "\t" | comment)*
388
- def _sp
389
- while true
390
-
391
- _save1 = self.pos
392
- while true # choice
393
- _tmp = match_string(" ")
394
- break if _tmp
395
- self.pos = _save1
396
- _tmp = match_string("\t")
397
- break if _tmp
398
- self.pos = _save1
399
- _tmp = apply(:_comment)
400
- break if _tmp
401
- self.pos = _save1
402
- break
403
- end # end choice
404
-
405
- break unless _tmp
406
- end
407
- _tmp = true
408
- set_failed_rule :_sp unless _tmp
409
- return _tmp
410
- end
411
-
412
- # wsp = (" " | "\t" | "\n" | comment)*
413
- def _wsp
414
- while true
415
-
416
- _save1 = self.pos
417
- while true # choice
418
- _tmp = match_string(" ")
419
- break if _tmp
420
- self.pos = _save1
421
- _tmp = match_string("\t")
422
- break if _tmp
423
- self.pos = _save1
424
- _tmp = match_string("\n")
425
- break if _tmp
426
- self.pos = _save1
427
- _tmp = apply(:_comment)
428
- break if _tmp
429
- self.pos = _save1
430
- break
431
- end # end choice
432
-
433
- break unless _tmp
434
- end
435
- _tmp = true
436
- set_failed_rule :_wsp unless _tmp
437
- return _tmp
438
- end
439
-
440
- # sig_sp = (" " | "\t" | comment)+
441
- def _sig_sp
442
- _save = self.pos
443
-
444
- _save1 = self.pos
445
- while true # choice
446
- _tmp = match_string(" ")
447
- break if _tmp
448
- self.pos = _save1
449
- _tmp = match_string("\t")
450
- break if _tmp
451
- self.pos = _save1
452
- _tmp = apply(:_comment)
453
- break if _tmp
454
- self.pos = _save1
455
- break
456
- end # end choice
457
-
458
- if _tmp
459
- while true
460
-
461
- _save2 = self.pos
462
- while true # choice
463
- _tmp = match_string(" ")
464
- break if _tmp
465
- self.pos = _save2
466
- _tmp = match_string("\t")
467
- break if _tmp
468
- self.pos = _save2
469
- _tmp = apply(:_comment)
470
- break if _tmp
471
- self.pos = _save2
472
- break
473
- end # end choice
474
-
475
- break unless _tmp
476
- end
477
- _tmp = true
478
- else
479
- self.pos = _save
480
- end
481
- set_failed_rule :_sig_sp unless _tmp
482
- return _tmp
483
- end
484
-
485
- # sig_wsp = (" " | "\t" | "\n" | comment)+
486
- def _sig_wsp
487
- _save = self.pos
488
-
489
- _save1 = self.pos
490
- while true # choice
491
- _tmp = match_string(" ")
492
- break if _tmp
493
- self.pos = _save1
494
- _tmp = match_string("\t")
495
- break if _tmp
496
- self.pos = _save1
497
- _tmp = match_string("\n")
498
- break if _tmp
499
- self.pos = _save1
500
- _tmp = apply(:_comment)
501
- break if _tmp
502
- self.pos = _save1
503
- break
504
- end # end choice
505
-
506
- if _tmp
507
- while true
508
-
509
- _save2 = self.pos
510
- while true # choice
511
- _tmp = match_string(" ")
512
- break if _tmp
513
- self.pos = _save2
514
- _tmp = match_string("\t")
515
- break if _tmp
516
- self.pos = _save2
517
- _tmp = match_string("\n")
518
- break if _tmp
519
- self.pos = _save2
520
- _tmp = apply(:_comment)
521
- break if _tmp
522
- self.pos = _save2
523
- break
524
- end # end choice
525
-
526
- break unless _tmp
527
- end
528
- _tmp = true
529
- else
530
- self.pos = _save
531
- end
532
- set_failed_rule :_sig_wsp unless _tmp
533
- return _tmp
534
- end
535
-
536
- # cont = (("\n" sp)+ &{ continue?(p) } | sig_sp (("\n" sp)+ &{ continue?(p) })? | &.)
537
- def _cont(p)
538
-
539
- _save = self.pos
540
- while true # choice
541
-
542
- _save1 = self.pos
543
- while true # sequence
544
- _save2 = self.pos
545
-
546
- _save3 = self.pos
547
- while true # sequence
548
- _tmp = match_string("\n")
549
- unless _tmp
550
- self.pos = _save3
551
- break
552
- end
553
- _tmp = apply(:_sp)
554
- unless _tmp
555
- self.pos = _save3
556
- end
557
- break
558
- end # end sequence
559
-
560
- if _tmp
561
- while true
562
-
563
- _save4 = self.pos
564
- while true # sequence
565
- _tmp = match_string("\n")
566
- unless _tmp
567
- self.pos = _save4
568
- break
569
- end
570
- _tmp = apply(:_sp)
571
- unless _tmp
572
- self.pos = _save4
573
- end
574
- break
575
- end # end sequence
576
-
577
- break unless _tmp
578
- end
579
- _tmp = true
580
- else
581
- self.pos = _save2
582
- end
583
- unless _tmp
584
- self.pos = _save1
585
- break
586
- end
587
- _save5 = self.pos
588
- _tmp = begin; continue?(p) ; end
589
- self.pos = _save5
590
- unless _tmp
591
- self.pos = _save1
592
- end
593
- break
594
- end # end sequence
595
-
596
- break if _tmp
597
- self.pos = _save
598
-
599
- _save6 = self.pos
600
- while true # sequence
601
- _tmp = apply(:_sig_sp)
602
- unless _tmp
603
- self.pos = _save6
604
- break
605
- end
606
- _save7 = self.pos
607
-
608
- _save8 = self.pos
609
- while true # sequence
610
- _save9 = self.pos
611
-
612
- _save10 = self.pos
613
- while true # sequence
614
- _tmp = match_string("\n")
615
- unless _tmp
616
- self.pos = _save10
617
- break
618
- end
619
- _tmp = apply(:_sp)
620
- unless _tmp
621
- self.pos = _save10
622
- end
623
- break
624
- end # end sequence
625
-
626
- if _tmp
627
- while true
628
-
629
- _save11 = self.pos
630
- while true # sequence
631
- _tmp = match_string("\n")
632
- unless _tmp
633
- self.pos = _save11
634
- break
635
- end
636
- _tmp = apply(:_sp)
637
- unless _tmp
638
- self.pos = _save11
639
- end
640
- break
641
- end # end sequence
642
-
643
- break unless _tmp
644
- end
645
- _tmp = true
646
- else
647
- self.pos = _save9
648
- end
649
- unless _tmp
650
- self.pos = _save8
651
- break
652
- end
653
- _save12 = self.pos
654
- _tmp = begin; continue?(p) ; end
655
- self.pos = _save12
656
- unless _tmp
657
- self.pos = _save8
658
- end
659
- break
660
- end # end sequence
661
-
662
- unless _tmp
663
- _tmp = true
664
- self.pos = _save7
665
- end
666
- unless _tmp
667
- self.pos = _save6
668
- end
669
- break
670
- end # end sequence
671
-
672
- break if _tmp
673
- self.pos = _save
674
- _save13 = self.pos
675
- _tmp = get_byte
676
- self.pos = _save13
677
- break if _tmp
678
- self.pos = _save
679
- break
680
- end # end choice
681
-
682
- set_failed_rule :_cont unless _tmp
683
- return _tmp
684
- end
685
-
686
- # line = { current_line }
687
- def _line
688
- @result = begin; current_line ; end
689
- _tmp = true
690
- set_failed_rule :_line unless _tmp
691
- return _tmp
692
- end
693
-
694
- # ident_start = < /[\p{Ll}_]/u > { text }
695
- def _ident_start
696
-
697
- _save = self.pos
698
- while true # sequence
699
- _text_start = self.pos
700
- _tmp = scan(/\A(?-mix:[\p{Ll}_])/u)
701
- if _tmp
702
- text = get_text(_text_start)
703
- end
704
- unless _tmp
705
- self.pos = _save
706
- break
707
- end
708
- @result = begin; text ; end
709
- _tmp = true
710
- unless _tmp
711
- self.pos = _save
712
- end
713
- break
714
- end # end sequence
715
-
716
- set_failed_rule :_ident_start unless _tmp
717
- return _tmp
718
- end
719
-
720
- # ident_letter = < (/[\p{L}\d]/u | !":" op_letter) > { text }
721
- def _ident_letter
722
-
723
- _save = self.pos
724
- while true # sequence
725
- _text_start = self.pos
726
-
727
- _save1 = self.pos
728
- while true # choice
729
- _tmp = scan(/\A(?-mix:[\p{L}\d])/u)
730
- break if _tmp
731
- self.pos = _save1
732
-
733
- _save2 = self.pos
734
- while true # sequence
735
- _save3 = self.pos
736
- _tmp = match_string(":")
737
- _tmp = _tmp ? nil : true
738
- self.pos = _save3
739
- unless _tmp
740
- self.pos = _save2
741
- break
742
- end
743
- _tmp = apply(:_op_letter)
744
- unless _tmp
745
- self.pos = _save2
746
- end
747
- break
748
- end # end sequence
749
-
750
- break if _tmp
751
- self.pos = _save1
752
- break
753
- end # end choice
754
-
755
- if _tmp
756
- text = get_text(_text_start)
757
- end
758
- unless _tmp
759
- self.pos = _save
760
- break
761
- end
762
- @result = begin; text ; end
763
- _tmp = true
764
- unless _tmp
765
- self.pos = _save
766
- end
767
- break
768
- end # end sequence
769
-
770
- set_failed_rule :_ident_letter unless _tmp
771
- return _tmp
772
- end
773
-
774
- # op_letter = < /[\p{S}!@#%&*\-\\:.\/\?]/u > { text }
775
- def _op_letter
776
-
777
- _save = self.pos
778
- while true # sequence
779
- _text_start = self.pos
780
- _tmp = scan(/\A(?-mix:[\p{S}!@#%&*\-\\:.\/\?])/u)
781
- if _tmp
782
- text = get_text(_text_start)
783
- end
784
- unless _tmp
785
- self.pos = _save
786
- break
787
- end
788
- @result = begin; text ; end
789
- _tmp = true
790
- unless _tmp
791
- self.pos = _save
792
- end
793
- break
794
- end # end sequence
795
-
796
- set_failed_rule :_op_letter unless _tmp
797
- return _tmp
798
- end
799
-
800
- # operator = < op_letter+ > &{ text != ":" } { text }
801
- def _operator
802
-
803
- _save = self.pos
804
- while true # sequence
805
- _text_start = self.pos
806
- _save1 = self.pos
807
- _tmp = apply(:_op_letter)
808
- if _tmp
809
- while true
810
- _tmp = apply(:_op_letter)
811
- break unless _tmp
812
- end
813
- _tmp = true
814
- else
815
- self.pos = _save1
816
- end
817
- if _tmp
818
- text = get_text(_text_start)
819
- end
820
- unless _tmp
821
- self.pos = _save
822
- break
823
- end
824
- _save2 = self.pos
825
- _tmp = begin; text != ":" ; end
826
- self.pos = _save2
827
- unless _tmp
828
- self.pos = _save
829
- break
830
- end
831
- @result = begin; text ; end
832
- _tmp = true
833
- unless _tmp
834
- self.pos = _save
835
- end
836
- break
837
- end # end sequence
838
-
839
- set_failed_rule :_operator unless _tmp
840
- return _tmp
841
- end
842
-
843
- # identifier = < ident_start ident_letter* > { text.tr("-", "_") }
844
- def _identifier
845
-
846
- _save = self.pos
847
- while true # sequence
848
- _text_start = self.pos
849
-
850
- _save1 = self.pos
851
- while true # sequence
852
- _tmp = apply(:_ident_start)
853
- unless _tmp
854
- self.pos = _save1
855
- break
856
- end
857
- while true
858
- _tmp = apply(:_ident_letter)
859
- break unless _tmp
860
- end
861
- _tmp = true
862
- unless _tmp
863
- self.pos = _save1
864
- end
865
- break
866
- end # end sequence
867
-
868
- if _tmp
869
- text = get_text(_text_start)
870
- end
871
- unless _tmp
872
- self.pos = _save
873
- break
874
- end
875
- @result = begin; text.tr("-", "_") ; end
876
- _tmp = true
877
- unless _tmp
878
- self.pos = _save
879
- end
880
- break
881
- end # end sequence
882
-
883
- set_failed_rule :_identifier unless _tmp
884
- return _tmp
885
- end
886
-
887
- # grouped = "(" wsp expression:x wsp ")" { x }
888
- def _grouped
889
-
890
- _save = self.pos
891
- while true # sequence
892
- _tmp = match_string("(")
893
- unless _tmp
894
- self.pos = _save
895
- break
896
- end
897
- _tmp = apply(:_wsp)
898
- unless _tmp
899
- self.pos = _save
900
- break
901
- end
902
- _tmp = apply(:_expression)
903
- x = @result
904
- unless _tmp
905
- self.pos = _save
906
- break
907
- end
908
- _tmp = apply(:_wsp)
909
- unless _tmp
910
- self.pos = _save
911
- break
912
- end
913
- _tmp = match_string(")")
914
- unless _tmp
915
- self.pos = _save
916
- break
917
- end
918
- @result = begin; x ; end
919
- _tmp = true
920
- unless _tmp
921
- self.pos = _save
922
- end
923
- break
924
- end # end sequence
925
-
926
- set_failed_rule :_grouped unless _tmp
927
- return _tmp
928
- end
929
-
930
- # comment = (/--.*?$/ | multi_comment)
931
- def _comment
932
-
933
- _save = self.pos
934
- while true # choice
935
- _tmp = scan(/\A(?-mix:--.*?$)/)
936
- break if _tmp
937
- self.pos = _save
938
- _tmp = apply(:_multi_comment)
939
- break if _tmp
940
- self.pos = _save
941
- break
942
- end # end choice
943
-
944
- set_failed_rule :_comment unless _tmp
945
- return _tmp
946
- end
947
-
948
- # multi_comment = "{-" in_multi
949
- def _multi_comment
950
-
951
- _save = self.pos
952
- while true # sequence
953
- _tmp = match_string("{-")
954
- unless _tmp
955
- self.pos = _save
956
- break
957
- end
958
- _tmp = apply(:_in_multi)
959
- unless _tmp
960
- self.pos = _save
961
- end
962
- break
963
- end # end sequence
964
-
965
- set_failed_rule :_multi_comment unless _tmp
966
- return _tmp
967
- end
968
-
969
- # in_multi = (/[^\-\{\}]*/ "-}" | /[^\-\{\}]*/ "{-" in_multi /[^\-\{\}]*/ "-}" | /[^\-\{\}]*/ /[-{}]/ in_multi)
970
- def _in_multi
971
-
972
- _save = self.pos
973
- while true # choice
974
-
975
- _save1 = self.pos
976
- while true # sequence
977
- _tmp = scan(/\A(?-mix:[^\-\{\}]*)/)
978
- unless _tmp
979
- self.pos = _save1
980
- break
981
- end
982
- _tmp = match_string("-}")
983
- unless _tmp
984
- self.pos = _save1
985
- end
986
- break
987
- end # end sequence
988
-
989
- break if _tmp
990
- self.pos = _save
991
-
992
- _save2 = self.pos
993
- while true # sequence
994
- _tmp = scan(/\A(?-mix:[^\-\{\}]*)/)
995
- unless _tmp
996
- self.pos = _save2
997
- break
998
- end
999
- _tmp = match_string("{-")
1000
- unless _tmp
1001
- self.pos = _save2
1002
- break
1003
- end
1004
- _tmp = apply(:_in_multi)
1005
- unless _tmp
1006
- self.pos = _save2
1007
- break
1008
- end
1009
- _tmp = scan(/\A(?-mix:[^\-\{\}]*)/)
1010
- unless _tmp
1011
- self.pos = _save2
1012
- break
1013
- end
1014
- _tmp = match_string("-}")
1015
- unless _tmp
1016
- self.pos = _save2
1017
- end
1018
- break
1019
- end # end sequence
1020
-
1021
- break if _tmp
1022
- self.pos = _save
1023
-
1024
- _save3 = self.pos
1025
- while true # sequence
1026
- _tmp = scan(/\A(?-mix:[^\-\{\}]*)/)
1027
- unless _tmp
1028
- self.pos = _save3
1029
- break
1030
- end
1031
- _tmp = scan(/\A(?-mix:[-{}])/)
1032
- unless _tmp
1033
- self.pos = _save3
1034
- break
1035
- end
1036
- _tmp = apply(:_in_multi)
1037
- unless _tmp
1038
- self.pos = _save3
1039
- end
1040
- break
1041
- end # end sequence
1042
-
1043
- break if _tmp
1044
- self.pos = _save
1045
- break
1046
- end # end choice
1047
-
1048
- set_failed_rule :_in_multi unless _tmp
1049
- return _tmp
1050
- end
1051
-
1052
- # delim = (wsp "," wsp | (sp "\n" sp)+ &{ current_column >= c })
1053
- def _delim(c)
1054
-
1055
- _save = self.pos
1056
- while true # choice
1057
-
1058
- _save1 = self.pos
1059
- while true # sequence
1060
- _tmp = apply(:_wsp)
1061
- unless _tmp
1062
- self.pos = _save1
1063
- break
1064
- end
1065
- _tmp = match_string(",")
1066
- unless _tmp
1067
- self.pos = _save1
1068
- break
1069
- end
1070
- _tmp = apply(:_wsp)
1071
- unless _tmp
1072
- self.pos = _save1
1073
- end
1074
- break
1075
- end # end sequence
1076
-
1077
- break if _tmp
1078
- self.pos = _save
1079
-
1080
- _save2 = self.pos
1081
- while true # sequence
1082
- _save3 = self.pos
1083
-
1084
- _save4 = self.pos
1085
- while true # sequence
1086
- _tmp = apply(:_sp)
1087
- unless _tmp
1088
- self.pos = _save4
1089
- break
1090
- end
1091
- _tmp = match_string("\n")
1092
- unless _tmp
1093
- self.pos = _save4
1094
- break
1095
- end
1096
- _tmp = apply(:_sp)
1097
- unless _tmp
1098
- self.pos = _save4
1099
- end
1100
- break
1101
- end # end sequence
1102
-
1103
- if _tmp
1104
- while true
1105
-
1106
- _save5 = self.pos
1107
- while true # sequence
1108
- _tmp = apply(:_sp)
1109
- unless _tmp
1110
- self.pos = _save5
1111
- break
1112
- end
1113
- _tmp = match_string("\n")
1114
- unless _tmp
1115
- self.pos = _save5
1116
- break
1117
- end
1118
- _tmp = apply(:_sp)
1119
- unless _tmp
1120
- self.pos = _save5
1121
- end
1122
- break
1123
- end # end sequence
1124
-
1125
- break unless _tmp
1126
- end
1127
- _tmp = true
1128
- else
1129
- self.pos = _save3
1130
- end
1131
- unless _tmp
1132
- self.pos = _save2
1133
- break
1134
- end
1135
- _save6 = self.pos
1136
- _tmp = begin; current_column >= c ; end
1137
- self.pos = _save6
1138
- unless _tmp
1139
- self.pos = _save2
1140
- end
1141
- break
1142
- end # end sequence
1143
-
1144
- break if _tmp
1145
- self.pos = _save
1146
- break
1147
- end # end choice
1148
-
1149
- set_failed_rule :_delim unless _tmp
1150
- return _tmp
1151
- end
1152
-
1153
- # expression = level3
1154
- def _expression
1155
- _tmp = apply(:_level3)
1156
- set_failed_rule :_expression unless _tmp
1157
- return _tmp
1158
- end
1159
-
1160
- # expressions = { current_column }:c expression:x (delim(c) expression)*:xs delim(c)? { [x] + Array(xs) }
1161
- def _expressions
1162
-
1163
- _save = self.pos
1164
- while true # sequence
1165
- @result = begin; current_column ; end
1166
- _tmp = true
1167
- c = @result
1168
- unless _tmp
1169
- self.pos = _save
1170
- break
1171
- end
1172
- _tmp = apply(:_expression)
1173
- x = @result
1174
- unless _tmp
1175
- self.pos = _save
1176
- break
1177
- end
1178
- _ary = []
1179
- while true
1180
-
1181
- _save2 = self.pos
1182
- while true # sequence
1183
- _tmp = _delim(c)
1184
- unless _tmp
1185
- self.pos = _save2
1186
- break
1187
- end
1188
- _tmp = apply(:_expression)
1189
- unless _tmp
1190
- self.pos = _save2
1191
- end
1192
- break
1193
- end # end sequence
1194
-
1195
- _ary << @result if _tmp
1196
- break unless _tmp
1197
- end
1198
- _tmp = true
1199
- @result = _ary
1200
- xs = @result
1201
- unless _tmp
1202
- self.pos = _save
1203
- break
1204
- end
1205
- _save3 = self.pos
1206
- _tmp = _delim(c)
1207
- unless _tmp
1208
- _tmp = true
1209
- self.pos = _save3
1210
- end
1211
- unless _tmp
1212
- self.pos = _save
1213
- break
1214
- end
1215
- @result = begin; [x] + Array(xs) ; end
1216
- _tmp = true
1217
- unless _tmp
1218
- self.pos = _save
1219
- end
1220
- break
1221
- end # end sequence
1222
-
1223
- set_failed_rule :_expressions unless _tmp
1224
- return _tmp
1225
- end
1226
-
1227
- # level0 = (true | false | self | nil | number | quote | quasi_quote | splice | unquote | string | constant | variable | block | list | unary)
1228
- def _level0
1229
-
1230
- _save = self.pos
1231
- while true # choice
1232
- _tmp = apply(:_true)
1233
- break if _tmp
1234
- self.pos = _save
1235
- _tmp = apply(:_false)
1236
- break if _tmp
1237
- self.pos = _save
1238
- _tmp = apply(:_self)
1239
- break if _tmp
1240
- self.pos = _save
1241
- _tmp = apply(:_nil)
1242
- break if _tmp
1243
- self.pos = _save
1244
- _tmp = apply(:_number)
1245
- break if _tmp
1246
- self.pos = _save
1247
- _tmp = apply(:_quote)
1248
- break if _tmp
1249
- self.pos = _save
1250
- _tmp = apply(:_quasi_quote)
1251
- break if _tmp
1252
- self.pos = _save
1253
- _tmp = apply(:_splice)
1254
- break if _tmp
1255
- self.pos = _save
1256
- _tmp = apply(:_unquote)
1257
- break if _tmp
1258
- self.pos = _save
1259
- _tmp = apply(:_string)
1260
- break if _tmp
1261
- self.pos = _save
1262
- _tmp = apply(:_constant)
1263
- break if _tmp
1264
- self.pos = _save
1265
- _tmp = apply(:_variable)
1266
- break if _tmp
1267
- self.pos = _save
1268
- _tmp = apply(:_block)
1269
- break if _tmp
1270
- self.pos = _save
1271
- _tmp = apply(:_list)
1272
- break if _tmp
1273
- self.pos = _save
1274
- _tmp = apply(:_unary)
1275
- break if _tmp
1276
- self.pos = _save
1277
- break
1278
- end # end choice
1279
-
1280
- set_failed_rule :_level0 unless _tmp
1281
- return _tmp
1282
- end
1283
-
1284
- # level1 = (headless | grouped | level0)
1285
- def _level1
1286
-
1287
- _save = self.pos
1288
- while true # choice
1289
- _tmp = apply(:_headless)
1290
- break if _tmp
1291
- self.pos = _save
1292
- _tmp = apply(:_grouped)
1293
- break if _tmp
1294
- self.pos = _save
1295
- _tmp = apply(:_level0)
1296
- break if _tmp
1297
- self.pos = _save
1298
- break
1299
- end # end choice
1300
-
1301
- set_failed_rule :_level1 unless _tmp
1302
- return _tmp
1303
- end
1304
-
1305
- # level2 = (send | level1)
1306
- def _level2
1307
-
1308
- _save = self.pos
1309
- while true # choice
1310
- _tmp = apply(:_send)
1311
- break if _tmp
1312
- self.pos = _save
1313
- _tmp = apply(:_level1)
1314
- break if _tmp
1315
- self.pos = _save
1316
- break
1317
- end # end choice
1318
-
1319
- set_failed_rule :_level2 unless _tmp
1320
- return _tmp
1321
- end
1322
-
1323
- # level3 = (macro | op_assoc_prec | binary_send | level2)
1324
- def _level3
1325
-
1326
- _save = self.pos
1327
- while true # choice
1328
- _tmp = apply(:_macro)
1329
- break if _tmp
1330
- self.pos = _save
1331
- _tmp = apply(:_op_assoc_prec)
1332
- break if _tmp
1333
- self.pos = _save
1334
- _tmp = apply(:_binary_send)
1335
- break if _tmp
1336
- self.pos = _save
1337
- _tmp = apply(:_level2)
1338
- break if _tmp
1339
- self.pos = _save
1340
- break
1341
- end # end choice
1342
-
1343
- set_failed_rule :_level3 unless _tmp
1344
- return _tmp
1345
- end
1346
-
1347
- # true = line:line "true" !ident_letter { Atomy::AST::Primitive.new(line, :true) }
1348
- def _true
1349
-
1350
- _save = self.pos
1351
- while true # sequence
1352
- _tmp = apply(:_line)
1353
- line = @result
1354
- unless _tmp
1355
- self.pos = _save
1356
- break
1357
- end
1358
- _tmp = match_string("true")
1359
- unless _tmp
1360
- self.pos = _save
1361
- break
1362
- end
1363
- _save1 = self.pos
1364
- _tmp = apply(:_ident_letter)
1365
- _tmp = _tmp ? nil : true
1366
- self.pos = _save1
1367
- unless _tmp
1368
- self.pos = _save
1369
- break
1370
- end
1371
- @result = begin; Atomy::AST::Primitive.new(line, :true) ; end
1372
- _tmp = true
1373
- unless _tmp
1374
- self.pos = _save
1375
- end
1376
- break
1377
- end # end sequence
1378
-
1379
- set_failed_rule :_true unless _tmp
1380
- return _tmp
1381
- end
1382
-
1383
- # false = line:line "false" !ident_letter { Atomy::AST::Primitive.new(line, :false) }
1384
- def _false
1385
-
1386
- _save = self.pos
1387
- while true # sequence
1388
- _tmp = apply(:_line)
1389
- line = @result
1390
- unless _tmp
1391
- self.pos = _save
1392
- break
1393
- end
1394
- _tmp = match_string("false")
1395
- unless _tmp
1396
- self.pos = _save
1397
- break
1398
- end
1399
- _save1 = self.pos
1400
- _tmp = apply(:_ident_letter)
1401
- _tmp = _tmp ? nil : true
1402
- self.pos = _save1
1403
- unless _tmp
1404
- self.pos = _save
1405
- break
1406
- end
1407
- @result = begin; Atomy::AST::Primitive.new(line, :false) ; end
1408
- _tmp = true
1409
- unless _tmp
1410
- self.pos = _save
1411
- end
1412
- break
1413
- end # end sequence
1414
-
1415
- set_failed_rule :_false unless _tmp
1416
- return _tmp
1417
- end
1418
-
1419
- # self = line:line "self" !ident_letter { Atomy::AST::Primitive.new(line, :self) }
1420
- def _self
1421
-
1422
- _save = self.pos
1423
- while true # sequence
1424
- _tmp = apply(:_line)
1425
- line = @result
1426
- unless _tmp
1427
- self.pos = _save
1428
- break
1429
- end
1430
- _tmp = match_string("self")
1431
- unless _tmp
1432
- self.pos = _save
1433
- break
1434
- end
1435
- _save1 = self.pos
1436
- _tmp = apply(:_ident_letter)
1437
- _tmp = _tmp ? nil : true
1438
- self.pos = _save1
1439
- unless _tmp
1440
- self.pos = _save
1441
- break
1442
- end
1443
- @result = begin; Atomy::AST::Primitive.new(line, :self) ; end
1444
- _tmp = true
1445
- unless _tmp
1446
- self.pos = _save
1447
- end
1448
- break
1449
- end # end sequence
1450
-
1451
- set_failed_rule :_self unless _tmp
1452
- return _tmp
1453
- end
1454
-
1455
- # nil = line:line "nil" !ident_letter { Atomy::AST::Primitive.new(line, :nil) }
1456
- def _nil
1457
-
1458
- _save = self.pos
1459
- while true # sequence
1460
- _tmp = apply(:_line)
1461
- line = @result
1462
- unless _tmp
1463
- self.pos = _save
1464
- break
1465
- end
1466
- _tmp = match_string("nil")
1467
- unless _tmp
1468
- self.pos = _save
1469
- break
1470
- end
1471
- _save1 = self.pos
1472
- _tmp = apply(:_ident_letter)
1473
- _tmp = _tmp ? nil : true
1474
- self.pos = _save1
1475
- unless _tmp
1476
- self.pos = _save
1477
- break
1478
- end
1479
- @result = begin; Atomy::AST::Primitive.new(line, :nil) ; end
1480
- _tmp = true
1481
- unless _tmp
1482
- self.pos = _save
1483
- end
1484
- break
1485
- end # end sequence
1486
-
1487
- set_failed_rule :_nil unless _tmp
1488
- return _tmp
1489
- end
1490
-
1491
- # number = (line:line < /[\+\-]?0[oO][\da-fA-F]+/ > { Atomy::AST::Primitive.new(line, text.to_i(8)) } | line:line < /[\+\-]?0[xX][0-7]+/ > { Atomy::AST::Primitive.new(line, text.to_i(16)) } | line:line < /[\+\-]?\d+(\.\d+)?[eE][\+\-]?\d+/ > { Atomy::AST::Primitive.new(line, text.to_f) } | line:line < /[\+\-]?\d+\.\d+/ > { Atomy::AST::Primitive.new(line, text.to_f) } | line:line < /[\+\-]?\d+/ > { Atomy::AST::Primitive.new(line, text.to_i) })
1492
- def _number
1493
-
1494
- _save = self.pos
1495
- while true # choice
1496
-
1497
- _save1 = self.pos
1498
- while true # sequence
1499
- _tmp = apply(:_line)
1500
- line = @result
1501
- unless _tmp
1502
- self.pos = _save1
1503
- break
1504
- end
1505
- _text_start = self.pos
1506
- _tmp = scan(/\A(?-mix:[\+\-]?0[oO][\da-fA-F]+)/)
1507
- if _tmp
1508
- text = get_text(_text_start)
1509
- end
1510
- unless _tmp
1511
- self.pos = _save1
1512
- break
1513
- end
1514
- @result = begin; Atomy::AST::Primitive.new(line, text.to_i(8)) ; end
1515
- _tmp = true
1516
- unless _tmp
1517
- self.pos = _save1
1518
- end
1519
- break
1520
- end # end sequence
1521
-
1522
- break if _tmp
1523
- self.pos = _save
1524
-
1525
- _save2 = self.pos
1526
- while true # sequence
1527
- _tmp = apply(:_line)
1528
- line = @result
1529
- unless _tmp
1530
- self.pos = _save2
1531
- break
1532
- end
1533
- _text_start = self.pos
1534
- _tmp = scan(/\A(?-mix:[\+\-]?0[xX][0-7]+)/)
1535
- if _tmp
1536
- text = get_text(_text_start)
1537
- end
1538
- unless _tmp
1539
- self.pos = _save2
1540
- break
1541
- end
1542
- @result = begin; Atomy::AST::Primitive.new(line, text.to_i(16)) ; end
1543
- _tmp = true
1544
- unless _tmp
1545
- self.pos = _save2
1546
- end
1547
- break
1548
- end # end sequence
1549
-
1550
- break if _tmp
1551
- self.pos = _save
1552
-
1553
- _save3 = self.pos
1554
- while true # sequence
1555
- _tmp = apply(:_line)
1556
- line = @result
1557
- unless _tmp
1558
- self.pos = _save3
1559
- break
1560
- end
1561
- _text_start = self.pos
1562
- _tmp = scan(/\A(?-mix:[\+\-]?\d+(\.\d+)?[eE][\+\-]?\d+)/)
1563
- if _tmp
1564
- text = get_text(_text_start)
1565
- end
1566
- unless _tmp
1567
- self.pos = _save3
1568
- break
1569
- end
1570
- @result = begin; Atomy::AST::Primitive.new(line, text.to_f) ; end
1571
- _tmp = true
1572
- unless _tmp
1573
- self.pos = _save3
1574
- end
1575
- break
1576
- end # end sequence
1577
-
1578
- break if _tmp
1579
- self.pos = _save
1580
-
1581
- _save4 = self.pos
1582
- while true # sequence
1583
- _tmp = apply(:_line)
1584
- line = @result
1585
- unless _tmp
1586
- self.pos = _save4
1587
- break
1588
- end
1589
- _text_start = self.pos
1590
- _tmp = scan(/\A(?-mix:[\+\-]?\d+\.\d+)/)
1591
- if _tmp
1592
- text = get_text(_text_start)
1593
- end
1594
- unless _tmp
1595
- self.pos = _save4
1596
- break
1597
- end
1598
- @result = begin; Atomy::AST::Primitive.new(line, text.to_f) ; end
1599
- _tmp = true
1600
- unless _tmp
1601
- self.pos = _save4
1602
- end
1603
- break
1604
- end # end sequence
1605
-
1606
- break if _tmp
1607
- self.pos = _save
1608
-
1609
- _save5 = self.pos
1610
- while true # sequence
1611
- _tmp = apply(:_line)
1612
- line = @result
1613
- unless _tmp
1614
- self.pos = _save5
1615
- break
1616
- end
1617
- _text_start = self.pos
1618
- _tmp = scan(/\A(?-mix:[\+\-]?\d+)/)
1619
- if _tmp
1620
- text = get_text(_text_start)
1621
- end
1622
- unless _tmp
1623
- self.pos = _save5
1624
- break
1625
- end
1626
- @result = begin; Atomy::AST::Primitive.new(line, text.to_i) ; end
1627
- _tmp = true
1628
- unless _tmp
1629
- self.pos = _save5
1630
- end
1631
- break
1632
- end # end sequence
1633
-
1634
- break if _tmp
1635
- self.pos = _save
1636
- break
1637
- end # end choice
1638
-
1639
- set_failed_rule :_number unless _tmp
1640
- return _tmp
1641
- end
1642
-
1643
- # macro = line:line "macro" "(" wsp expression:p wsp ")" wsp block:b { Atomy::AST::Macro.new(line, p, b.block_body) }
1644
- def _macro
1645
-
1646
- _save = self.pos
1647
- while true # sequence
1648
- _tmp = apply(:_line)
1649
- line = @result
1650
- unless _tmp
1651
- self.pos = _save
1652
- break
1653
- end
1654
- _tmp = match_string("macro")
1655
- unless _tmp
1656
- self.pos = _save
1657
- break
1658
- end
1659
- _tmp = match_string("(")
1660
- unless _tmp
1661
- self.pos = _save
1662
- break
1663
- end
1664
- _tmp = apply(:_wsp)
1665
- unless _tmp
1666
- self.pos = _save
1667
- break
1668
- end
1669
- _tmp = apply(:_expression)
1670
- p = @result
1671
- unless _tmp
1672
- self.pos = _save
1673
- break
1674
- end
1675
- _tmp = apply(:_wsp)
1676
- unless _tmp
1677
- self.pos = _save
1678
- break
1679
- end
1680
- _tmp = match_string(")")
1681
- unless _tmp
1682
- self.pos = _save
1683
- break
1684
- end
1685
- _tmp = apply(:_wsp)
1686
- unless _tmp
1687
- self.pos = _save
1688
- break
1689
- end
1690
- _tmp = apply(:_block)
1691
- b = @result
1692
- unless _tmp
1693
- self.pos = _save
1694
- break
1695
- end
1696
- @result = begin; Atomy::AST::Macro.new(line, p, b.block_body) ; end
1697
- _tmp = true
1698
- unless _tmp
1699
- self.pos = _save
1700
- end
1701
- break
1702
- end # end sequence
1703
-
1704
- set_failed_rule :_macro unless _tmp
1705
- return _tmp
1706
- end
1707
-
1708
- # op_assoc = sig_wsp < /left|right/ > { text.to_sym }
1709
- def _op_assoc
1710
-
1711
- _save = self.pos
1712
- while true # sequence
1713
- _tmp = apply(:_sig_wsp)
1714
- unless _tmp
1715
- self.pos = _save
1716
- break
1717
- end
1718
- _text_start = self.pos
1719
- _tmp = scan(/\A(?-mix:left|right)/)
1720
- if _tmp
1721
- text = get_text(_text_start)
1722
- end
1723
- unless _tmp
1724
- self.pos = _save
1725
- break
1726
- end
1727
- @result = begin; text.to_sym ; end
1728
- _tmp = true
1729
- unless _tmp
1730
- self.pos = _save
1731
- end
1732
- break
1733
- end # end sequence
1734
-
1735
- set_failed_rule :_op_assoc unless _tmp
1736
- return _tmp
1737
- end
1738
-
1739
- # op_prec = sig_wsp < /[0-9]+/ > { text.to_i }
1740
- def _op_prec
1741
-
1742
- _save = self.pos
1743
- while true # sequence
1744
- _tmp = apply(:_sig_wsp)
1745
- unless _tmp
1746
- self.pos = _save
1747
- break
1748
- end
1749
- _text_start = self.pos
1750
- _tmp = scan(/\A(?-mix:[0-9]+)/)
1751
- if _tmp
1752
- text = get_text(_text_start)
1753
- end
1754
- unless _tmp
1755
- self.pos = _save
1756
- break
1757
- end
1758
- @result = begin; text.to_i ; end
1759
- _tmp = true
1760
- unless _tmp
1761
- self.pos = _save
1762
- end
1763
- break
1764
- end # end sequence
1765
-
1766
- set_failed_rule :_op_prec unless _tmp
1767
- return _tmp
1768
- end
1769
-
1770
- # op_assoc_prec = line:line "operator" op_assoc?:assoc op_prec:prec (sig_wsp operator)+:os { Atomy::Macro.set_op_info(os, assoc, prec) Atomy::AST::Operator.new(line, assoc, prec, os) }
1771
- def _op_assoc_prec
1772
-
1773
- _save = self.pos
1774
- while true # sequence
1775
- _tmp = apply(:_line)
1776
- line = @result
1777
- unless _tmp
1778
- self.pos = _save
1779
- break
1780
- end
1781
- _tmp = match_string("operator")
1782
- unless _tmp
1783
- self.pos = _save
1784
- break
1785
- end
1786
- _save1 = self.pos
1787
- _tmp = apply(:_op_assoc)
1788
- @result = nil unless _tmp
1789
- unless _tmp
1790
- _tmp = true
1791
- self.pos = _save1
1792
- end
1793
- assoc = @result
1794
- unless _tmp
1795
- self.pos = _save
1796
- break
1797
- end
1798
- _tmp = apply(:_op_prec)
1799
- prec = @result
1800
- unless _tmp
1801
- self.pos = _save
1802
- break
1803
- end
1804
- _save2 = self.pos
1805
- _ary = []
1806
-
1807
- _save3 = self.pos
1808
- while true # sequence
1809
- _tmp = apply(:_sig_wsp)
1810
- unless _tmp
1811
- self.pos = _save3
1812
- break
1813
- end
1814
- _tmp = apply(:_operator)
1815
- unless _tmp
1816
- self.pos = _save3
1817
- end
1818
- break
1819
- end # end sequence
1820
-
1821
- if _tmp
1822
- _ary << @result
1823
- while true
1824
-
1825
- _save4 = self.pos
1826
- while true # sequence
1827
- _tmp = apply(:_sig_wsp)
1828
- unless _tmp
1829
- self.pos = _save4
1830
- break
1831
- end
1832
- _tmp = apply(:_operator)
1833
- unless _tmp
1834
- self.pos = _save4
1835
- end
1836
- break
1837
- end # end sequence
1838
-
1839
- _ary << @result if _tmp
1840
- break unless _tmp
1841
- end
1842
- _tmp = true
1843
- @result = _ary
1844
- else
1845
- self.pos = _save2
1846
- end
1847
- os = @result
1848
- unless _tmp
1849
- self.pos = _save
1850
- break
1851
- end
1852
- @result = begin; Atomy::Macro.set_op_info(os, assoc, prec)
1853
- Atomy::AST::Operator.new(line, assoc, prec, os)
1854
- ; end
1855
- _tmp = true
1856
- unless _tmp
1857
- self.pos = _save
1858
- end
1859
- break
1860
- end # end sequence
1861
-
1862
- set_failed_rule :_op_assoc_prec unless _tmp
1863
- return _tmp
1864
- end
1865
-
1866
- # quote = line:line "'" level1:e { Atomy::AST::Quote.new(line, e) }
1867
- def _quote
1868
-
1869
- _save = self.pos
1870
- while true # sequence
1871
- _tmp = apply(:_line)
1872
- line = @result
1873
- unless _tmp
1874
- self.pos = _save
1875
- break
1876
- end
1877
- _tmp = match_string("'")
1878
- unless _tmp
1879
- self.pos = _save
1880
- break
1881
- end
1882
- _tmp = apply(:_level1)
1883
- e = @result
1884
- unless _tmp
1885
- self.pos = _save
1886
- break
1887
- end
1888
- @result = begin; Atomy::AST::Quote.new(line, e) ; end
1889
- _tmp = true
1890
- unless _tmp
1891
- self.pos = _save
1892
- end
1893
- break
1894
- end # end sequence
1895
-
1896
- set_failed_rule :_quote unless _tmp
1897
- return _tmp
1898
- end
1899
-
1900
- # quasi_quote = line:line "`" level1:e { Atomy::AST::QuasiQuote.new(line, e) }
1901
- def _quasi_quote
1902
-
1903
- _save = self.pos
1904
- while true # sequence
1905
- _tmp = apply(:_line)
1906
- line = @result
1907
- unless _tmp
1908
- self.pos = _save
1909
- break
1910
- end
1911
- _tmp = match_string("`")
1912
- unless _tmp
1913
- self.pos = _save
1914
- break
1915
- end
1916
- _tmp = apply(:_level1)
1917
- e = @result
1918
- unless _tmp
1919
- self.pos = _save
1920
- break
1921
- end
1922
- @result = begin; Atomy::AST::QuasiQuote.new(line, e) ; end
1923
- _tmp = true
1924
- unless _tmp
1925
- self.pos = _save
1926
- end
1927
- break
1928
- end # end sequence
1929
-
1930
- set_failed_rule :_quasi_quote unless _tmp
1931
- return _tmp
1932
- end
1933
-
1934
- # splice = line:line "~*" level1:e { Atomy::AST::Splice.new(line, e) }
1935
- def _splice
1936
-
1937
- _save = self.pos
1938
- while true # sequence
1939
- _tmp = apply(:_line)
1940
- line = @result
1941
- unless _tmp
1942
- self.pos = _save
1943
- break
1944
- end
1945
- _tmp = match_string("~*")
1946
- unless _tmp
1947
- self.pos = _save
1948
- break
1949
- end
1950
- _tmp = apply(:_level1)
1951
- e = @result
1952
- unless _tmp
1953
- self.pos = _save
1954
- break
1955
- end
1956
- @result = begin; Atomy::AST::Splice.new(line, e) ; end
1957
- _tmp = true
1958
- unless _tmp
1959
- self.pos = _save
1960
- end
1961
- break
1962
- end # end sequence
1963
-
1964
- set_failed_rule :_splice unless _tmp
1965
- return _tmp
1966
- end
1967
-
1968
- # unquote = line:line "~" level1:e { Atomy::AST::Unquote.new(line, e) }
1969
- def _unquote
1970
-
1971
- _save = self.pos
1972
- while true # sequence
1973
- _tmp = apply(:_line)
1974
- line = @result
1975
- unless _tmp
1976
- self.pos = _save
1977
- break
1978
- end
1979
- _tmp = match_string("~")
1980
- unless _tmp
1981
- self.pos = _save
1982
- break
1983
- end
1984
- _tmp = apply(:_level1)
1985
- e = @result
1986
- unless _tmp
1987
- self.pos = _save
1988
- break
1989
- end
1990
- @result = begin; Atomy::AST::Unquote.new(line, e) ; end
1991
- _tmp = true
1992
- unless _tmp
1993
- self.pos = _save
1994
- end
1995
- break
1996
- end # end sequence
1997
-
1998
- set_failed_rule :_unquote unless _tmp
1999
- return _tmp
2000
- end
2001
-
2002
- # escape = (number_escapes | escapes)
2003
- def _escape
2004
-
2005
- _save = self.pos
2006
- while true # choice
2007
- _tmp = apply(:_number_escapes)
2008
- break if _tmp
2009
- self.pos = _save
2010
- _tmp = apply(:_escapes)
2011
- break if _tmp
2012
- self.pos = _save
2013
- break
2014
- end # end choice
2015
-
2016
- set_failed_rule :_escape unless _tmp
2017
- return _tmp
2018
- end
2019
-
2020
- # str_seq = < /[^\\"]+/ > { text }
2021
- def _str_seq
2022
-
2023
- _save = self.pos
2024
- while true # sequence
2025
- _text_start = self.pos
2026
- _tmp = scan(/\A(?-mix:[^\\"]+)/)
2027
- if _tmp
2028
- text = get_text(_text_start)
2029
- end
2030
- unless _tmp
2031
- self.pos = _save
2032
- break
2033
- end
2034
- @result = begin; text ; end
2035
- _tmp = true
2036
- unless _tmp
2037
- self.pos = _save
2038
- end
2039
- break
2040
- end # end sequence
2041
-
2042
- set_failed_rule :_str_seq unless _tmp
2043
- return _tmp
2044
- end
2045
-
2046
- # string = line:line "\"" < ("\\" escape | str_seq)*:c > "\"" { Atomy::AST::String.new( line, c.join, text.gsub("\\\"", "\"") ) }
2047
- def _string
2048
-
2049
- _save = self.pos
2050
- while true # sequence
2051
- _tmp = apply(:_line)
2052
- line = @result
2053
- unless _tmp
2054
- self.pos = _save
2055
- break
2056
- end
2057
- _tmp = match_string("\"")
2058
- unless _tmp
2059
- self.pos = _save
2060
- break
2061
- end
2062
- _text_start = self.pos
2063
- _ary = []
2064
- while true
2065
-
2066
- _save2 = self.pos
2067
- while true # choice
2068
-
2069
- _save3 = self.pos
2070
- while true # sequence
2071
- _tmp = match_string("\\")
2072
- unless _tmp
2073
- self.pos = _save3
2074
- break
2075
- end
2076
- _tmp = apply(:_escape)
2077
- unless _tmp
2078
- self.pos = _save3
2079
- end
2080
- break
2081
- end # end sequence
2082
-
2083
- break if _tmp
2084
- self.pos = _save2
2085
- _tmp = apply(:_str_seq)
2086
- break if _tmp
2087
- self.pos = _save2
2088
- break
2089
- end # end choice
2090
-
2091
- _ary << @result if _tmp
2092
- break unless _tmp
2093
- end
2094
- _tmp = true
2095
- @result = _ary
2096
- c = @result
2097
- if _tmp
2098
- text = get_text(_text_start)
2099
- end
2100
- unless _tmp
2101
- self.pos = _save
2102
- break
2103
- end
2104
- _tmp = match_string("\"")
2105
- unless _tmp
2106
- self.pos = _save
2107
- break
2108
- end
2109
- @result = begin; Atomy::AST::String.new(
2110
- line,
2111
- c.join,
2112
- text.gsub("\\\"", "\"")
2113
- )
2114
- ; end
2115
- _tmp = true
2116
- unless _tmp
2117
- self.pos = _save
2118
- end
2119
- break
2120
- end # end sequence
2121
-
2122
- set_failed_rule :_string unless _tmp
2123
- return _tmp
2124
- end
2125
-
2126
- # constant_name = < /[A-Z][a-zA-Z0-9_]*/ > { text }
2127
- def _constant_name
2128
-
2129
- _save = self.pos
2130
- while true # sequence
2131
- _text_start = self.pos
2132
- _tmp = scan(/\A(?-mix:[A-Z][a-zA-Z0-9_]*)/)
2133
- if _tmp
2134
- text = get_text(_text_start)
2135
- end
2136
- unless _tmp
2137
- self.pos = _save
2138
- break
2139
- end
2140
- @result = begin; text ; end
2141
- _tmp = true
2142
- unless _tmp
2143
- self.pos = _save
2144
- end
2145
- break
2146
- end # end sequence
2147
-
2148
- set_failed_rule :_constant_name unless _tmp
2149
- return _tmp
2150
- end
2151
-
2152
- # constant = (line:line constant_name:m ("::" constant_name)*:s { names = [m] + Array(s) const_chain(line, names) } | line:line ("::" constant_name)+:s { names = Array(s) const_chain(line, names, true) })
2153
- def _constant
2154
-
2155
- _save = self.pos
2156
- while true # choice
2157
-
2158
- _save1 = self.pos
2159
- while true # sequence
2160
- _tmp = apply(:_line)
2161
- line = @result
2162
- unless _tmp
2163
- self.pos = _save1
2164
- break
2165
- end
2166
- _tmp = apply(:_constant_name)
2167
- m = @result
2168
- unless _tmp
2169
- self.pos = _save1
2170
- break
2171
- end
2172
- _ary = []
2173
- while true
2174
-
2175
- _save3 = self.pos
2176
- while true # sequence
2177
- _tmp = match_string("::")
2178
- unless _tmp
2179
- self.pos = _save3
2180
- break
2181
- end
2182
- _tmp = apply(:_constant_name)
2183
- unless _tmp
2184
- self.pos = _save3
2185
- end
2186
- break
2187
- end # end sequence
2188
-
2189
- _ary << @result if _tmp
2190
- break unless _tmp
2191
- end
2192
- _tmp = true
2193
- @result = _ary
2194
- s = @result
2195
- unless _tmp
2196
- self.pos = _save1
2197
- break
2198
- end
2199
- @result = begin;
2200
- names = [m] + Array(s)
2201
- const_chain(line, names)
2202
- ; end
2203
- _tmp = true
2204
- unless _tmp
2205
- self.pos = _save1
2206
- end
2207
- break
2208
- end # end sequence
2209
-
2210
- break if _tmp
2211
- self.pos = _save
2212
-
2213
- _save4 = self.pos
2214
- while true # sequence
2215
- _tmp = apply(:_line)
2216
- line = @result
2217
- unless _tmp
2218
- self.pos = _save4
2219
- break
2220
- end
2221
- _save5 = self.pos
2222
- _ary = []
2223
-
2224
- _save6 = self.pos
2225
- while true # sequence
2226
- _tmp = match_string("::")
2227
- unless _tmp
2228
- self.pos = _save6
2229
- break
2230
- end
2231
- _tmp = apply(:_constant_name)
2232
- unless _tmp
2233
- self.pos = _save6
2234
- end
2235
- break
2236
- end # end sequence
2237
-
2238
- if _tmp
2239
- _ary << @result
2240
- while true
2241
-
2242
- _save7 = self.pos
2243
- while true # sequence
2244
- _tmp = match_string("::")
2245
- unless _tmp
2246
- self.pos = _save7
2247
- break
2248
- end
2249
- _tmp = apply(:_constant_name)
2250
- unless _tmp
2251
- self.pos = _save7
2252
- end
2253
- break
2254
- end # end sequence
2255
-
2256
- _ary << @result if _tmp
2257
- break unless _tmp
2258
- end
2259
- _tmp = true
2260
- @result = _ary
2261
- else
2262
- self.pos = _save5
2263
- end
2264
- s = @result
2265
- unless _tmp
2266
- self.pos = _save4
2267
- break
2268
- end
2269
- @result = begin;
2270
- names = Array(s)
2271
- const_chain(line, names, true)
2272
- ; end
2273
- _tmp = true
2274
- unless _tmp
2275
- self.pos = _save4
2276
- end
2277
- break
2278
- end # end sequence
2279
-
2280
- break if _tmp
2281
- self.pos = _save
2282
- break
2283
- end # end choice
2284
-
2285
- set_failed_rule :_constant unless _tmp
2286
- return _tmp
2287
- end
2288
-
2289
- # variable = line:line identifier:n { Atomy::AST::Variable.new(line, n.gsub("/", Atomy::NAMESPACE_DELIM)) }
2290
- def _variable
2291
-
2292
- _save = self.pos
2293
- while true # sequence
2294
- _tmp = apply(:_line)
2295
- line = @result
2296
- unless _tmp
2297
- self.pos = _save
2298
- break
2299
- end
2300
- _tmp = apply(:_identifier)
2301
- n = @result
2302
- unless _tmp
2303
- self.pos = _save
2304
- break
2305
- end
2306
- @result = begin; Atomy::AST::Variable.new(line, n.gsub("/", Atomy::NAMESPACE_DELIM)) ; end
2307
- _tmp = true
2308
- unless _tmp
2309
- self.pos = _save
2310
- end
2311
- break
2312
- end # end sequence
2313
-
2314
- set_failed_rule :_variable unless _tmp
2315
- return _tmp
2316
- end
2317
-
2318
- # unary = line:line !":" op_letter:o level1:e { Atomy::AST::Unary.new(line, e, o) }
2319
- def _unary
2320
-
2321
- _save = self.pos
2322
- while true # sequence
2323
- _tmp = apply(:_line)
2324
- line = @result
2325
- unless _tmp
2326
- self.pos = _save
2327
- break
2328
- end
2329
- _save1 = self.pos
2330
- _tmp = match_string(":")
2331
- _tmp = _tmp ? nil : true
2332
- self.pos = _save1
2333
- unless _tmp
2334
- self.pos = _save
2335
- break
2336
- end
2337
- _tmp = apply(:_op_letter)
2338
- o = @result
2339
- unless _tmp
2340
- self.pos = _save
2341
- break
2342
- end
2343
- _tmp = apply(:_level1)
2344
- e = @result
2345
- unless _tmp
2346
- self.pos = _save
2347
- break
2348
- end
2349
- @result = begin; Atomy::AST::Unary.new(line, e, o) ; end
2350
- _tmp = true
2351
- unless _tmp
2352
- self.pos = _save
2353
- end
2354
- break
2355
- end # end sequence
2356
-
2357
- set_failed_rule :_unary unless _tmp
2358
- return _tmp
2359
- end
2360
-
2361
- # args = "(" wsp expressions?:as wsp ")" { Array(as) }
2362
- def _args
2363
-
2364
- _save = self.pos
2365
- while true # sequence
2366
- _tmp = match_string("(")
2367
- unless _tmp
2368
- self.pos = _save
2369
- break
2370
- end
2371
- _tmp = apply(:_wsp)
2372
- unless _tmp
2373
- self.pos = _save
2374
- break
2375
- end
2376
- _save1 = self.pos
2377
- _tmp = apply(:_expressions)
2378
- @result = nil unless _tmp
2379
- unless _tmp
2380
- _tmp = true
2381
- self.pos = _save1
2382
- end
2383
- as = @result
2384
- unless _tmp
2385
- self.pos = _save
2386
- break
2387
- end
2388
- _tmp = apply(:_wsp)
2389
- unless _tmp
2390
- self.pos = _save
2391
- break
2392
- end
2393
- _tmp = match_string(")")
2394
- unless _tmp
2395
- self.pos = _save
2396
- break
2397
- end
2398
- @result = begin; Array(as) ; end
2399
- _tmp = true
2400
- unless _tmp
2401
- self.pos = _save
2402
- end
2403
- break
2404
- end # end sequence
2405
-
2406
- set_failed_rule :_args unless _tmp
2407
- return _tmp
2408
- end
2409
-
2410
- # block = (line:line ":" !operator wsp expressions?:es (wsp ";")? { Atomy::AST::Block.new(line, Array(es), []) } | line:line "{" wsp expressions?:es wsp "}" { Atomy::AST::Block.new(line, Array(es), []) })
2411
- def _block
2412
-
2413
- _save = self.pos
2414
- while true # choice
2415
-
2416
- _save1 = self.pos
2417
- while true # sequence
2418
- _tmp = apply(:_line)
2419
- line = @result
2420
- unless _tmp
2421
- self.pos = _save1
2422
- break
2423
- end
2424
- _tmp = match_string(":")
2425
- unless _tmp
2426
- self.pos = _save1
2427
- break
2428
- end
2429
- _save2 = self.pos
2430
- _tmp = apply(:_operator)
2431
- _tmp = _tmp ? nil : true
2432
- self.pos = _save2
2433
- unless _tmp
2434
- self.pos = _save1
2435
- break
2436
- end
2437
- _tmp = apply(:_wsp)
2438
- unless _tmp
2439
- self.pos = _save1
2440
- break
2441
- end
2442
- _save3 = self.pos
2443
- _tmp = apply(:_expressions)
2444
- @result = nil unless _tmp
2445
- unless _tmp
2446
- _tmp = true
2447
- self.pos = _save3
2448
- end
2449
- es = @result
2450
- unless _tmp
2451
- self.pos = _save1
2452
- break
2453
- end
2454
- _save4 = self.pos
2455
-
2456
- _save5 = self.pos
2457
- while true # sequence
2458
- _tmp = apply(:_wsp)
2459
- unless _tmp
2460
- self.pos = _save5
2461
- break
2462
- end
2463
- _tmp = match_string(";")
2464
- unless _tmp
2465
- self.pos = _save5
2466
- end
2467
- break
2468
- end # end sequence
2469
-
2470
- unless _tmp
2471
- _tmp = true
2472
- self.pos = _save4
2473
- end
2474
- unless _tmp
2475
- self.pos = _save1
2476
- break
2477
- end
2478
- @result = begin; Atomy::AST::Block.new(line, Array(es), []) ; end
2479
- _tmp = true
2480
- unless _tmp
2481
- self.pos = _save1
2482
- end
2483
- break
2484
- end # end sequence
2485
-
2486
- break if _tmp
2487
- self.pos = _save
2488
-
2489
- _save6 = self.pos
2490
- while true # sequence
2491
- _tmp = apply(:_line)
2492
- line = @result
2493
- unless _tmp
2494
- self.pos = _save6
2495
- break
2496
- end
2497
- _tmp = match_string("{")
2498
- unless _tmp
2499
- self.pos = _save6
2500
- break
2501
- end
2502
- _tmp = apply(:_wsp)
2503
- unless _tmp
2504
- self.pos = _save6
2505
- break
2506
- end
2507
- _save7 = self.pos
2508
- _tmp = apply(:_expressions)
2509
- @result = nil unless _tmp
2510
- unless _tmp
2511
- _tmp = true
2512
- self.pos = _save7
2513
- end
2514
- es = @result
2515
- unless _tmp
2516
- self.pos = _save6
2517
- break
2518
- end
2519
- _tmp = apply(:_wsp)
2520
- unless _tmp
2521
- self.pos = _save6
2522
- break
2523
- end
2524
- _tmp = match_string("}")
2525
- unless _tmp
2526
- self.pos = _save6
2527
- break
2528
- end
2529
- @result = begin; Atomy::AST::Block.new(line, Array(es), []) ; end
2530
- _tmp = true
2531
- unless _tmp
2532
- self.pos = _save6
2533
- end
2534
- break
2535
- end # end sequence
2536
-
2537
- break if _tmp
2538
- self.pos = _save
2539
- break
2540
- end # end choice
2541
-
2542
- set_failed_rule :_block unless _tmp
2543
- return _tmp
2544
- end
2545
-
2546
- # list = line:line "[" wsp expressions?:es wsp "]" { Atomy::AST::List.new(line, Array(es)) }
2547
- def _list
2548
-
2549
- _save = self.pos
2550
- while true # sequence
2551
- _tmp = apply(:_line)
2552
- line = @result
2553
- unless _tmp
2554
- self.pos = _save
2555
- break
2556
- end
2557
- _tmp = match_string("[")
2558
- unless _tmp
2559
- self.pos = _save
2560
- break
2561
- end
2562
- _tmp = apply(:_wsp)
2563
- unless _tmp
2564
- self.pos = _save
2565
- break
2566
- end
2567
- _save1 = self.pos
2568
- _tmp = apply(:_expressions)
2569
- @result = nil unless _tmp
2570
- unless _tmp
2571
- _tmp = true
2572
- self.pos = _save1
2573
- end
2574
- es = @result
2575
- unless _tmp
2576
- self.pos = _save
2577
- break
2578
- end
2579
- _tmp = apply(:_wsp)
2580
- unless _tmp
2581
- self.pos = _save
2582
- break
2583
- end
2584
- _tmp = match_string("]")
2585
- unless _tmp
2586
- self.pos = _save
2587
- break
2588
- end
2589
- @result = begin; Atomy::AST::List.new(line, Array(es)) ; end
2590
- _tmp = true
2591
- unless _tmp
2592
- self.pos = _save
2593
- end
2594
- break
2595
- end # end sequence
2596
-
2597
- set_failed_rule :_list unless _tmp
2598
- return _tmp
2599
- end
2600
-
2601
- # sends = (line:line send:r cont(pos) level0:n args?:as { Atomy::AST::Send.new(line, r, Array(as), n) } | line:line level1:r cont(pos) level0:n args?:as { Atomy::AST::Send.new(line, r, Array(as), n) })
2602
- def _sends(pos)
2603
-
2604
- _save = self.pos
2605
- while true # choice
2606
-
2607
- _save1 = self.pos
2608
- while true # sequence
2609
- _tmp = apply(:_line)
2610
- line = @result
2611
- unless _tmp
2612
- self.pos = _save1
2613
- break
2614
- end
2615
- _tmp = apply(:_send)
2616
- r = @result
2617
- unless _tmp
2618
- self.pos = _save1
2619
- break
2620
- end
2621
- _tmp = _cont(pos)
2622
- unless _tmp
2623
- self.pos = _save1
2624
- break
2625
- end
2626
- _tmp = apply(:_level0)
2627
- n = @result
2628
- unless _tmp
2629
- self.pos = _save1
2630
- break
2631
- end
2632
- _save2 = self.pos
2633
- _tmp = apply(:_args)
2634
- @result = nil unless _tmp
2635
- unless _tmp
2636
- _tmp = true
2637
- self.pos = _save2
2638
- end
2639
- as = @result
2640
- unless _tmp
2641
- self.pos = _save1
2642
- break
2643
- end
2644
- @result = begin; Atomy::AST::Send.new(line, r, Array(as), n) ; end
2645
- _tmp = true
2646
- unless _tmp
2647
- self.pos = _save1
2648
- end
2649
- break
2650
- end # end sequence
2651
-
2652
- break if _tmp
2653
- self.pos = _save
2654
-
2655
- _save3 = self.pos
2656
- while true # sequence
2657
- _tmp = apply(:_line)
2658
- line = @result
2659
- unless _tmp
2660
- self.pos = _save3
2661
- break
2662
- end
2663
- _tmp = apply(:_level1)
2664
- r = @result
2665
- unless _tmp
2666
- self.pos = _save3
2667
- break
2668
- end
2669
- _tmp = _cont(pos)
2670
- unless _tmp
2671
- self.pos = _save3
2672
- break
2673
- end
2674
- _tmp = apply(:_level0)
2675
- n = @result
2676
- unless _tmp
2677
- self.pos = _save3
2678
- break
2679
- end
2680
- _save4 = self.pos
2681
- _tmp = apply(:_args)
2682
- @result = nil unless _tmp
2683
- unless _tmp
2684
- _tmp = true
2685
- self.pos = _save4
2686
- end
2687
- as = @result
2688
- unless _tmp
2689
- self.pos = _save3
2690
- break
2691
- end
2692
- @result = begin; Atomy::AST::Send.new(line, r, Array(as), n) ; end
2693
- _tmp = true
2694
- unless _tmp
2695
- self.pos = _save3
2696
- end
2697
- break
2698
- end # end sequence
2699
-
2700
- break if _tmp
2701
- self.pos = _save
2702
- break
2703
- end # end choice
2704
-
2705
- set_failed_rule :_sends unless _tmp
2706
- return _tmp
2707
- end
2708
-
2709
- # send = sends(current_position)
2710
- def _send
2711
- _tmp = _sends(current_position)
2712
- set_failed_rule :_send unless _tmp
2713
- return _tmp
2714
- end
2715
-
2716
- # headless = line:line level0:n args:as { Atomy::AST::Send.new( line, Atomy::AST::Primitive.new(line, :self), as, n, nil, nil, true ) }
2717
- def _headless
2718
-
2719
- _save = self.pos
2720
- while true # sequence
2721
- _tmp = apply(:_line)
2722
- line = @result
2723
- unless _tmp
2724
- self.pos = _save
2725
- break
2726
- end
2727
- _tmp = apply(:_level0)
2728
- n = @result
2729
- unless _tmp
2730
- self.pos = _save
2731
- break
2732
- end
2733
- _tmp = apply(:_args)
2734
- as = @result
2735
- unless _tmp
2736
- self.pos = _save
2737
- break
2738
- end
2739
- @result = begin; Atomy::AST::Send.new(
2740
- line,
2741
- Atomy::AST::Primitive.new(line, :self),
2742
- as,
2743
- n,
2744
- nil,
2745
- nil,
2746
- true
2747
- )
2748
- ; end
2749
- _tmp = true
2750
- unless _tmp
2751
- self.pos = _save
2752
- end
2753
- break
2754
- end # end sequence
2755
-
2756
- set_failed_rule :_headless unless _tmp
2757
- return _tmp
2758
- end
2759
-
2760
- # binary_c = (cont(pos) operator:o sig_wsp level2:e { [o, e] })+:bs { bs.flatten }
2761
- def _binary_c(pos)
2762
-
2763
- _save = self.pos
2764
- while true # sequence
2765
- _save1 = self.pos
2766
- _ary = []
2767
-
2768
- _save2 = self.pos
2769
- while true # sequence
2770
- _tmp = _cont(pos)
2771
- unless _tmp
2772
- self.pos = _save2
2773
- break
2774
- end
2775
- _tmp = apply(:_operator)
2776
- o = @result
2777
- unless _tmp
2778
- self.pos = _save2
2779
- break
2780
- end
2781
- _tmp = apply(:_sig_wsp)
2782
- unless _tmp
2783
- self.pos = _save2
2784
- break
2785
- end
2786
- _tmp = apply(:_level2)
2787
- e = @result
2788
- unless _tmp
2789
- self.pos = _save2
2790
- break
2791
- end
2792
- @result = begin; [o, e] ; end
2793
- _tmp = true
2794
- unless _tmp
2795
- self.pos = _save2
2796
- end
2797
- break
2798
- end # end sequence
2799
-
2800
- if _tmp
2801
- _ary << @result
2802
- while true
2803
-
2804
- _save3 = self.pos
2805
- while true # sequence
2806
- _tmp = _cont(pos)
2807
- unless _tmp
2808
- self.pos = _save3
2809
- break
2810
- end
2811
- _tmp = apply(:_operator)
2812
- o = @result
2813
- unless _tmp
2814
- self.pos = _save3
2815
- break
2816
- end
2817
- _tmp = apply(:_sig_wsp)
2818
- unless _tmp
2819
- self.pos = _save3
2820
- break
2821
- end
2822
- _tmp = apply(:_level2)
2823
- e = @result
2824
- unless _tmp
2825
- self.pos = _save3
2826
- break
2827
- end
2828
- @result = begin; [o, e] ; end
2829
- _tmp = true
2830
- unless _tmp
2831
- self.pos = _save3
2832
- end
2833
- break
2834
- end # end sequence
2835
-
2836
- _ary << @result if _tmp
2837
- break unless _tmp
2838
- end
2839
- _tmp = true
2840
- @result = _ary
2841
- else
2842
- self.pos = _save1
2843
- end
2844
- bs = @result
2845
- unless _tmp
2846
- self.pos = _save
2847
- break
2848
- end
2849
- @result = begin; bs.flatten ; end
2850
- _tmp = true
2851
- unless _tmp
2852
- self.pos = _save
2853
- end
2854
- break
2855
- end # end sequence
2856
-
2857
- set_failed_rule :_binary_c unless _tmp
2858
- return _tmp
2859
- end
2860
-
2861
- # binary_send = (level2:l binary_c(current_position):c { resolve(nil, l, c).first } | line:line operator:o sig_wsp expression:r { Atomy::AST::BinarySend.new( line, Atomy::AST::Primitive.new(line, :self), r, o, true ) })
2862
- def _binary_send
2863
-
2864
- _save = self.pos
2865
- while true # choice
2866
-
2867
- _save1 = self.pos
2868
- while true # sequence
2869
- _tmp = apply(:_level2)
2870
- l = @result
2871
- unless _tmp
2872
- self.pos = _save1
2873
- break
2874
- end
2875
- _tmp = _binary_c(current_position)
2876
- c = @result
2877
- unless _tmp
2878
- self.pos = _save1
2879
- break
2880
- end
2881
- @result = begin; resolve(nil, l, c).first ; end
2882
- _tmp = true
2883
- unless _tmp
2884
- self.pos = _save1
2885
- end
2886
- break
2887
- end # end sequence
2888
-
2889
- break if _tmp
2890
- self.pos = _save
2891
-
2892
- _save2 = self.pos
2893
- while true # sequence
2894
- _tmp = apply(:_line)
2895
- line = @result
2896
- unless _tmp
2897
- self.pos = _save2
2898
- break
2899
- end
2900
- _tmp = apply(:_operator)
2901
- o = @result
2902
- unless _tmp
2903
- self.pos = _save2
2904
- break
2905
- end
2906
- _tmp = apply(:_sig_wsp)
2907
- unless _tmp
2908
- self.pos = _save2
2909
- break
2910
- end
2911
- _tmp = apply(:_expression)
2912
- r = @result
2913
- unless _tmp
2914
- self.pos = _save2
2915
- break
2916
- end
2917
- @result = begin; Atomy::AST::BinarySend.new(
2918
- line,
2919
- Atomy::AST::Primitive.new(line, :self),
2920
- r,
2921
- o,
2922
- true
2923
- )
2924
- ; end
2925
- _tmp = true
2926
- unless _tmp
2927
- self.pos = _save2
2928
- end
2929
- break
2930
- end # end sequence
2931
-
2932
- break if _tmp
2933
- self.pos = _save
2934
- break
2935
- end # end choice
2936
-
2937
- set_failed_rule :_binary_send unless _tmp
2938
- return _tmp
2939
- end
2940
-
2941
- # escapes = ("n" { "\n" } | "s" { " " } | "r" { "\r" } | "t" { "\t" } | "v" { "\v" } | "f" { "\f" } | "b" { "\b" } | "a" { "\a" } | "e" { "\e" } | "\\" { "\\" } | "\"" { "\"" } | "BS" { "\b" } | "HT" { "\t" } | "LF" { "\n" } | "VT" { "\v" } | "FF" { "\f" } | "CR" { "\r" } | "SO" { "\016" } | "SI" { "\017" } | "EM" { "\031" } | "FS" { "\034" } | "GS" { "\035" } | "RS" { "\036" } | "US" { "\037" } | "SP" { " " } | "NUL" { "\000" } | "SOH" { "\001" } | "STX" { "\002" } | "ETX" { "\003" } | "EOT" { "\004" } | "ENQ" { "\005" } | "ACK" { "\006" } | "BEL" { "\a" } | "DLE" { "\020" } | "DC1" { "\021" } | "DC2" { "\022" } | "DC3" { "\023" } | "DC4" { "\024" } | "NAK" { "\025" } | "SYN" { "\026" } | "ETB" { "\027" } | "CAN" { "\030" } | "SUB" { "\032" } | "ESC" { "\e" } | "DEL" { "\177" } | < . > { "\\" + text })
2942
- def _escapes
2943
-
2944
- _save = self.pos
2945
- while true # choice
2946
-
2947
- _save1 = self.pos
2948
- while true # sequence
2949
- _tmp = match_string("n")
2950
- unless _tmp
2951
- self.pos = _save1
2952
- break
2953
- end
2954
- @result = begin; "\n" ; end
2955
- _tmp = true
2956
- unless _tmp
2957
- self.pos = _save1
2958
- end
2959
- break
2960
- end # end sequence
2961
-
2962
- break if _tmp
2963
- self.pos = _save
2964
-
2965
- _save2 = self.pos
2966
- while true # sequence
2967
- _tmp = match_string("s")
2968
- unless _tmp
2969
- self.pos = _save2
2970
- break
2971
- end
2972
- @result = begin; " " ; end
2973
- _tmp = true
2974
- unless _tmp
2975
- self.pos = _save2
2976
- end
2977
- break
2978
- end # end sequence
2979
-
2980
- break if _tmp
2981
- self.pos = _save
2982
-
2983
- _save3 = self.pos
2984
- while true # sequence
2985
- _tmp = match_string("r")
2986
- unless _tmp
2987
- self.pos = _save3
2988
- break
2989
- end
2990
- @result = begin; "\r" ; end
2991
- _tmp = true
2992
- unless _tmp
2993
- self.pos = _save3
2994
- end
2995
- break
2996
- end # end sequence
2997
-
2998
- break if _tmp
2999
- self.pos = _save
3000
-
3001
- _save4 = self.pos
3002
- while true # sequence
3003
- _tmp = match_string("t")
3004
- unless _tmp
3005
- self.pos = _save4
3006
- break
3007
- end
3008
- @result = begin; "\t" ; end
3009
- _tmp = true
3010
- unless _tmp
3011
- self.pos = _save4
3012
- end
3013
- break
3014
- end # end sequence
3015
-
3016
- break if _tmp
3017
- self.pos = _save
3018
-
3019
- _save5 = self.pos
3020
- while true # sequence
3021
- _tmp = match_string("v")
3022
- unless _tmp
3023
- self.pos = _save5
3024
- break
3025
- end
3026
- @result = begin; "\v" ; end
3027
- _tmp = true
3028
- unless _tmp
3029
- self.pos = _save5
3030
- end
3031
- break
3032
- end # end sequence
3033
-
3034
- break if _tmp
3035
- self.pos = _save
3036
-
3037
- _save6 = self.pos
3038
- while true # sequence
3039
- _tmp = match_string("f")
3040
- unless _tmp
3041
- self.pos = _save6
3042
- break
3043
- end
3044
- @result = begin; "\f" ; end
3045
- _tmp = true
3046
- unless _tmp
3047
- self.pos = _save6
3048
- end
3049
- break
3050
- end # end sequence
3051
-
3052
- break if _tmp
3053
- self.pos = _save
3054
-
3055
- _save7 = self.pos
3056
- while true # sequence
3057
- _tmp = match_string("b")
3058
- unless _tmp
3059
- self.pos = _save7
3060
- break
3061
- end
3062
- @result = begin; "\b" ; end
3063
- _tmp = true
3064
- unless _tmp
3065
- self.pos = _save7
3066
- end
3067
- break
3068
- end # end sequence
3069
-
3070
- break if _tmp
3071
- self.pos = _save
3072
-
3073
- _save8 = self.pos
3074
- while true # sequence
3075
- _tmp = match_string("a")
3076
- unless _tmp
3077
- self.pos = _save8
3078
- break
3079
- end
3080
- @result = begin; "\a" ; end
3081
- _tmp = true
3082
- unless _tmp
3083
- self.pos = _save8
3084
- end
3085
- break
3086
- end # end sequence
3087
-
3088
- break if _tmp
3089
- self.pos = _save
3090
-
3091
- _save9 = self.pos
3092
- while true # sequence
3093
- _tmp = match_string("e")
3094
- unless _tmp
3095
- self.pos = _save9
3096
- break
3097
- end
3098
- @result = begin; "\e" ; end
3099
- _tmp = true
3100
- unless _tmp
3101
- self.pos = _save9
3102
- end
3103
- break
3104
- end # end sequence
3105
-
3106
- break if _tmp
3107
- self.pos = _save
3108
-
3109
- _save10 = self.pos
3110
- while true # sequence
3111
- _tmp = match_string("\\")
3112
- unless _tmp
3113
- self.pos = _save10
3114
- break
3115
- end
3116
- @result = begin; "\\" ; end
3117
- _tmp = true
3118
- unless _tmp
3119
- self.pos = _save10
3120
- end
3121
- break
3122
- end # end sequence
3123
-
3124
- break if _tmp
3125
- self.pos = _save
3126
-
3127
- _save11 = self.pos
3128
- while true # sequence
3129
- _tmp = match_string("\"")
3130
- unless _tmp
3131
- self.pos = _save11
3132
- break
3133
- end
3134
- @result = begin; "\"" ; end
3135
- _tmp = true
3136
- unless _tmp
3137
- self.pos = _save11
3138
- end
3139
- break
3140
- end # end sequence
3141
-
3142
- break if _tmp
3143
- self.pos = _save
3144
-
3145
- _save12 = self.pos
3146
- while true # sequence
3147
- _tmp = match_string("BS")
3148
- unless _tmp
3149
- self.pos = _save12
3150
- break
3151
- end
3152
- @result = begin; "\b" ; end
3153
- _tmp = true
3154
- unless _tmp
3155
- self.pos = _save12
3156
- end
3157
- break
3158
- end # end sequence
3159
-
3160
- break if _tmp
3161
- self.pos = _save
3162
-
3163
- _save13 = self.pos
3164
- while true # sequence
3165
- _tmp = match_string("HT")
3166
- unless _tmp
3167
- self.pos = _save13
3168
- break
3169
- end
3170
- @result = begin; "\t" ; end
3171
- _tmp = true
3172
- unless _tmp
3173
- self.pos = _save13
3174
- end
3175
- break
3176
- end # end sequence
3177
-
3178
- break if _tmp
3179
- self.pos = _save
3180
-
3181
- _save14 = self.pos
3182
- while true # sequence
3183
- _tmp = match_string("LF")
3184
- unless _tmp
3185
- self.pos = _save14
3186
- break
3187
- end
3188
- @result = begin; "\n" ; end
3189
- _tmp = true
3190
- unless _tmp
3191
- self.pos = _save14
3192
- end
3193
- break
3194
- end # end sequence
3195
-
3196
- break if _tmp
3197
- self.pos = _save
3198
-
3199
- _save15 = self.pos
3200
- while true # sequence
3201
- _tmp = match_string("VT")
3202
- unless _tmp
3203
- self.pos = _save15
3204
- break
3205
- end
3206
- @result = begin; "\v" ; end
3207
- _tmp = true
3208
- unless _tmp
3209
- self.pos = _save15
3210
- end
3211
- break
3212
- end # end sequence
3213
-
3214
- break if _tmp
3215
- self.pos = _save
3216
-
3217
- _save16 = self.pos
3218
- while true # sequence
3219
- _tmp = match_string("FF")
3220
- unless _tmp
3221
- self.pos = _save16
3222
- break
3223
- end
3224
- @result = begin; "\f" ; end
3225
- _tmp = true
3226
- unless _tmp
3227
- self.pos = _save16
3228
- end
3229
- break
3230
- end # end sequence
3231
-
3232
- break if _tmp
3233
- self.pos = _save
3234
-
3235
- _save17 = self.pos
3236
- while true # sequence
3237
- _tmp = match_string("CR")
3238
- unless _tmp
3239
- self.pos = _save17
3240
- break
3241
- end
3242
- @result = begin; "\r" ; end
3243
- _tmp = true
3244
- unless _tmp
3245
- self.pos = _save17
3246
- end
3247
- break
3248
- end # end sequence
3249
-
3250
- break if _tmp
3251
- self.pos = _save
3252
-
3253
- _save18 = self.pos
3254
- while true # sequence
3255
- _tmp = match_string("SO")
3256
- unless _tmp
3257
- self.pos = _save18
3258
- break
3259
- end
3260
- @result = begin; "\016" ; end
3261
- _tmp = true
3262
- unless _tmp
3263
- self.pos = _save18
3264
- end
3265
- break
3266
- end # end sequence
3267
-
3268
- break if _tmp
3269
- self.pos = _save
3270
-
3271
- _save19 = self.pos
3272
- while true # sequence
3273
- _tmp = match_string("SI")
3274
- unless _tmp
3275
- self.pos = _save19
3276
- break
3277
- end
3278
- @result = begin; "\017" ; end
3279
- _tmp = true
3280
- unless _tmp
3281
- self.pos = _save19
3282
- end
3283
- break
3284
- end # end sequence
3285
-
3286
- break if _tmp
3287
- self.pos = _save
3288
-
3289
- _save20 = self.pos
3290
- while true # sequence
3291
- _tmp = match_string("EM")
3292
- unless _tmp
3293
- self.pos = _save20
3294
- break
3295
- end
3296
- @result = begin; "\031" ; end
3297
- _tmp = true
3298
- unless _tmp
3299
- self.pos = _save20
3300
- end
3301
- break
3302
- end # end sequence
3303
-
3304
- break if _tmp
3305
- self.pos = _save
3306
-
3307
- _save21 = self.pos
3308
- while true # sequence
3309
- _tmp = match_string("FS")
3310
- unless _tmp
3311
- self.pos = _save21
3312
- break
3313
- end
3314
- @result = begin; "\034" ; end
3315
- _tmp = true
3316
- unless _tmp
3317
- self.pos = _save21
3318
- end
3319
- break
3320
- end # end sequence
3321
-
3322
- break if _tmp
3323
- self.pos = _save
3324
-
3325
- _save22 = self.pos
3326
- while true # sequence
3327
- _tmp = match_string("GS")
3328
- unless _tmp
3329
- self.pos = _save22
3330
- break
3331
- end
3332
- @result = begin; "\035" ; end
3333
- _tmp = true
3334
- unless _tmp
3335
- self.pos = _save22
3336
- end
3337
- break
3338
- end # end sequence
3339
-
3340
- break if _tmp
3341
- self.pos = _save
3342
-
3343
- _save23 = self.pos
3344
- while true # sequence
3345
- _tmp = match_string("RS")
3346
- unless _tmp
3347
- self.pos = _save23
3348
- break
3349
- end
3350
- @result = begin; "\036" ; end
3351
- _tmp = true
3352
- unless _tmp
3353
- self.pos = _save23
3354
- end
3355
- break
3356
- end # end sequence
3357
-
3358
- break if _tmp
3359
- self.pos = _save
3360
-
3361
- _save24 = self.pos
3362
- while true # sequence
3363
- _tmp = match_string("US")
3364
- unless _tmp
3365
- self.pos = _save24
3366
- break
3367
- end
3368
- @result = begin; "\037" ; end
3369
- _tmp = true
3370
- unless _tmp
3371
- self.pos = _save24
3372
- end
3373
- break
3374
- end # end sequence
3375
-
3376
- break if _tmp
3377
- self.pos = _save
3378
-
3379
- _save25 = self.pos
3380
- while true # sequence
3381
- _tmp = match_string("SP")
3382
- unless _tmp
3383
- self.pos = _save25
3384
- break
3385
- end
3386
- @result = begin; " " ; end
3387
- _tmp = true
3388
- unless _tmp
3389
- self.pos = _save25
3390
- end
3391
- break
3392
- end # end sequence
3393
-
3394
- break if _tmp
3395
- self.pos = _save
3396
-
3397
- _save26 = self.pos
3398
- while true # sequence
3399
- _tmp = match_string("NUL")
3400
- unless _tmp
3401
- self.pos = _save26
3402
- break
3403
- end
3404
- @result = begin; "\000" ; end
3405
- _tmp = true
3406
- unless _tmp
3407
- self.pos = _save26
3408
- end
3409
- break
3410
- end # end sequence
3411
-
3412
- break if _tmp
3413
- self.pos = _save
3414
-
3415
- _save27 = self.pos
3416
- while true # sequence
3417
- _tmp = match_string("SOH")
3418
- unless _tmp
3419
- self.pos = _save27
3420
- break
3421
- end
3422
- @result = begin; "\001" ; end
3423
- _tmp = true
3424
- unless _tmp
3425
- self.pos = _save27
3426
- end
3427
- break
3428
- end # end sequence
3429
-
3430
- break if _tmp
3431
- self.pos = _save
3432
-
3433
- _save28 = self.pos
3434
- while true # sequence
3435
- _tmp = match_string("STX")
3436
- unless _tmp
3437
- self.pos = _save28
3438
- break
3439
- end
3440
- @result = begin; "\002" ; end
3441
- _tmp = true
3442
- unless _tmp
3443
- self.pos = _save28
3444
- end
3445
- break
3446
- end # end sequence
3447
-
3448
- break if _tmp
3449
- self.pos = _save
3450
-
3451
- _save29 = self.pos
3452
- while true # sequence
3453
- _tmp = match_string("ETX")
3454
- unless _tmp
3455
- self.pos = _save29
3456
- break
3457
- end
3458
- @result = begin; "\003" ; end
3459
- _tmp = true
3460
- unless _tmp
3461
- self.pos = _save29
3462
- end
3463
- break
3464
- end # end sequence
3465
-
3466
- break if _tmp
3467
- self.pos = _save
3468
-
3469
- _save30 = self.pos
3470
- while true # sequence
3471
- _tmp = match_string("EOT")
3472
- unless _tmp
3473
- self.pos = _save30
3474
- break
3475
- end
3476
- @result = begin; "\004" ; end
3477
- _tmp = true
3478
- unless _tmp
3479
- self.pos = _save30
3480
- end
3481
- break
3482
- end # end sequence
3483
-
3484
- break if _tmp
3485
- self.pos = _save
3486
-
3487
- _save31 = self.pos
3488
- while true # sequence
3489
- _tmp = match_string("ENQ")
3490
- unless _tmp
3491
- self.pos = _save31
3492
- break
3493
- end
3494
- @result = begin; "\005" ; end
3495
- _tmp = true
3496
- unless _tmp
3497
- self.pos = _save31
3498
- end
3499
- break
3500
- end # end sequence
3501
-
3502
- break if _tmp
3503
- self.pos = _save
3504
-
3505
- _save32 = self.pos
3506
- while true # sequence
3507
- _tmp = match_string("ACK")
3508
- unless _tmp
3509
- self.pos = _save32
3510
- break
3511
- end
3512
- @result = begin; "\006" ; end
3513
- _tmp = true
3514
- unless _tmp
3515
- self.pos = _save32
3516
- end
3517
- break
3518
- end # end sequence
3519
-
3520
- break if _tmp
3521
- self.pos = _save
3522
-
3523
- _save33 = self.pos
3524
- while true # sequence
3525
- _tmp = match_string("BEL")
3526
- unless _tmp
3527
- self.pos = _save33
3528
- break
3529
- end
3530
- @result = begin; "\a" ; end
3531
- _tmp = true
3532
- unless _tmp
3533
- self.pos = _save33
3534
- end
3535
- break
3536
- end # end sequence
3537
-
3538
- break if _tmp
3539
- self.pos = _save
3540
-
3541
- _save34 = self.pos
3542
- while true # sequence
3543
- _tmp = match_string("DLE")
3544
- unless _tmp
3545
- self.pos = _save34
3546
- break
3547
- end
3548
- @result = begin; "\020" ; end
3549
- _tmp = true
3550
- unless _tmp
3551
- self.pos = _save34
3552
- end
3553
- break
3554
- end # end sequence
3555
-
3556
- break if _tmp
3557
- self.pos = _save
3558
-
3559
- _save35 = self.pos
3560
- while true # sequence
3561
- _tmp = match_string("DC1")
3562
- unless _tmp
3563
- self.pos = _save35
3564
- break
3565
- end
3566
- @result = begin; "\021" ; end
3567
- _tmp = true
3568
- unless _tmp
3569
- self.pos = _save35
3570
- end
3571
- break
3572
- end # end sequence
3573
-
3574
- break if _tmp
3575
- self.pos = _save
3576
-
3577
- _save36 = self.pos
3578
- while true # sequence
3579
- _tmp = match_string("DC2")
3580
- unless _tmp
3581
- self.pos = _save36
3582
- break
3583
- end
3584
- @result = begin; "\022" ; end
3585
- _tmp = true
3586
- unless _tmp
3587
- self.pos = _save36
3588
- end
3589
- break
3590
- end # end sequence
3591
-
3592
- break if _tmp
3593
- self.pos = _save
3594
-
3595
- _save37 = self.pos
3596
- while true # sequence
3597
- _tmp = match_string("DC3")
3598
- unless _tmp
3599
- self.pos = _save37
3600
- break
3601
- end
3602
- @result = begin; "\023" ; end
3603
- _tmp = true
3604
- unless _tmp
3605
- self.pos = _save37
3606
- end
3607
- break
3608
- end # end sequence
3609
-
3610
- break if _tmp
3611
- self.pos = _save
3612
-
3613
- _save38 = self.pos
3614
- while true # sequence
3615
- _tmp = match_string("DC4")
3616
- unless _tmp
3617
- self.pos = _save38
3618
- break
3619
- end
3620
- @result = begin; "\024" ; end
3621
- _tmp = true
3622
- unless _tmp
3623
- self.pos = _save38
3624
- end
3625
- break
3626
- end # end sequence
3627
-
3628
- break if _tmp
3629
- self.pos = _save
3630
-
3631
- _save39 = self.pos
3632
- while true # sequence
3633
- _tmp = match_string("NAK")
3634
- unless _tmp
3635
- self.pos = _save39
3636
- break
3637
- end
3638
- @result = begin; "\025" ; end
3639
- _tmp = true
3640
- unless _tmp
3641
- self.pos = _save39
3642
- end
3643
- break
3644
- end # end sequence
3645
-
3646
- break if _tmp
3647
- self.pos = _save
3648
-
3649
- _save40 = self.pos
3650
- while true # sequence
3651
- _tmp = match_string("SYN")
3652
- unless _tmp
3653
- self.pos = _save40
3654
- break
3655
- end
3656
- @result = begin; "\026" ; end
3657
- _tmp = true
3658
- unless _tmp
3659
- self.pos = _save40
3660
- end
3661
- break
3662
- end # end sequence
3663
-
3664
- break if _tmp
3665
- self.pos = _save
3666
-
3667
- _save41 = self.pos
3668
- while true # sequence
3669
- _tmp = match_string("ETB")
3670
- unless _tmp
3671
- self.pos = _save41
3672
- break
3673
- end
3674
- @result = begin; "\027" ; end
3675
- _tmp = true
3676
- unless _tmp
3677
- self.pos = _save41
3678
- end
3679
- break
3680
- end # end sequence
3681
-
3682
- break if _tmp
3683
- self.pos = _save
3684
-
3685
- _save42 = self.pos
3686
- while true # sequence
3687
- _tmp = match_string("CAN")
3688
- unless _tmp
3689
- self.pos = _save42
3690
- break
3691
- end
3692
- @result = begin; "\030" ; end
3693
- _tmp = true
3694
- unless _tmp
3695
- self.pos = _save42
3696
- end
3697
- break
3698
- end # end sequence
3699
-
3700
- break if _tmp
3701
- self.pos = _save
3702
-
3703
- _save43 = self.pos
3704
- while true # sequence
3705
- _tmp = match_string("SUB")
3706
- unless _tmp
3707
- self.pos = _save43
3708
- break
3709
- end
3710
- @result = begin; "\032" ; end
3711
- _tmp = true
3712
- unless _tmp
3713
- self.pos = _save43
3714
- end
3715
- break
3716
- end # end sequence
3717
-
3718
- break if _tmp
3719
- self.pos = _save
3720
-
3721
- _save44 = self.pos
3722
- while true # sequence
3723
- _tmp = match_string("ESC")
3724
- unless _tmp
3725
- self.pos = _save44
3726
- break
3727
- end
3728
- @result = begin; "\e" ; end
3729
- _tmp = true
3730
- unless _tmp
3731
- self.pos = _save44
3732
- end
3733
- break
3734
- end # end sequence
3735
-
3736
- break if _tmp
3737
- self.pos = _save
3738
-
3739
- _save45 = self.pos
3740
- while true # sequence
3741
- _tmp = match_string("DEL")
3742
- unless _tmp
3743
- self.pos = _save45
3744
- break
3745
- end
3746
- @result = begin; "\177" ; end
3747
- _tmp = true
3748
- unless _tmp
3749
- self.pos = _save45
3750
- end
3751
- break
3752
- end # end sequence
3753
-
3754
- break if _tmp
3755
- self.pos = _save
3756
-
3757
- _save46 = self.pos
3758
- while true # sequence
3759
- _text_start = self.pos
3760
- _tmp = get_byte
3761
- if _tmp
3762
- text = get_text(_text_start)
3763
- end
3764
- unless _tmp
3765
- self.pos = _save46
3766
- break
3767
- end
3768
- @result = begin; "\\" + text ; end
3769
- _tmp = true
3770
- unless _tmp
3771
- self.pos = _save46
3772
- end
3773
- break
3774
- end # end sequence
3775
-
3776
- break if _tmp
3777
- self.pos = _save
3778
- break
3779
- end # end choice
3780
-
3781
- set_failed_rule :_escapes unless _tmp
3782
- return _tmp
3783
- end
3784
-
3785
- # number_escapes = (/[xX]/ < /[0-9a-fA-F]{1,5}/ > { [text.to_i(16)].pack("U") } | < /\d{1,6}/ > { [text.to_i].pack("U") } | /[oO]/ < /[0-7]{1,7}/ > { [text.to_i(16)].pack("U") } | /[uU]/ < /[0-9a-fA-F]{4}/ > { [text.to_i(16)].pack("U") })
3786
- def _number_escapes
3787
-
3788
- _save = self.pos
3789
- while true # choice
3790
-
3791
- _save1 = self.pos
3792
- while true # sequence
3793
- _tmp = scan(/\A(?-mix:[xX])/)
3794
- unless _tmp
3795
- self.pos = _save1
3796
- break
3797
- end
3798
- _text_start = self.pos
3799
- _tmp = scan(/\A(?-mix:[0-9a-fA-F]{1,5})/)
3800
- if _tmp
3801
- text = get_text(_text_start)
3802
- end
3803
- unless _tmp
3804
- self.pos = _save1
3805
- break
3806
- end
3807
- @result = begin; [text.to_i(16)].pack("U") ; end
3808
- _tmp = true
3809
- unless _tmp
3810
- self.pos = _save1
3811
- end
3812
- break
3813
- end # end sequence
3814
-
3815
- break if _tmp
3816
- self.pos = _save
3817
-
3818
- _save2 = self.pos
3819
- while true # sequence
3820
- _text_start = self.pos
3821
- _tmp = scan(/\A(?-mix:\d{1,6})/)
3822
- if _tmp
3823
- text = get_text(_text_start)
3824
- end
3825
- unless _tmp
3826
- self.pos = _save2
3827
- break
3828
- end
3829
- @result = begin; [text.to_i].pack("U") ; end
3830
- _tmp = true
3831
- unless _tmp
3832
- self.pos = _save2
3833
- end
3834
- break
3835
- end # end sequence
3836
-
3837
- break if _tmp
3838
- self.pos = _save
3839
-
3840
- _save3 = self.pos
3841
- while true # sequence
3842
- _tmp = scan(/\A(?-mix:[oO])/)
3843
- unless _tmp
3844
- self.pos = _save3
3845
- break
3846
- end
3847
- _text_start = self.pos
3848
- _tmp = scan(/\A(?-mix:[0-7]{1,7})/)
3849
- if _tmp
3850
- text = get_text(_text_start)
3851
- end
3852
- unless _tmp
3853
- self.pos = _save3
3854
- break
3855
- end
3856
- @result = begin; [text.to_i(16)].pack("U") ; end
3857
- _tmp = true
3858
- unless _tmp
3859
- self.pos = _save3
3860
- end
3861
- break
3862
- end # end sequence
3863
-
3864
- break if _tmp
3865
- self.pos = _save
3866
-
3867
- _save4 = self.pos
3868
- while true # sequence
3869
- _tmp = scan(/\A(?-mix:[uU])/)
3870
- unless _tmp
3871
- self.pos = _save4
3872
- break
3873
- end
3874
- _text_start = self.pos
3875
- _tmp = scan(/\A(?-mix:[0-9a-fA-F]{4})/)
3876
- if _tmp
3877
- text = get_text(_text_start)
3878
- end
3879
- unless _tmp
3880
- self.pos = _save4
3881
- break
3882
- end
3883
- @result = begin; [text.to_i(16)].pack("U") ; end
3884
- _tmp = true
3885
- unless _tmp
3886
- self.pos = _save4
3887
- end
3888
- break
3889
- end # end sequence
3890
-
3891
- break if _tmp
3892
- self.pos = _save
3893
- break
3894
- end # end choice
3895
-
3896
- set_failed_rule :_number_escapes unless _tmp
3897
- return _tmp
3898
- end
3899
-
3900
- # root = wsp expressions:es wsp !. { Array(es) }
3901
- def _root
3902
-
3903
- _save = self.pos
3904
- while true # sequence
3905
- _tmp = apply(:_wsp)
3906
- unless _tmp
3907
- self.pos = _save
3908
- break
3909
- end
3910
- _tmp = apply(:_expressions)
3911
- es = @result
3912
- unless _tmp
3913
- self.pos = _save
3914
- break
3915
- end
3916
- _tmp = apply(:_wsp)
3917
- unless _tmp
3918
- self.pos = _save
3919
- break
3920
- end
3921
- _save1 = self.pos
3922
- _tmp = get_byte
3923
- _tmp = _tmp ? nil : true
3924
- self.pos = _save1
3925
- unless _tmp
3926
- self.pos = _save
3927
- break
3928
- end
3929
- @result = begin; Array(es) ; end
3930
- _tmp = true
3931
- unless _tmp
3932
- self.pos = _save
3933
- end
3934
- break
3935
- end # end sequence
3936
-
3937
- set_failed_rule :_root unless _tmp
3938
- return _tmp
3939
- end
3940
-
3941
- Rules = {}
3942
- Rules[:_sp] = rule_info("sp", "(\" \" | \"\\t\" | comment)*")
3943
- Rules[:_wsp] = rule_info("wsp", "(\" \" | \"\\t\" | \"\\n\" | comment)*")
3944
- Rules[:_sig_sp] = rule_info("sig_sp", "(\" \" | \"\\t\" | comment)+")
3945
- Rules[:_sig_wsp] = rule_info("sig_wsp", "(\" \" | \"\\t\" | \"\\n\" | comment)+")
3946
- Rules[:_cont] = rule_info("cont", "((\"\\n\" sp)+ &{ continue?(p) } | sig_sp ((\"\\n\" sp)+ &{ continue?(p) })? | &.)")
3947
- Rules[:_line] = rule_info("line", "{ current_line }")
3948
- Rules[:_ident_start] = rule_info("ident_start", "< /[\\p{Ll}_]/u > { text }")
3949
- Rules[:_ident_letter] = rule_info("ident_letter", "< (/[\\p{L}\\d]/u | !\":\" op_letter) > { text }")
3950
- Rules[:_op_letter] = rule_info("op_letter", "< /[\\p{S}!@\#%&*\\-\\\\:.\\/\\?]/u > { text }")
3951
- Rules[:_operator] = rule_info("operator", "< op_letter+ > &{ text != \":\" } { text }")
3952
- Rules[:_identifier] = rule_info("identifier", "< ident_start ident_letter* > { text.tr(\"-\", \"_\") }")
3953
- Rules[:_grouped] = rule_info("grouped", "\"(\" wsp expression:x wsp \")\" { x }")
3954
- Rules[:_comment] = rule_info("comment", "(/--.*?$/ | multi_comment)")
3955
- Rules[:_multi_comment] = rule_info("multi_comment", "\"{-\" in_multi")
3956
- Rules[:_in_multi] = rule_info("in_multi", "(/[^\\-\\{\\}]*/ \"-}\" | /[^\\-\\{\\}]*/ \"{-\" in_multi /[^\\-\\{\\}]*/ \"-}\" | /[^\\-\\{\\}]*/ /[-{}]/ in_multi)")
3957
- Rules[:_delim] = rule_info("delim", "(wsp \",\" wsp | (sp \"\\n\" sp)+ &{ current_column >= c })")
3958
- Rules[:_expression] = rule_info("expression", "level3")
3959
- Rules[:_expressions] = rule_info("expressions", "{ current_column }:c expression:x (delim(c) expression)*:xs delim(c)? { [x] + Array(xs) }")
3960
- Rules[:_level0] = rule_info("level0", "(true | false | self | nil | number | quote | quasi_quote | splice | unquote | string | constant | variable | block | list | unary)")
3961
- Rules[:_level1] = rule_info("level1", "(headless | grouped | level0)")
3962
- Rules[:_level2] = rule_info("level2", "(send | level1)")
3963
- Rules[:_level3] = rule_info("level3", "(macro | op_assoc_prec | binary_send | level2)")
3964
- Rules[:_true] = rule_info("true", "line:line \"true\" !ident_letter { Atomy::AST::Primitive.new(line, :true) }")
3965
- Rules[:_false] = rule_info("false", "line:line \"false\" !ident_letter { Atomy::AST::Primitive.new(line, :false) }")
3966
- Rules[:_self] = rule_info("self", "line:line \"self\" !ident_letter { Atomy::AST::Primitive.new(line, :self) }")
3967
- Rules[:_nil] = rule_info("nil", "line:line \"nil\" !ident_letter { Atomy::AST::Primitive.new(line, :nil) }")
3968
- Rules[:_number] = rule_info("number", "(line:line < /[\\+\\-]?0[oO][\\da-fA-F]+/ > { Atomy::AST::Primitive.new(line, text.to_i(8)) } | line:line < /[\\+\\-]?0[xX][0-7]+/ > { Atomy::AST::Primitive.new(line, text.to_i(16)) } | line:line < /[\\+\\-]?\\d+(\\.\\d+)?[eE][\\+\\-]?\\d+/ > { Atomy::AST::Primitive.new(line, text.to_f) } | line:line < /[\\+\\-]?\\d+\\.\\d+/ > { Atomy::AST::Primitive.new(line, text.to_f) } | line:line < /[\\+\\-]?\\d+/ > { Atomy::AST::Primitive.new(line, text.to_i) })")
3969
- Rules[:_macro] = rule_info("macro", "line:line \"macro\" \"(\" wsp expression:p wsp \")\" wsp block:b { Atomy::AST::Macro.new(line, p, b.block_body) }")
3970
- Rules[:_op_assoc] = rule_info("op_assoc", "sig_wsp < /left|right/ > { text.to_sym }")
3971
- Rules[:_op_prec] = rule_info("op_prec", "sig_wsp < /[0-9]+/ > { text.to_i }")
3972
- Rules[:_op_assoc_prec] = rule_info("op_assoc_prec", "line:line \"operator\" op_assoc?:assoc op_prec:prec (sig_wsp operator)+:os { Atomy::Macro.set_op_info(os, assoc, prec) Atomy::AST::Operator.new(line, assoc, prec, os) }")
3973
- Rules[:_quote] = rule_info("quote", "line:line \"'\" level1:e { Atomy::AST::Quote.new(line, e) }")
3974
- Rules[:_quasi_quote] = rule_info("quasi_quote", "line:line \"`\" level1:e { Atomy::AST::QuasiQuote.new(line, e) }")
3975
- Rules[:_splice] = rule_info("splice", "line:line \"~*\" level1:e { Atomy::AST::Splice.new(line, e) }")
3976
- Rules[:_unquote] = rule_info("unquote", "line:line \"~\" level1:e { Atomy::AST::Unquote.new(line, e) }")
3977
- Rules[:_escape] = rule_info("escape", "(number_escapes | escapes)")
3978
- Rules[:_str_seq] = rule_info("str_seq", "< /[^\\\\\"]+/ > { text }")
3979
- Rules[:_string] = rule_info("string", "line:line \"\\\"\" < (\"\\\\\" escape | str_seq)*:c > \"\\\"\" { Atomy::AST::String.new( line, c.join, text.gsub(\"\\\\\\\"\", \"\\\"\") ) }")
3980
- Rules[:_constant_name] = rule_info("constant_name", "< /[A-Z][a-zA-Z0-9_]*/ > { text }")
3981
- Rules[:_constant] = rule_info("constant", "(line:line constant_name:m (\"::\" constant_name)*:s { names = [m] + Array(s) const_chain(line, names) } | line:line (\"::\" constant_name)+:s { names = Array(s) const_chain(line, names, true) })")
3982
- Rules[:_variable] = rule_info("variable", "line:line identifier:n { Atomy::AST::Variable.new(line, n.gsub(\"/\", Atomy::NAMESPACE_DELIM)) }")
3983
- Rules[:_unary] = rule_info("unary", "line:line !\":\" op_letter:o level1:e { Atomy::AST::Unary.new(line, e, o) }")
3984
- Rules[:_args] = rule_info("args", "\"(\" wsp expressions?:as wsp \")\" { Array(as) }")
3985
- Rules[:_block] = rule_info("block", "(line:line \":\" !operator wsp expressions?:es (wsp \";\")? { Atomy::AST::Block.new(line, Array(es), []) } | line:line \"{\" wsp expressions?:es wsp \"}\" { Atomy::AST::Block.new(line, Array(es), []) })")
3986
- Rules[:_list] = rule_info("list", "line:line \"[\" wsp expressions?:es wsp \"]\" { Atomy::AST::List.new(line, Array(es)) }")
3987
- Rules[:_sends] = rule_info("sends", "(line:line send:r cont(pos) level0:n args?:as { Atomy::AST::Send.new(line, r, Array(as), n) } | line:line level1:r cont(pos) level0:n args?:as { Atomy::AST::Send.new(line, r, Array(as), n) })")
3988
- Rules[:_send] = rule_info("send", "sends(current_position)")
3989
- Rules[:_headless] = rule_info("headless", "line:line level0:n args:as { Atomy::AST::Send.new( line, Atomy::AST::Primitive.new(line, :self), as, n, nil, nil, true ) }")
3990
- Rules[:_binary_c] = rule_info("binary_c", "(cont(pos) operator:o sig_wsp level2:e { [o, e] })+:bs { bs.flatten }")
3991
- Rules[:_binary_send] = rule_info("binary_send", "(level2:l binary_c(current_position):c { resolve(nil, l, c).first } | line:line operator:o sig_wsp expression:r { Atomy::AST::BinarySend.new( line, Atomy::AST::Primitive.new(line, :self), r, o, true ) })")
3992
- Rules[:_escapes] = rule_info("escapes", "(\"n\" { \"\\n\" } | \"s\" { \" \" } | \"r\" { \"\\r\" } | \"t\" { \"\\t\" } | \"v\" { \"\\v\" } | \"f\" { \"\\f\" } | \"b\" { \"\\b\" } | \"a\" { \"\\a\" } | \"e\" { \"\\e\" } | \"\\\\\" { \"\\\\\" } | \"\\\"\" { \"\\\"\" } | \"BS\" { \"\\b\" } | \"HT\" { \"\\t\" } | \"LF\" { \"\\n\" } | \"VT\" { \"\\v\" } | \"FF\" { \"\\f\" } | \"CR\" { \"\\r\" } | \"SO\" { \"\\016\" } | \"SI\" { \"\\017\" } | \"EM\" { \"\\031\" } | \"FS\" { \"\\034\" } | \"GS\" { \"\\035\" } | \"RS\" { \"\\036\" } | \"US\" { \"\\037\" } | \"SP\" { \" \" } | \"NUL\" { \"\\000\" } | \"SOH\" { \"\\001\" } | \"STX\" { \"\\002\" } | \"ETX\" { \"\\003\" } | \"EOT\" { \"\\004\" } | \"ENQ\" { \"\\005\" } | \"ACK\" { \"\\006\" } | \"BEL\" { \"\\a\" } | \"DLE\" { \"\\020\" } | \"DC1\" { \"\\021\" } | \"DC2\" { \"\\022\" } | \"DC3\" { \"\\023\" } | \"DC4\" { \"\\024\" } | \"NAK\" { \"\\025\" } | \"SYN\" { \"\\026\" } | \"ETB\" { \"\\027\" } | \"CAN\" { \"\\030\" } | \"SUB\" { \"\\032\" } | \"ESC\" { \"\\e\" } | \"DEL\" { \"\\177\" } | < . > { \"\\\\\" + text })")
3993
- Rules[:_number_escapes] = rule_info("number_escapes", "(/[xX]/ < /[0-9a-fA-F]{1,5}/ > { [text.to_i(16)].pack(\"U\") } | < /\\d{1,6}/ > { [text.to_i].pack(\"U\") } | /[oO]/ < /[0-7]{1,7}/ > { [text.to_i(16)].pack(\"U\") } | /[uU]/ < /[0-9a-fA-F]{4}/ > { [text.to_i(16)].pack(\"U\") })")
3994
- Rules[:_root] = rule_info("root", "wsp expressions:es wsp !. { Array(es) }")
3995
- end