genmachine 0.1.6 → 0.2.0

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.2.0
data/genmachine.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{genmachine}
8
- s.version = "0.1.6"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joseph Wecker"]
12
- s.date = %q{2011-08-18}
12
+ s.date = %q{2011-08-19}
13
13
  s.default_executable = %q{genmachine}
14
14
  s.description = %q{Takes a state table where the following are defined: state, input+conditions, accumulate-action, pre-transition-actions, and transition-to. It takes that state table and generates very fast parsers. Similar to Ragel. Currently only outputs pure Ruby.}
15
15
  s.email = %q{joseph.wecker@gmail.com}
@@ -32,12 +32,12 @@ Gem::Specification.new do |s|
32
32
  "lib/VERSION",
33
33
  "lib/genmachine.rb",
34
34
  "lib/genmachine/char_set.rb",
35
- "lib/genmachine/generator.rb",
36
- "lib/genmachine/generators/helpers/general.rb",
37
- "lib/genmachine/generators/helpers/ruby.rb",
38
- "lib/genmachine/generators/ruby.rb",
39
- "lib/genmachine/generators/templates/ruby/executable.erb",
40
- "lib/genmachine/generators/templates/ruby/lib.erb.rb",
35
+ "lib/genmachine/generators/general_helper.rb",
36
+ "lib/genmachine/generators/generator.rb",
37
+ "lib/genmachine/generators/ruby/executable.erb",
38
+ "lib/genmachine/generators/ruby/helper.rb",
39
+ "lib/genmachine/generators/ruby/lib.erb.rb",
40
+ "lib/genmachine/generators/ruby/ruby.rb",
41
41
  "lib/genmachine/spec_parser.rb",
42
42
  "machines/genmachine.machine",
43
43
  "misc/genmachine.vim",
data/lib/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.2.0
@@ -19,7 +19,7 @@ module GenMachine
19
19
  states.each do |name,clauses|
20
20
  clauses.each do |c|
21
21
  c[:exprs].each do |e|
22
- return true if e =~ /<<s($|[^a-zA-Z0-9_])/
22
+ return true if e =~ /\bs\s*>>/
23
23
  end
24
24
  end
25
25
  end
@@ -33,7 +33,7 @@ module GenMachine
33
33
  exprs = c[:exprs].dup
34
34
  exprs << c[:acc].dup
35
35
  exprs.each do |e|
36
- if e =~ /^([a-zA-Z_][a-zA-Z0-9_]*)?\s*<<\s*(<?)([a-zA-Z_][a-zA-Z0-9_]*)?$/
36
+ if e =~ /^([a-zA-Z_][a-zA-Z0-9_]*)?\s*>>\s*([a-zA-Z_][a-zA-Z0-9_]*)?$/
37
37
  accs[$1]=true unless ($1.nil? or $1 == '' or $1 == 'p' or $1 == 's')
38
38
  accs[$3]=true unless ($3.nil? or $3 == '' or $3 == 'p' or $3 == 's')
39
39
  end
@@ -1,6 +1,9 @@
1
1
  module GenMachine
2
2
  module Helpers
3
3
  module Ruby
4
+ INPUT = '__i'
5
+ STATE = '__state'
6
+
4
7
  def rb_conditional(clause,states,clauses)
5
8
  has_eof_state = eof_state?(states) || eof_clause?(clauses)
6
9
  out = ''
@@ -22,13 +25,13 @@ module GenMachine
22
25
  if range.is_a? Array
23
26
  outs << "nl?" if (range[0] <= 0x0a) && (range[1] >= 0x0a)
24
27
  outs << "space?" if (range[0] <= 0x20) && (range[1] >= 0x20)
25
- outs << "(c>#{range[0]-1}&&c<#{range[1]+1})"
28
+ outs << "(#{INPUT}>#{range[0]-1}&&#{INPUT}<#{range[1]+1})"
26
29
  else
27
30
  outs << case range
28
31
  when 0x0a; 'nl?'
29
32
  when 0x20; 'space?'
30
33
  when :any; has_eof_state ? 'true' : '!eof?'
31
- else "c==#{range}" end
34
+ else "#{INPUT}==#{range}" end
32
35
  end
33
36
  end
34
37
  end
@@ -41,7 +44,7 @@ module GenMachine
41
44
  cmds = []
42
45
  cmds += rb_simple_acc_commands(clause[:acc])
43
46
  clause[:exprs].each do |expr|
44
- if expr.include? '<<'
47
+ if expr.include? '>>'
45
48
  cmds += rb_acc_commands(expr)
46
49
  else
47
50
  cmds << rb_vars(expr.strip)
@@ -63,7 +66,7 @@ module GenMachine
63
66
  params = $3.split(',').map{|p|rb_vars(p)}
64
67
  params << 's'
65
68
  params << "'#{rename}'" unless (rename.nil? or rename.strip=='')
66
- out << "state=#{funname}(#{params.join(',')})"
69
+ out << "#{STATE}=#{funname}(#{params.join(',')})"
67
70
  add_next = true
68
71
  when s =~ /^<done>$/
69
72
  out << "return(s)"
@@ -72,7 +75,7 @@ module GenMachine
72
75
  out << "return(#{rb_vars($1)})"
73
76
  add_next = false
74
77
  when s =~ /^(:[a-zA-Z0-9_:-]+)$/
75
- out << "state='#{$1}'" unless currstate == $1
78
+ out << "#{STATE}='#{$1}'" unless currstate == $1
76
79
  add_next = true
77
80
  else
78
81
  out << s
@@ -89,30 +92,23 @@ module GenMachine
89
92
  def rb_simple_acc_commands(acc_phrase)
90
93
  case
91
94
  when (acc_phrase.nil? or acc_phrase == ''); return ['@fwd=true']
92
- when acc_phrase.strip == '<<'; return []
93
- when acc_phrase.strip =~ /^([a-zA-Z_][a-zA-Z0-9_]*)\s*<<\s*$/
94
- return ["#{rb_vars(acc_phrase.strip)}c"]
95
+ when acc_phrase.strip == '>>'; return []
96
+ when acc_phrase =~ /^\s*>>\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*$/
97
+ return ["#{INPUT}.into(#{rb_vars($1)})"]
95
98
  else raise("Can't figure out your accumulator statement: #{acc_phrase}")
96
99
  end
97
100
  end
98
101
 
99
102
  def rb_acc_commands(acc_phrase)
100
103
  case
101
- when (acc_phrase.nil? or acc_phrase == ''); return ['@fwd=true']
102
- when acc_phrase.strip == '<<'; return []
103
- when acc_phrase.strip =~ /^([a-zA-Z_][a-zA-Z0-9_]*)\s*<<\s*(<?)([a-zA-Z_][a-zA-Z0-9_]*)$/
104
- into = $1
105
- value = $3
106
- clear_it = $2 == '<'
107
- into = rb_vars(into)
108
- value = rb_vars(value)
109
- if clear_it
110
- out = ["(#{into}<<#{value} if #{value}.size>0)"]
111
- out << "#{value}=UString.new"
112
- else
113
- out = ["#{into}<<#{value}"]
114
- end
115
- return out
104
+ when (acc_phrase.nil? or acc_phrase == '')
105
+ return ['@fwd=true']
106
+ when acc_phrase.strip == '>>'
107
+ return []
108
+ when acc_phrase =~ /^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*>>\s*$/
109
+ return ["#{rb_vars($1)}.reset!"]
110
+ when acc_phrase =~ /^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*>>\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*$/
111
+ return ["#{rb_vars($1)}.into(#{rb_vars($2)})"]
116
112
  else raise("Can't figure out your accumulator statement: #{acc_phrase}")
117
113
  end
118
114
  end
@@ -1,22 +1,46 @@
1
1
  require 'strscan'
2
2
  $KCODE="U"
3
3
 
4
+ class Integer
5
+ def into(v); v << self end
6
+ def reset!; :nop end
7
+ def reset; :nop end
8
+ end
9
+
4
10
  module <%= @classname %>
5
11
  def self.parse(str) Parser.new(str).parse end
6
12
  def self.parse_file(fname) Parser.new(IO.read(fname)).parse end
7
13
 
14
+
15
+ class UArray < Array
16
+ def into(v)
17
+ return if size == 0
18
+ v << self
19
+ end
20
+ def reset!; self.clear end
21
+ def reset; d=dup;d.reset!;d end
22
+ end
23
+
8
24
  class UHash < Hash
