sexp 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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: