myco 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/myco/bootstrap/find_constant.rb +4 -11
- data/lib/myco/code_loader.rb +2 -1
- data/lib/myco/code_tools/AST/ConstantAccess.my +47 -3
- data/lib/myco/code_tools/AST/ConstantAccess.my.rb +13 -9
- data/lib/myco/code_tools/AST/ConstantAssignment.my +1 -5
- data/lib/myco/code_tools/AST/ConstantAssignment.my.rb +3 -9
- data/lib/myco/code_tools/AST/ToRuby.my +5 -2
- data/lib/myco/code_tools/AST/ToRuby.my.rb +7 -3
- data/lib/myco/code_tools/AST.my +1 -0
- data/lib/myco/code_tools/AST.my.rb +9 -1
- data/lib/myco/code_tools/Parser.my +24 -0
- data/lib/myco/code_tools/Parser.my.rb +25 -0
- data/lib/myco/code_tools/parser/MycoBuilder.my +67 -0
- data/lib/myco/code_tools/parser/MycoBuilder.my.rb +99 -0
- data/lib/myco/code_tools/parser/MycoCharacterClasses.my +20 -0
- data/lib/myco/code_tools/parser/MycoCharacterClasses.my.rb +56 -0
- data/lib/myco/code_tools/parser/MycoGrammar.my +564 -0
- data/lib/myco/code_tools/parser/MycoGrammar.my.rb +1851 -0
- data/lib/myco/code_tools/parser/MycoTokens.my +78 -0
- data/lib/myco/code_tools/parser/MycoTokens.my.rb +170 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my +4 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my.rb +5 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my +142 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my.rb +181 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my +420 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my.rb +415 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my +137 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my.rb +237 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my +183 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my.rb +370 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my +65 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my.rb +83 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my +139 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my.rb +284 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my +37 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my.rb +24 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my +42 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my.rb +52 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my +123 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my.rb +164 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my +236 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my.rb +339 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my +15 -0
- data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my.rb +14 -0
- data/lib/myco/code_tools.rb +1 -1
- data/lib/myco/version.rb +1 -1
- data/lib/myco.rb +2 -0
- metadata +44 -25
- data/lib/myco/code_tools/parser/peg_parser.rb +0 -7182
- data/lib/myco/code_tools/parser.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc8d9aa903a16793652f0a984ea68b5dc0058dee
|
4
|
+
data.tar.gz: 0ed0d4a3adb25552541a384019deeb7016d67057
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d50aa9cdf66fec631609560ea0c5bac80a39a27be523ca32ad1529795cbb0aab4cf9db3b11b55e30718e86191915c86ec95edec7ee9562d0bb687ad13f1025c3
|
7
|
+
data.tar.gz: c9ec127069f005ad5ba684b2a0fec708d7d8abceb297283838d323a14f65e0fe6df211840abf4cdbcce92db437c8b760049d2134ba30be15690c738a808d5fa5
|
@@ -61,27 +61,20 @@ module Myco
|
|
61
61
|
Rubinius::ConstantScope.of_sender
|
62
62
|
end
|
63
63
|
|
64
|
-
def self.find_constant(name, scope=
|
65
|
-
name = ::Rubinius::Type.coerce_to_constant_name name
|
66
|
-
scope ||= ::Rubinius::ConstantScope.of_sender
|
67
|
-
|
68
|
-
category = scope.myco_category
|
69
|
-
component = scope.myco_component
|
70
|
-
file = scope.myco_file
|
71
|
-
|
64
|
+
def self.find_constant(name, scope=Rubinius::ConstantScope.of_sender)
|
72
65
|
# TODO: optimize this constant search
|
73
66
|
# (it currently searches each ancestor of each nested component scope)
|
74
67
|
bucket = nil
|
75
68
|
scope.myco_levels.detect { |level|
|
76
69
|
bucket = find_constant_bucket_in_module(level, name)
|
77
70
|
}
|
78
|
-
bucket ? bucket.constant :
|
71
|
+
bucket ? bucket.constant : Rubinius::Type.const_get(::Myco, name)
|
79
72
|
end
|
80
73
|
|
81
74
|
def self.find_constant_bucket_in_module(mod, name, inherit=true)
|
82
|
-
current
|
75
|
+
current = mod
|
83
76
|
|
84
|
-
while current and
|
77
|
+
while current and Rubinius::Type.object_kind_of? current, Module
|
85
78
|
if bucket = current.constant_table.lookup(name)
|
86
79
|
return bucket
|
87
80
|
end
|
data/lib/myco/code_loader.rb
CHANGED
@@ -16,14 +16,58 @@ CodeTools::AST << {
|
|
16
16
|
g.push_cpath_top
|
17
17
|
g.find_const(first_name)
|
18
18
|
) ?? (
|
19
|
+
Myco.find_constant_bytecode(g, first_name)
|
20
|
+
)
|
21
|
+
|
22
|
+
name_list.each |name| { g.find_const(name) }
|
23
|
+
}
|
24
|
+
|
25
|
+
::Myco::SingletonClass << {
|
26
|
+
find_constant_bytecode: |g, name| {
|
19
27
|
g.push_cpath_top
|
20
28
|
g.find_const(:"Myco")
|
21
|
-
g.push_literal(
|
29
|
+
g.push_literal(name)
|
22
30
|
g.push_scope
|
23
31
|
g.send(:find_constant, 2)
|
24
|
-
|
32
|
+
}
|
25
33
|
|
26
|
-
|
34
|
+
# TODO: use the try_find_const_fast instruction here, when it is merged into Rubinius.
|
35
|
+
# find_constant_bytecode: |g, name| {
|
36
|
+
# loop_start_label = g.new_label
|
37
|
+
# retry_label = g.new_label
|
38
|
+
# fail_label = g.new_label
|
39
|
+
# done_label = g.new_label
|
40
|
+
|
41
|
+
# # g.push_rubinius; g.push_literal(name); g.send(:p, 1, true); g.pop
|
42
|
+
|
43
|
+
# g.push_scope
|
44
|
+
# g.send(:myco_levels, 0)
|
45
|
+
# # TODO: don't dup, iterate without mutating
|
46
|
+
# g.send(:dup, 0) # stack: myco_levels
|
47
|
+
|
48
|
+
# loop_start_label.set!
|
49
|
+
# g.dup_top # stack: myco_levels, myco_levels
|
50
|
+
# g.send(:pop, 0) # stack: myco_levels, mod
|
51
|
+
|
52
|
+
# g.dup_top # stack: myco_levels, mod, mod
|
53
|
+
# g.goto_if_nil(fail_label) # stack: myco_levels, mod
|
54
|
+
|
55
|
+
# g.try_find_const(name) # stack: myco_levels, result
|
56
|
+
# g.dup_top # stack: myco_levels, result, result
|
57
|
+
|
58
|
+
# g.goto_if_not_undefined(done_label) # stack: myco_levels, undefined
|
59
|
+
# g.pop # stack: myco_levels
|
60
|
+
# g.goto(loop_start_label)
|
61
|
+
|
62
|
+
# fail_label.set! # stack: myco_levels, mod
|
63
|
+
# g.pop # stack: myco_levels
|
64
|
+
# g.push_cpath_top; g.find_const(:"Myco") # stack: myco_levels, ::Myco
|
65
|
+
# g.push_literal(name)
|
66
|
+
# g.send(:const_get, 1) # stack: myco_levels, result
|
67
|
+
|
68
|
+
# done_label.set! # stack: myco_levels, result
|
69
|
+
# g.swap; g.pop # stack: result
|
70
|
+
# }
|
27
71
|
}
|
28
72
|
}
|
29
73
|
|
@@ -16,17 +16,21 @@
|
|
16
16
|
::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", self.toplevel) {(
|
17
17
|
g.push_cpath_top
|
18
18
|
g.find_const(first_name)
|
19
|
-
)}) {(
|
20
|
-
g
|
21
|
-
|
22
|
-
g.push_literal(first_name)
|
23
|
-
g.push_scope
|
24
|
-
g.send(
|
25
|
-
:find_constant,
|
26
|
-
2
|
27
|
-
)
|
19
|
+
)}) {::Myco.find_constant(:Myco).find_constant_bytecode(
|
20
|
+
g,
|
21
|
+
first_name
|
28
22
|
)}
|
29
23
|
name_list.each { |name| (g.find_const(name))}
|
30
24
|
)}
|
25
|
+
::Myco::SingletonClass.component_eval {(declare_meme(:find_constant_bytecode, [], nil, ::Myco.cscope.dup) { |g, name| (
|
26
|
+
g.push_cpath_top
|
27
|
+
g.find_const(:Myco)
|
28
|
+
g.push_literal(name)
|
29
|
+
g.push_scope
|
30
|
+
g.send(
|
31
|
+
:find_constant,
|
32
|
+
2
|
33
|
+
)
|
34
|
+
)})}
|
31
35
|
)}})
|
32
36
|
.tap { |__c__| __c__.__name__ = :ConstantAccess })})}}.instance
|
@@ -18,11 +18,7 @@ CodeTools::AST << {
|
|
18
18
|
first_name && g.find_const(first_name)
|
19
19
|
) ?? (
|
20
20
|
first_name &? (
|
21
|
-
g
|
22
|
-
g.find_const(:"Myco")
|
23
|
-
g.push_literal(first_name)
|
24
|
-
g.push_scope
|
25
|
-
g.send(:find_constant, 2)
|
21
|
+
Myco.find_constant_bytecode(g, first_name)
|
26
22
|
) ?? (
|
27
23
|
g.push_scope
|
28
24
|
g.send(:for_method_definition, 0)
|
@@ -17,15 +17,9 @@
|
|
17
17
|
::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", self.constant.toplevel) {(
|
18
18
|
g.push_cpath_top
|
19
19
|
::Myco.branch_op(:"&&", first_name) {g.find_const(first_name)}
|
20
|
-
)}) {::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", first_name) {(
|
21
|
-
g
|
22
|
-
|
23
|
-
g.push_literal(first_name)
|
24
|
-
g.push_scope
|
25
|
-
g.send(
|
26
|
-
:find_constant,
|
27
|
-
2
|
28
|
-
)
|
20
|
+
)}) {::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", first_name) {::Myco.find_constant(:Myco).find_constant_bytecode(
|
21
|
+
g,
|
22
|
+
first_name
|
29
23
|
)}) {(
|
30
24
|
g.push_scope
|
31
25
|
g.send(
|
@@ -238,8 +238,11 @@ CodeTools::AST << {
|
|
238
238
|
}
|
239
239
|
|
240
240
|
DeclareDecorator << {
|
241
|
-
to_ruby: |g|
|
242
|
-
g.add("["self.name.value.inspect", ")
|
241
|
+
to_ruby: |g| {
|
242
|
+
g.add("["self.name.value.inspect", [")
|
243
|
+
g.list(self.arguments.body, ",", auto_lines:true)
|
244
|
+
g.add("]]")
|
245
|
+
}
|
243
246
|
}
|
244
247
|
|
245
248
|
BlockParameter << {
|
@@ -208,9 +208,13 @@
|
|
208
208
|
g.add("}")
|
209
209
|
)})})}
|
210
210
|
::Myco.find_constant(:DeclareDecorator).component_eval {(declare_meme(:to_ruby, [], nil, ::Myco.cscope.dup) { |g| (
|
211
|
-
g.add("[#{self.name.value.inspect}, ")
|
212
|
-
g.
|
213
|
-
|
211
|
+
g.add("[#{self.name.value.inspect}, [")
|
212
|
+
g.list(
|
213
|
+
self.arguments.body,
|
214
|
+
",",
|
215
|
+
{:auto_lines => true}
|
216
|
+
)
|
217
|
+
g.add("]]")
|
214
218
|
)})}
|
215
219
|
::Myco.find_constant(:BlockParameter).component_eval {(declare_meme(:to_ruby, [], nil, ::Myco.cscope.dup) { |g| (g.add("&#{self.name}"))})}
|
216
220
|
::Myco.find_constant(:ParameterAssembly).component_eval {(declare_meme(:to_ruby, [], nil, ::Myco.cscope.dup) { |g| (
|
data/lib/myco/code_tools/AST.my
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
|
2
2
|
::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
3
3
|
.tap { |__c__| __c__.__last__ = __c__.component_eval {(
|
4
|
-
::Myco.find_constant(:CodeTools)::AST.component_eval {(
|
4
|
+
::Myco.find_constant(:CodeTools)::AST.component_eval {(
|
5
|
+
::Myco.cscope.for_method_definition.const_set(:BuilderMethods, (::Myco.find_constant(:Module).new { || nil}))
|
6
|
+
::Myco.cscope.for_method_definition.const_set(:Builder, ::Myco::Component.new([
|
7
|
+
::Myco.find_constant(:BasicObject),
|
8
|
+
::Myco.find_constant(:BuilderMethods)
|
9
|
+
], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
10
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {nil}})
|
11
|
+
.tap { |__c__| __c__.__name__ = :Builder }
|
12
|
+
)}
|
5
13
|
declare_meme(:"AST/Node.my", [[:import, []]], nil, ::Myco.cscope.dup) { |*| nil}
|
6
14
|
declare_meme(:"AST/Script.my", [[:import, []]], nil, ::Myco.cscope.dup) { |*| nil}
|
7
15
|
declare_meme(:"AST/StringLiteral.my", [[:import, []]], nil, ::Myco.cscope.dup) { |*| nil}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
# TODO: include Pegleromyces library in a better way than clone into subdir
|
3
|
+
import as(:"Pegleromyces") 'parser/pegleromyces/lib/pegleromyces.my'
|
4
|
+
|
5
|
+
# TODO: remove this hack
|
6
|
+
::Myco::Pegleromyces: Pegleromyces
|
7
|
+
|
8
|
+
CodeTools::Parser < BasicObject {
|
9
|
+
MycoGrammar: Myco.eval_file('parser/MycoGrammar.my')
|
10
|
+
MycoBuilder: Myco.eval_file('parser/MycoBuilder.my')
|
11
|
+
|
12
|
+
MycoParser: Pegleromyces::BytecodeParser {
|
13
|
+
var grammar: MycoGrammar
|
14
|
+
# TODO: re-evaluate design that returns an existing builder as 'new_builder'
|
15
|
+
new_builder: MycoBuilder
|
16
|
+
}
|
17
|
+
|
18
|
+
parse_string: |string| {
|
19
|
+
parser = MycoParser
|
20
|
+
parser.parse(string)
|
21
|
+
parser.result &?
|
22
|
+
parser.result.fetch(:root) ?? parser.raise_error
|
23
|
+
}
|
24
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
3
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(
|
4
|
+
declare_meme(:"parser/pegleromyces/lib/pegleromyces.my", [
|
5
|
+
[:as, [:Pegleromyces]],
|
6
|
+
[:import, []]
|
7
|
+
], nil, ::Myco.cscope.dup) { |*| nil}
|
8
|
+
::Myco::Pegleromyces = (::Myco.find_constant(:Pegleromyces))
|
9
|
+
::Myco.find_constant(:CodeTools)::Parser = ::Myco::Component.new([::Myco.find_constant(:BasicObject)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
10
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(
|
11
|
+
::Myco.cscope.for_method_definition.const_set(:MycoGrammar, (::Myco.find_constant(:Myco).eval_file("parser/MycoGrammar.my")))
|
12
|
+
::Myco.cscope.for_method_definition.const_set(:MycoBuilder, (::Myco.find_constant(:Myco).eval_file("parser/MycoBuilder.my")))
|
13
|
+
::Myco.cscope.for_method_definition.const_set(:MycoParser, (::Myco::Component.new([::Myco.find_constant(:Pegleromyces)::BytecodeParser], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
14
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(
|
15
|
+
declare_meme(:grammar, [[:var, []]], nil, ::Myco.cscope.dup) { |*| (::Myco.find_constant(:MycoGrammar))}
|
16
|
+
declare_meme(:new_builder, [], nil, ::Myco.cscope.dup) { |*| (::Myco.find_constant(:MycoBuilder))}
|
17
|
+
)}}.instance))
|
18
|
+
declare_meme(:parse_string, [], nil, ::Myco.cscope.dup) { |string| (
|
19
|
+
parser = ::Myco.find_constant(:MycoParser)
|
20
|
+
parser.parse(string)
|
21
|
+
::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", parser.result) {parser.result.fetch(:root)}) {parser.raise_error}
|
22
|
+
)}
|
23
|
+
)}}
|
24
|
+
.tap { |__c__| __c__.__name__ = :Parser }
|
25
|
+
)}}.instance
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
BasicObject {
|
3
|
+
# TODO: be more clever here
|
4
|
+
ASTBuilder: ::CodeTools::AST::Builder.new
|
5
|
+
var ast: ASTBuilder
|
6
|
+
|
7
|
+
var escape_encodings: {
|
8
|
+
hash = Hash.new
|
9
|
+
hash["\\a"] = 7.chr # \a 0x07 Bell or alert
|
10
|
+
hash["\\b"] = 8.chr # \b 0x08 Backspace
|
11
|
+
# TODO: # \cx Control-x
|
12
|
+
# TODO: # \C-x Control-x
|
13
|
+
hash["\\e"] = 27.chr # \e 0x1b Escape
|
14
|
+
hash["\\f"] = 12.chr # \f 0x0c Formfeed
|
15
|
+
# TODO: # \M-\C-x Meta-Control-x
|
16
|
+
hash["\\n"] = 10.chr # \n 0x0a Newline
|
17
|
+
# TODO: # \nnn Octal notation, where n is a digit
|
18
|
+
hash["\\r"] = 13.chr # \r 0x0d Carriage return
|
19
|
+
hash["\\s"] = 32.chr # \s 0x20 Space
|
20
|
+
hash["\\t"] = 9.chr # \t 0x09 Tab
|
21
|
+
hash["\\v"] = 11.chr # \v 0x0b Vertical tab
|
22
|
+
# TODO: # \xnn Hexadecimal notation, where n is a digit
|
23
|
+
hash
|
24
|
+
}
|
25
|
+
|
26
|
+
# Encode escape characters in string literals
|
27
|
+
# TODO: rigorously test and refine
|
28
|
+
encode_escapes: |str| {
|
29
|
+
str.gsub(Regexp.new("\\\\.")) |substr| {
|
30
|
+
escape_encodings.fetch(substr, substr[-1])
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
# Given a node,op list ([node, op, node, op, ... node]) and operator types,
|
35
|
+
# collapse the (node, op, node) groups where the operator is one of the types
|
36
|
+
#
|
37
|
+
# This function is meant to be called several times on the same list,
|
38
|
+
# with a different set of operator types each time, in order of precedence.
|
39
|
+
#
|
40
|
+
collapse: |input, *types, &block| {
|
41
|
+
output = []
|
42
|
+
|
43
|
+
# Scan through, reducing or shifting based on the operator
|
44
|
+
loop {
|
45
|
+
(input.count > 2) || break
|
46
|
+
n0 = input.shift
|
47
|
+
op = input.shift
|
48
|
+
|
49
|
+
types.include?(op.type) &? (
|
50
|
+
n1 = input.shift
|
51
|
+
|
52
|
+
result = block
|
53
|
+
&? block.call(n0,op,n1)
|
54
|
+
?? ast.invoke(op, n0, op.sym, ast.argass(n1, [n1]))
|
55
|
+
input.unshift(result)
|
56
|
+
) ?? (
|
57
|
+
output.push(n0)
|
58
|
+
output.push(op)
|
59
|
+
)
|
60
|
+
}
|
61
|
+
|
62
|
+
# Push the last item remaining
|
63
|
+
output.push(input.shift)
|
64
|
+
|
65
|
+
input.replace(output)
|
66
|
+
}
|
67
|
+
}
|
@@ -0,0 +1,99 @@
|
|
1
|
+
|
2
|
+
::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
3
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(::Myco::Component.new([::Myco.find_constant(:BasicObject)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
4
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(
|
5
|
+
::Myco.cscope.for_method_definition.const_set(:ASTBuilder, (::CodeTools::AST::Builder.new))
|
6
|
+
declare_meme(:ast, [[:var, []]], nil, ::Myco.cscope.dup) { |*| (::Myco.find_constant(:ASTBuilder))}
|
7
|
+
declare_meme(:escape_encodings, [[:var, []]], nil, ::Myco.cscope.dup) { |*| (
|
8
|
+
hash = ::Myco.find_constant(:Hash).new
|
9
|
+
hash.__send__(
|
10
|
+
:[]=,
|
11
|
+
"\\a",
|
12
|
+
7.chr
|
13
|
+
)
|
14
|
+
hash.__send__(
|
15
|
+
:[]=,
|
16
|
+
"\\b",
|
17
|
+
8.chr
|
18
|
+
)
|
19
|
+
hash.__send__(
|
20
|
+
:[]=,
|
21
|
+
"\\e",
|
22
|
+
27.chr
|
23
|
+
)
|
24
|
+
hash.__send__(
|
25
|
+
:[]=,
|
26
|
+
"\\f",
|
27
|
+
12.chr
|
28
|
+
)
|
29
|
+
hash.__send__(
|
30
|
+
:[]=,
|
31
|
+
"\\n",
|
32
|
+
10.chr
|
33
|
+
)
|
34
|
+
hash.__send__(
|
35
|
+
:[]=,
|
36
|
+
"\\r",
|
37
|
+
13.chr
|
38
|
+
)
|
39
|
+
hash.__send__(
|
40
|
+
:[]=,
|
41
|
+
"\\s",
|
42
|
+
32.chr
|
43
|
+
)
|
44
|
+
hash.__send__(
|
45
|
+
:[]=,
|
46
|
+
"\\t",
|
47
|
+
9.chr
|
48
|
+
)
|
49
|
+
hash.__send__(
|
50
|
+
:[]=,
|
51
|
+
"\\v",
|
52
|
+
11.chr
|
53
|
+
)
|
54
|
+
hash
|
55
|
+
)}
|
56
|
+
declare_meme(:encode_escapes, [], nil, ::Myco.cscope.dup) { |str| (str.gsub(::Myco.find_constant(:Regexp).new("\\\\.")) { |substr| (self.escape_encodings.fetch(
|
57
|
+
substr,
|
58
|
+
substr.__send__(
|
59
|
+
:[],
|
60
|
+
-1
|
61
|
+
)
|
62
|
+
))})}
|
63
|
+
declare_meme(:collapse, [], nil, ::Myco.cscope.dup) { |input, *types, &block| (
|
64
|
+
output = []
|
65
|
+
self.loop { || (
|
66
|
+
::Myco.branch_op(:"||", input.count.__send__(
|
67
|
+
:>,
|
68
|
+
2
|
69
|
+
)) {self.__send__(:break)}
|
70
|
+
n0 = input.shift
|
71
|
+
op = input.shift
|
72
|
+
::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", types.__send__(
|
73
|
+
:include?,
|
74
|
+
op.type
|
75
|
+
)) {(
|
76
|
+
n1 = input.shift
|
77
|
+
result = ::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", block) {block.call(
|
78
|
+
n0,
|
79
|
+
op,
|
80
|
+
n1
|
81
|
+
)}) {self.ast.invoke(
|
82
|
+
op,
|
83
|
+
n0,
|
84
|
+
op.sym,
|
85
|
+
self.ast.argass(
|
86
|
+
n1,
|
87
|
+
[n1]
|
88
|
+
)
|
89
|
+
)}
|
90
|
+
input.unshift(result)
|
91
|
+
)}) {(
|
92
|
+
output.push(n0)
|
93
|
+
output.push(op)
|
94
|
+
)}
|
95
|
+
)}
|
96
|
+
output.push(input.shift)
|
97
|
+
input.replace(output)
|
98
|
+
)}
|
99
|
+
)}}.instance)}}.instance
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
MycoCharacterClasses: Pegleromyces::Grammar {
|
3
|
+
eol_comment: str('#') + (!eol + any).*
|
4
|
+
|
5
|
+
# TODO: reinstate the following:
|
6
|
+
nl: str("\n")
|
7
|
+
spc: set(" \t\r\f\v") / str("\\\n") / eol_comment
|
8
|
+
spc_nl: spc / nl
|
9
|
+
|
10
|
+
eof: !any
|
11
|
+
eol: nl / eof
|
12
|
+
|
13
|
+
# TODO: Unicode upper and lower
|
14
|
+
upper: range('A','Z')
|
15
|
+
lower: range('a','z') / str('_')
|
16
|
+
num: range('0','9')
|
17
|
+
alpha: lower / upper
|
18
|
+
alnum: alpha / num
|
19
|
+
suffix: str('!') / str('?')
|
20
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
3
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(::Myco.cscope.for_method_definition.const_set(:MycoCharacterClasses, (::Myco::Component.new([::Myco.find_constant(:Pegleromyces)::Grammar], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
|
4
|
+
.tap { |__c__| __c__.__last__ = __c__.component_eval {(
|
5
|
+
declare_meme(:eol_comment, [], nil, ::Myco.cscope.dup) { |*| (self.str("#").__send__(
|
6
|
+
:+,
|
7
|
+
self.eol.__send__(:!).__send__(
|
8
|
+
:+,
|
9
|
+
self.any
|
10
|
+
).__send__(:*)
|
11
|
+
))}
|
12
|
+
declare_meme(:nl, [], nil, ::Myco.cscope.dup) { |*| (self.str("\n"))}
|
13
|
+
declare_meme(:spc, [], nil, ::Myco.cscope.dup) { |*| (self.set(" \t\r\f\v").__send__(
|
14
|
+
:/,
|
15
|
+
self.str("\\\n")
|
16
|
+
).__send__(
|
17
|
+
:/,
|
18
|
+
self.eol_comment
|
19
|
+
))}
|
20
|
+
declare_meme(:spc_nl, [], nil, ::Myco.cscope.dup) { |*| (self.spc.__send__(
|
21
|
+
:/,
|
22
|
+
self.nl
|
23
|
+
))}
|
24
|
+
declare_meme(:eof, [], nil, ::Myco.cscope.dup) { |*| (self.any.__send__(:!))}
|
25
|
+
declare_meme(:eol, [], nil, ::Myco.cscope.dup) { |*| (self.nl.__send__(
|
26
|
+
:/,
|
27
|
+
self.eof
|
28
|
+
))}
|
29
|
+
declare_meme(:upper, [], nil, ::Myco.cscope.dup) { |*| (self.range(
|
30
|
+
"A",
|
31
|
+
"Z"
|
32
|
+
))}
|
33
|
+
declare_meme(:lower, [], nil, ::Myco.cscope.dup) { |*| (self.range(
|
34
|
+
"a",
|
35
|
+
"z"
|
36
|
+
).__send__(
|
37
|
+
:/,
|
38
|
+
self.str("_")
|
39
|
+
))}
|
40
|
+
declare_meme(:num, [], nil, ::Myco.cscope.dup) { |*| (self.range(
|
41
|
+
"0",
|
42
|
+
"9"
|
43
|
+
))}
|
44
|
+
declare_meme(:alpha, [], nil, ::Myco.cscope.dup) { |*| (self.lower.__send__(
|
45
|
+
:/,
|
46
|
+
self.upper
|
47
|
+
))}
|
48
|
+
declare_meme(:alnum, [], nil, ::Myco.cscope.dup) { |*| (self.alpha.__send__(
|
49
|
+
:/,
|
50
|
+
self.num
|
51
|
+
))}
|
52
|
+
declare_meme(:suffix, [], nil, ::Myco.cscope.dup) { |*| (self.str("!").__send__(
|
53
|
+
:/,
|
54
|
+
self.str("?")
|
55
|
+
))}
|
56
|
+
)}}.instance)))}}.instance
|