25
+ def into(v) v << self end
9
26
  def <<(kv) k,v = kv; self[k] = v end
27
+ def reset!; self.clear end
28
+ def reset; d=dup; d.reset!; d end
10
29
  end
11
30
 
12
31
  class UString < String
32
+ def into(v)
33
+ return if size == 0
34
+ v << self.dup
35
+ reset!
36
+ end
37
+
13
38
  def <<(v)
14
- begin
15
- super([v].pack('U*'))
16
- rescue
17
- super(v)
18
- end
39
+ begin; super([v].pack('U*'))
40
+ rescue; super(v) end
19
41
  end
42
+ def reset!; self.gsub! /./um,'' end
43
+ def reset; d=dup;d.reset!;d end
20
44
  end
21
45
 
22
46
  class UNode
@@ -29,6 +53,7 @@ module <%= @classname %>
29
53
  @c= params.delete(:c) || []
30
54
  @name = params.delete(:name)
31
55
  end
56
+ def into(val) val << self end
32
57
  def <<(val) @c<<val end
33
58
  def [](key) @c[key] end
34
59
  end
@@ -97,12 +122,12 @@ module <%= @classname %>
97
122
  @leading = true; @indent = 0
98
123
  when 0x0a
99
124
  nc = peek(4).unpack('U')[0]
100
- if nc == 0x0d then getch; c = "\n\r" end
125
+ if nc == 0x0d then getch; c = UString.new("\n\r") end
101
126
  @last_is_newline = true; @line += 1; @pos = 1
102
127
  @leading = true; @indent = 0
103
128
  when 0x0d
104
129
  nc = peek(4).unpack('U')[0]
105
- if nc == 0x0a then getch; c = "\r\n" end
130
+ if nc == 0x0a then getch; c = UString.new("\r\n") end
106
131
  @last_is_newline = true; @line += 1; @pos = 1
107
132
  @leading = true; @indent = 0
108
133
  when 0x20
@@ -137,12 +162,12 @@ module <%= @classname %>
137
162
  <%- cmds.each do |c| -%>
138
163
  <%= rb_vars(c) %>
139
164
  <%- end -%>
140
- state='<%= first_state %>'
165
+ <%=STATE%>='<%= first_state %>'
141
166
  <%- if states.size > 1 or accumulates?(states) or makes_calls?(states) -%>
142
167
  <%- if otype == 'U' -%>
143
168
  s = UNode.new(:name=>name,:sline=>@line,:schr=>@pos)
144
169
  <%- elsif otype == '[]' -%>
145
- s = []
170
+ s = UArray.new
146
171
  <%- elsif otype == '{}' -%>
147
172
  s = UHash.new
148
173
  <%- end -%>
@@ -151,12 +176,12 @@ module <%= @classname %>
151
176
  <%= _acc %> ||= UString.new
152
177
  <%- end -%>
153
178
  loop do
154
- c = nextchar
179
+ <%= INPUT %> = nextchar
155
180
  <%- has_fallthru = false -%>
156
181
  <%- if eof_state?(states) -%>
157
- state = '{eof}' if c==:eof
182
+ <%=STATE%> = '{eof}' if <%= INPUT %>==:eof
158
183
  <%- end -%>
159
- case state
184
+ case <%=STATE%>
160
185
  <%- states.each do |st_name, clauses| -%>
161
186
  when '<%= st_name %>'
162
187
  <%- if clauses.size > 1 -%>
@@ -185,7 +210,7 @@ module <%= @classname %>
185
210
  <%- end -%>
186
211
  end
187
212
  <%- if has_fallthru -%>
188
- error("Unexpected #{c}")
213
+ error("Unexpected #{<%= INPUT %>}")
189
214
  @fwd = true
190
215
  return
191
216
  <%- end -%>
@@ -2,14 +2,16 @@ module GenMachine
2
2
  module Generators
3
3
  class RubyGenerator
4
4
  require 'erb'
5
- require 'genmachine/generators/helpers/ruby'
5
+ require 'genmachine/generators/generator'
6
+ require 'genmachine/generators/general_helper'
7
+ require 'genmachine/generators/ruby/helper'
6
8
  include Generator
7
9
  include GenMachine::Helpers::Ruby
8
10
  include GenMachine::Helpers::General
9
11
  GENMACHINE_TARGET = 'ruby'
10
12
 
11
13
  def initialize(opts)
12
- @template_base = File.expand_path(File.dirname(__FILE__))+'/templates/ruby/'
14
+ @template_base = File.dirname(__FILE__) + '/'
13
15
  super(opts)
14
16
  end
15
17
 
data/lib/genmachine.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  require 'genmachine/spec_parser'
2
- require 'genmachine/generator'
3
- require 'genmachine/generators/helpers/general'
4
2
  require 'genmachine/char_set'
5
3
 
6
- Dir[File.join(File.dirname(__FILE__),'genmachine','generators','*.rb')].each do |fname|
7
- name = File.basename(fname)
8
- require "genmachine/generators/#{name}"
4
+ Dir[File.join(File.dirname(__FILE__),'genmachine','generators','*')].each do |fname|
5
+ if File.directory? fname
6
+ name = File.basename(fname)
7
+ require "genmachine/generators/#{name}/#{name}"
8
+ end
9
9
  end
10
10
 
11
11
  module GenMachine
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 6
10
- version: 0.1.6
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joseph Wecker
@@ -15,11 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-18 00:00:00 -07:00
18
+ date: 2011-08-19 00:00:00 -07:00
19
19
  default_executable: genmachine
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :development
23
22
  requirement: &id001 !ruby/object:Gem::Requirement
24
23
  none: false
25
24
  requirements:
@@ -32,8 +31,8 @@ dependencies:
32
31
  name: shoulda
33
32
  version_requirements: *id001
34
33
  prerelease: false
35
- - !ruby/object:Gem::Dependency
36
34
  type: :development
35
+ - !ruby/object:Gem::Dependency
37
36
  requirement: &id002 !ruby/object:Gem::Requirement
38
37
  none: false
39
38
  requirements:
@@ -48,8 +47,8 @@ dependencies:
48
47
  name: bundler
49
48
  version_requirements: *id002
50
49
  prerelease: false
51
- - !ruby/object:Gem::Dependency
52
50
  type: :development
51
+ - !ruby/object:Gem::Dependency
53
52
  requirement: &id003 !ruby/object:Gem::Requirement
54
53
  none: false
55
54
  requirements:
@@ -64,8 +63,8 @@ dependencies:
64
63
  name: jeweler
65
64
  version_requirements: *id003
66
65
  prerelease: false
67
- - !ruby/object:Gem::Dependency
68
66
  type: :development
67
+ - !ruby/object:Gem::Dependency
69
68
  requirement: &id004 !ruby/object:Gem::Requirement
70
69
  none: false
71
70
  requirements:
@@ -78,6 +77,7 @@ dependencies:
78
77
  name: rcov
79
78
  version_requirements: *id004
80
79
  prerelease: false
80
+ type: :development
81
81
  description: "Takes a state table where the following are defined: state, input+conditions, accumulate-action, pre-transition-actions, and transition-to. It takes that state table and generates very fast parsers. Similar to Ragel. Currently only outputs pure Ruby."
82
82
  email: joseph.wecker@gmail.com
83
83
  executables:
@@ -101,12 +101,12 @@ files:
101
101
  - lib/VERSION
102
102
  - lib/genmachine.rb
103
103
  - lib/genmachine/char_set.rb
104
- - lib/genmachine/generator.rb
105
- - lib/genmachine/generators/helpers/general.rb
106
- - lib/genmachine/generators/helpers/ruby.rb
107
- - lib/genmachine/generators/ruby.rb
108
- - lib/genmachine/generators/templates/ruby/executable.erb
109
- - lib/genmachine/generators/templates/ruby/lib.erb.rb
104
+ - lib/genmachine/generators/general_helper.rb
105
+ - lib/genmachine/generators/generator.rb
106
+ - lib/genmachine/generators/ruby/executable.erb
107
+ - lib/genmachine/generators/ruby/helper.rb
108
+ - lib/genmachine/generators/ruby/lib.erb.rb
109
+ - lib/genmachine/generators/ruby/ruby.rb
110
110
  - lib/genmachine/spec_parser.rb
111
111
  - machines/genmachine.machine
112
112
  - misc/genmachine.vim