self-ml 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ # Autotest.add_hook :initialize do |at|
6
+ # at.extra_files << "../some/external/dependency.rb"
7
+ #
8
+ # at.libs << ":../some/external"
9
+ #
10
+ # at.add_exception 'vendor'
11
+ #
12
+ # at.add_mapping(/dependency.rb/) do |f, _|
13
+ # at.files_matching(/test_.*rb$/)
14
+ # end
15
+ #
16
+ # %w(TestA TestB).each do |klass|
17
+ # at.extra_class_map[klass] = "test/test_misc.rb"
18
+ # end
19
+ # end
20
+
21
+ # Autotest.add_hook :run_command do |at|
22
+ # system "rake build"
23
+ # end
File without changes
@@ -0,0 +1,3 @@
1
+ === 0.0.1 / 2011-08-06
2
+
3
+ Wrote the first version of the SelfML parser in ruby.
@@ -0,0 +1,7 @@
1
+ .autotest
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ lib/self-ml.rb
7
+ test/test_self_ml.rb
@@ -0,0 +1,61 @@
1
+ = SelfML-ruby
2
+
3
+ * https://github.com/fileability/self-ml
4
+
5
+ == DESCRIPTION:
6
+
7
+ A SelfML parser in Ruby.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * parses SelfML
12
+
13
+ == SYNOPSIS:
14
+
15
+ Parses SelfML, like
16
+ (food
17
+ (fruit Apple Banana Orange)
18
+ (veggies Potato Carrot Onion))
19
+
20
+
21
+ == REQUIREMENTS:
22
+
23
+ * parslet
24
+
25
+ == INSTALL:
26
+
27
+ * gem install self-ml
28
+
29
+ == DEVELOPERS:
30
+
31
+ After checking out the source, run:
32
+
33
+ $ rake newb
34
+
35
+ This task will install any missing dependencies, run the tests/specs,
36
+ and generate the RDoc.
37
+
38
+ == LICENSE:
39
+
40
+ (The MIT License)
41
+
42
+ Copyright (c) 2011 FIX
43
+
44
+ Permission is hereby granted, free of charge, to any person obtaining
45
+ a copy of this software and associated documentation files (the
46
+ 'Software'), to deal in the Software without restriction, including
47
+ without limitation the rights to use, copy, modify, merge, publish,
48
+ distribute, sublicense, and/or sell copies of the Software, and to
49
+ permit persons to whom the Software is furnished to do so, subject to
50
+ the following conditions:
51
+
52
+ The above copyright notice and this permission notice shall be
53
+ included in all copies or substantial portions of the Software.
54
+
55
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
56
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
57
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
58
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
59
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
60
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
61
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,12 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.spec 'self-ml' do
7
+ developer('Indigo Casson', 'atamiser@gmail.com')
8
+
9
+ # self.rubyforge_name = 'Rubyx' # if different than 'Ruby'
10
+ end
11
+
12
+ # vim: syntax=ruby
@@ -0,0 +1,133 @@
1
+
2
+ require 'parslet'
3
+ require 'pp'
4
+
5
+ # SelfML is a simple, human writable, machine readable, configuration
6
+ # language. This is the ruby implementation.
7
+ module SelfML
8
+ # The current version.
9
+ VERSION = "0.0.1"
10
+
11
+ module_function
12
+ # Parse a SelfML document inputed as a string.
13
+ # Returns an array. That array will contain both strings an arrays,
14
+ # and so on.
15
+ #
16
+ # SelfML.parse("(test awesome x)") #=> [["test", "awesome", "x"]]
17
+ #
18
+ # SelfML.parse("(x (1 2 3) [This is a test])")
19
+ # #=> [[:x, [1, 2, 3], "This is a test"]]
20
+ def parse(string)
21
+ Transformer.new.apply(Parser.new.parse(string))
22
+ end
23
+
24
+ # This is a slightly heavier weight way of parsing SelfML strings.
25
+ #
26
+ # ml = SelfML::Document.new
27
+ # ml.parse("test") #=> ["test"]
28
+ #
29
+ # This might be slightly more efficient (what with alocating parser
30
+ # and transformer resources) but it's more verbose.
31
+ class Document
32
+ # Create a new document object, with which, you can parse SelfML
33
+ # documents.
34
+ def initialize
35
+ @parser = Parser.new
36
+ @transformer = Transformer.new
37
+ end
38
+
39
+ # Parse a string of SelfML. See SelfML#parse for more information on
40
+ # SelfML parsing.
41
+ def parse(string)
42
+ @transformer.apply(@parser.parse(string))
43
+ end
44
+ end
45
+
46
+ # This is the parser for SelfML. Looking at this might be useful. This
47
+ # outputs a strange, verbose parse tree full of hashes, arrays, and
48
+ # symbols. See SelfML::Transformer to convert this tree into useable
49
+ # data.
50
+ class Parser < Parslet::Parser
51
+ # Whitespace stuff
52
+ rule(:space) { match('\s').repeat(1) }
53
+ rule(:space?) { space.maybe }
54
+
55
+ rule(:line_comment) { match("#.+\n") }
56
+ rule(:block_comment) {
57
+ str("{#") >>
58
+ (str("#}").absent? >> any).repeat >>
59
+ str("#}")
60
+ }
61
+
62
+ # String literals
63
+ rule(:word_literal) { match('[^\(\)\[\]\{\}#` \n]').repeat(1).as(:literal) }
64
+ rule(:bracket_literal) {
65
+ str("[") >>
66
+ space? >>
67
+ (
68
+ (str("]").absent? >> any) # []] and [[] are valid, shouldn't be
69
+ ).repeat.as(:literal) >>
70
+ str("]") >>
71
+ space?
72
+ }
73
+
74
+ rule(:backtick_literal) {
75
+ str("`") >>
76
+ space? >>
77
+ (
78
+ (str("`").absent? >> any).as(:tmp_literal) |
79
+ (str("``")).as(:double_backtick)
80
+ ).repeat.as(:backtick_literal) >>
81
+ str("`") >>
82
+ space?
83
+ }
84
+ rule(:literal) { ( bracket_literal | backtick_literal | word_literal ) >> space? }
85
+
86
+ rule(:subnodes) { str("(") >> nodes >> space? >> str(")") >> space? }
87
+
88
+ rule(:line_comment) {
89
+ str("#") >>
90
+ (str("\n").absent? >> any).repeat.maybe >>
91
+ str("\n")
92
+ }
93
+
94
+ # Node!
95
+ rule(:node) { ( literal | line_comment | block_comment | subnodes.as(:nodes) ) >> space? }
96
+
97
+ # Root stuff
98
+ rule(:nodes) { node.repeat }
99
+ root(:nodes)
100
+ end
101
+
102
+ # This is the transformer for SelfML. This takes the parse tree and
103
+ # converts it to useful data.
104
+ class Transformer < Parslet::Transform
105
+ rule(:backtick_literal => subtree(:x)) do
106
+ x.map do |y|
107
+ if y.has_key?(:double_backtick)
108
+ '`'
109
+ else
110
+ y[:tmp_literal]
111
+ end
112
+ end.join("")
113
+ end
114
+
115
+ rule(:literal => simple(:y)) do
116
+ x = y.to_s
117
+ if x =~ /[0-9]+/
118
+ x.to_i
119
+ elsif x.split(" ").length == 1
120
+ x.to_sym
121
+ else
122
+ x
123
+ end
124
+ end
125
+
126
+ rule(:nodes => subtree(:x)) { x }
127
+
128
+ end
129
+ end
130
+
131
+ if $0 == __FILE__
132
+ pp SelfML.parse(IO.readlines(ARGV.first).join(''))
133
+ end
@@ -0,0 +1,40 @@
1
+ require "test/unit"
2
+ require "self-ml"
3
+
4
+ class TestSelfML < Test::Unit::TestCase
5
+ def parse(string)
6
+ SelfML.parse(string)
7
+ end
8
+
9
+ def test_single_literals
10
+ assert_equal([:test], parse("test"))
11
+ assert_equal([:awesome], parse("awesome"))
12
+ end
13
+
14
+ def test_numbers
15
+ assert_equal([1], parse("1"))
16
+ assert_equal([1234], parse("1234"))
17
+ end
18
+
19
+ def test_brackets
20
+ assert_equal(["This is a test"], parse("[This is a test]"))
21
+ assert_equal(["This is pretty cool"], parse("[This is pretty cool]"))
22
+ end
23
+
24
+ def test_backticks
25
+ assert_equal(["This is a test"], parse("`This is a test`"))
26
+ assert_equal(["This is a ` test"], parse("`This is a `` test`"))
27
+ assert_equal([""], parse("``"))
28
+ end
29
+
30
+ def test_groups
31
+ assert_equal([[:test]], parse("(test)"))
32
+ assert_equal([[:test, :awesome]], parse("(test awesome)"))
33
+ end
34
+
35
+ def test_recursive_groups
36
+ assert_equal([[:test, [:awesome]]], parse("(test (awesome))"))
37
+ assert_equal([[:test, [1, 2, 3], [:qwer, :asdf, :zxcv]]], parse("(test (1 2 3) (qwer asdf zxcv))"))
38
+ assert_equal([[1, 2, 3, 4], [5, 6, 7, 8]], parse("(1 2 3 4) (5 6 7 8)"))
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: self-ml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Indigo Casson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain:
12
+ - ! '-----BEGIN CERTIFICATE-----
13
+
14
+ MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhhdGFt
15
+
16
+ aXNlcjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
17
+
18
+ MB4XDTExMDgwNzAzMDYxMVoXDTEyMDgwNjAzMDYxMVowPzERMA8GA1UEAwwIYXRh
19
+
20
+ bWlzZXIxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
21
+
22
+ bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKNm6LW3D89zuX8mc+3E
23
+
24
+ dP6GcHB0d2UOPjkK56fgIsFVL7/iZW5WWKC48oZNW/Xj5kdV/UJUeObpHkUjfIlM
25
+
26
+ 7Enjly2L4Dx6ksBrumZm3rIAMXSkqusjGrOAhhKW5nEREai3mvOgC1IF4vbg+wK0
27
+
28
+ 57uFypWnVQKuEmdZZxtx/4WqxR265ANY+tmzVzZ/yzNLOSdZd8O/t1SBeFWyeJR7
29
+
30
+ yK640vPTj0EXJg8WQX8isIJQo++FhNutbX1rdwQV8z1yiiN8k3kV9uNyulI6YoRB
31
+
32
+ uVYChQ+vSZuGtoFLEYIlHrRDtpV9Fz0czNoMiSh26PKjyfE8ApHuXz17+owMphQA
33
+
34
+ qDkCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUN94xcCFdEJsU9VnUQ2hx
35
+
36
+ kl3okEcwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQB3QwcdeoeQEroJ
37
+
38
+ zRlxHCUCmVcgmdprEGcP/kyQyKsWjn6L9Meq2eehBIcKDui86ZUVxthDcR9jikM6
39
+
40
+ Z0k83Ozuz7BeAax6yHOpCw9ffo/CSfYcQda6iKMKkE0uJjEZBUYLqr+2IzqsvftW
41
+
42
+ IYFOJB0i8EsYWApaom3HcGc4AEQsWTMwmz2AofaYhLx/L9blsIA+yq+TJ4aCAMzj
43
+
44
+ 4R8pYP5HnGmdzD9Ae+fhw4xPyuyI5dT8vxbaQLpK1ev1xPe6ibDZ5Sb41OAd2teX
45
+
46
+ cp2ZVwyMXrsOlwoNJiRrAWkRXLVZwb/p+/goBVOdvNyEojn+CgHNFySmXGKuYxEn
47
+
48
+ 9Dfv1Urv
49
+
50
+ -----END CERTIFICATE-----
51
+
52
+ '
53
+ date: 2011-08-07 00:00:00.000000000Z
54
+ dependencies:
55
+ - !ruby/object:Gem::Dependency
56
+ name: hoe
57
+ requirement: &18951520 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.10'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: *18951520
66
+ description: A SelfML parser in Ruby.
67
+ email:
68
+ - atamiser@gmail.com
69
+ executables: []
70
+ extensions: []
71
+ extra_rdoc_files:
72
+ - History.txt
73
+ - Manifest.txt
74
+ - README.txt
75
+ files:
76
+ - .autotest
77
+ - History.txt
78
+ - Manifest.txt
79
+ - README.txt
80
+ - Rakefile
81
+ - lib/self-ml.rb
82
+ - test/test_self_ml.rb
83
+ - .gemtest
84
+ homepage: https://github.com/fileability/self-ml
85
+ licenses: []
86
+ post_install_message:
87
+ rdoc_options:
88
+ - --main
89
+ - README.txt
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project: self-ml
106
+ rubygems_version: 1.8.7
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: A SelfML parser in Ruby.
110
+ test_files:
111
+ - test/test_self_ml.rb
Binary file