genmachine 0.1.6 → 0.2.0

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