sexp 0.1 → 0.2

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 (3) hide show
  1. data/sexp.rb +5 -105
  2. data/sexpressions.rb +39 -0
  3. metadata +10 -8
data/sexp.rb CHANGED
@@ -1,105 +1,5 @@
1
- #!/usr/bin/ruby
2
-
3
- require 'rubygems'
4
- require_gem 'multi'
5
- require 'smulti'
6
-
7
- module SExpressionParser
8
- class Base
9
- def initialize(text, *start)
10
- @list = start
11
- parse(text)
12
- end
13
-
14
- def add(item)
15
- @list.push(item)
16
- end
17
-
18
- def leave(text)
19
- @unwanted = text
20
- end
21
-
22
- def unwanted
23
- return @unwanted
24
- end
25
-
26
- def add_parse(item, rest)
27
- add(item)
28
- return parse(rest)
29
- end
30
-
31
- def add_leave(item, rest)
32
- add(item)
33
- leave(rest)
34
- end
35
- end
36
-
37
- SymbolRE = /[\w\-\+\/\*\?\!]/
38
- SymbolREMany = /[\w\-\+\/\*\?\!]*/
39
- NumberRE = /[\d\.]/
40
- NumberREMany = /[\d\.]*/
41
-
42
- class Main
43
- def initialize(text)
44
- smulti(:parse, /\s/) {|c, rest| parse(rest) }
45
- smulti(:parse, /\(/) {|c, rest| @res = List.new(rest) }
46
- smulti(:parse, /\"/) {|c, rest| @res = String.new(rest) }
47
- smulti(:parse, NumberRE) {|c, rest| @res = Number.new(rest, c) }
48
- smulti(:parse, SymbolRE) {|c, rest| @res = Symbol.new(rest, c) }
49
- parse(text)
50
- end
51
-
52
- def unwanted; return @res.unwanted(); end
53
- def value; return @res.value() ; end
54
- end
55
-
56
- class List < Base
57
- def initialize(*args)
58
- smulti(:parse, /\)/ ) {|s, rest| leave(rest) }
59
- smulti(:parse, /\s+/ ) {|s, rest| parse(rest) }
60
- smulti(:parse, // ) {|s, rest|
61
- item = Main.new(rest)
62
- add(item.value)
63
- parse(item.unwanted)
64
- }
65
- super(*args)
66
- end
67
-
68
- def value; @list; end
69
- end
70
-
71
- class String < Base
72
- def initialize(*args)
73
- smulti(:parse, '\"') {|s, rest| add_parse(s, rest) }
74
- smulti(:parse, '"' ) {|s, rest| leave(rest) }
75
- smulti(:parse, /./ ) {|s, rest| add_parse(s, rest) }
76
- smulti(:parse, // ) { throw "Couldn't parse string" }
77
- super(*args)
78
- end
79
-
80
- def value; @list.join(''); end
81
- end
82
-
83
- class Symbol < Base
84
- def initialize(*args)
85
- smulti(:parse, SymbolREMany) {|s, rest| add_leave(s, rest) }
86
- super(*args)
87
- end
88
-
89
- def value; @list.join('').to_sym; end
90
- end
91
-
92
- class Number < Base
93
- def initialize(*args)
94
- smulti(:parse, NumberREMany) {|s, rest| add_leave(s, rest) }
95
- super(*args)
96
- end
97
-
98
- def value; @list.join('').to_f; end
99
- end
100
- end
101
-
102
- class Object; def to_sexp; inspect(); end; end
103
- class Symbol; def to_sexp; id2name(); end; end
104
- class Array; def to_sexp; "(#{map{|x| x.to_sexp }.join(' ')})"; end; end
105
- class String; def parse_sexp; SExpressionParser::Main.new(self).value ; end; end
1
+ # This library used to supply 'sexp', but ParseTree also
2
+ # supplies a file named sexp.rb and comes earlier in the
3
+ # load order. I've switched this lib to the more verbose
4
+ # 'sexpressions', but this file is for compatibility.
5
+ require 'sexpressions'
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'rparsec'
3
+
4
+ module SExpressionParser
5
+ extend RParsec::Parsers
6
+
7
+ def self.stringer(opener, closer=nil, translate={})
8
+ closer = opener if closer.nil?
9
+ escape = (string('\\') >> any).map do |charnum|
10
+ escaped = charnum.chr
11
+ translate[escaped] || escaped
12
+ end
13
+ open = string(opener)
14
+ close = string(closer)
15
+ other = not_string(closer).map{|charnum| charnum.chr }
16
+ string = (open >> (escape|other).many << close).map {|strings| strings.to_s }
17
+ end
18
+
19
+ Integer = integer.map{|x| x.to_i }
20
+ Float = number.map{|x| x.to_f }
21
+ Number = longest(Integer, Float)
22
+ Special = Regexp.escape('+-*/=<>?!@#$%^&:~')
23
+ Symbol = regexp(/[\w#{Special}]*[A-Za-z#{Special}][\w#{Special}]*/).map{|s| s.to_sym }
24
+ String = stringer(%q{"}, %q{"}, "n" => "\n", "t" => "\t")
25
+ List = char('(') >> lazy{Values} << char(')')
26
+ Quoted = char("'") >> lazy{Value}.map{|value| [:quote, value] }
27
+ Value = alt(Quoted, List, String, Symbol, Number)
28
+ Values = Value.separated(whitespaces)
29
+ Parser = Values << eof
30
+
31
+ def self.parse(text)
32
+ Parser.parse(text)
33
+ end
34
+ end
35
+
36
+ class Object; def to_sexp; inspect(); end; end
37
+ class Symbol; def to_sexp; id2name(); end; end
38
+ class Array; def to_sexp; "(#{map{|x| x.to_sexp }.join(' ')})"; end; end
39
+ class String; def parse_sexp; SExpressionParser.parse(self) ; end; end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: sexp
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.1"
7
- date: 2006-02-05 00:00:00 -08:00
6
+ version: "0.2"
7
+ date: 2008-06-20 00:00:00 -04:00
8
8
  summary: SExpression Reading/Writing for Ruby
9
9
  require_paths:
10
10
  - .
11
11
  email: christophercyll@gmail.com
12
- homepage: http://cyll.org/sexp
12
+ homepage: http://rubyforge.org/projects/sexp/
13
13
  rubyforge_project: sexp
14
14
  description:
15
- autorequire: sexp
15
+ autorequire:
16
16
  default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: false
@@ -25,10 +25,12 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Topher Cyll
30
31
  files:
31
32
  - sexp.rb
33
+ - sexpressions.rb
32
34
  test_files: []
33
35
 
34
36
  rdoc_options: []
@@ -43,11 +45,11 @@ requirements: []
43
45
 
44
46
  dependencies:
45
47
  - !ruby/object:Gem::Dependency
46
- name: multi
48
+ name: rparsec
47
49
  version_requirement:
48
50
  version_requirements: !ruby/object:Gem::Version::Requirement
49
51
  requirements:
50
- - - "="
52
+ - - ">="
51
53
  - !ruby/object:Gem::Version
52
- version: "0.1"
54
+ version: "1.0"
53
55
  version: