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 +1 -1
- data/genmachine.gemspec +8 -8
- data/lib/VERSION +1 -1
- data/lib/genmachine/generators/{helpers/general.rb → general_helper.rb} +2 -2
- data/lib/genmachine/generators/{helpers/ruby.rb → ruby/helper.rb} +19 -23
- data/lib/genmachine/generators/{templates/ruby → ruby}/lib.erb.rb +38 -13
- data/lib/genmachine/generators/{ruby.rb → ruby/ruby.rb} +4 -2
- data/lib/genmachine.rb +5 -5
- metadata +14 -14
- /data/lib/genmachine/{generator.rb → generators/generator.rb} +0 -0
- /data/lib/genmachine/generators/{templates/ruby → ruby}/executable.erb +0 -0
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
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.
|
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-
|
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/
|
36
|
-
"lib/genmachine/generators/
|
37
|
-
"lib/genmachine/generators/
|
38
|
-
"lib/genmachine/generators/ruby.rb",
|
39
|
-
"lib/genmachine/generators/
|
40
|
-
"lib/genmachine/generators/
|
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
|
+
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 =~
|
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
|
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 << "(
|
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 "
|
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 << "
|
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 << "
|
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 == '
|
93
|
-
when acc_phrase
|
94
|
-
return ["#{rb_vars(
|
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 == '')
|
102
|
-
|
103
|
-
when acc_phrase.strip
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
179
|
+
<%= INPUT %> = nextchar
|
155
180
|
<%- has_fallthru = false -%>
|
156
181
|
<%- if eof_state?(states) -%>
|
157
|
-
|
182
|
+
<%=STATE%> = '{eof}' if <%= INPUT %>==:eof
|
158
183
|
<%- end -%>
|
159
|
-
case
|
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 #{
|
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/
|
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.
|
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','
|
7
|
-
|
8
|
-
|
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
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
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
|
+
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/
|
105
|
-
- lib/genmachine/generators/
|
106
|
-
- lib/genmachine/generators/
|
107
|
-
- lib/genmachine/generators/ruby.rb
|
108
|
-
- lib/genmachine/generators/
|
109
|
-
- lib/genmachine/generators/
|
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
|
File without changes
|
File without changes
|