genmachine 0.1.2 → 0.1.3

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.2
1
+ 0.1.3
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.2"
8
+ s.version = "0.1.3"
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-16}
12
+ s.date = %q{2011-08-17}
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}
@@ -39,6 +39,7 @@ Gem::Specification.new do |s|
39
39
  "lib/genmachine/generators/templates/ruby/executable.erb",
40
40
  "lib/genmachine/generators/templates/ruby/lib.erb.rb",
41
41
  "lib/genmachine/spec_parser.rb",
42
+ "machines/genmachine.machine",
42
43
  "misc/genmachine.vim",
43
44
  "test/helper.rb",
44
45
  "test/test_genmachine.rb"
data/lib/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
@@ -5,17 +5,22 @@ module <%= @classname %>
5
5
  def self.parse(str) Parser.new(str).parse end
6
6
  def self.parse_file(fname) Parser.new(IO.read(fname)).parse end
7
7
 
8
- class Node
9
- attr_accessor :name, :children, :start_line, :start_pos, :end_line, :end_pos
10
- def initialize(name='node',line=:unknown,pos=:unknown)
11
- @name = name
12
- @children = []
13
- @start_line = line
14
- @start_pos = pos
15
- @end_line = :unknown
16
- @end_pos = :unknown
8
+ class UHash < Hash
9
+ def <<(kv) k,v = kv; self[k] = v end
10
+ end
11
+
12
+ class UNode
13
+ attr_accessor :name, :m,:a,:c
14
+ def initialize(params={})
15
+ @m = params.delete(:m) || UHash.new
16
+ @m[:sline] ||= params.delete(:sline)
17
+ @m[:schr] ||= params.delete(:schr)
18
+ @a= params.delete(:a) || UHash.new
19
+ @c= params.delete(:c) || []
20
+ @name = params.delete(:name)
17
21
  end
18
- def <<(val) @children<<val end
22
+ def <<(val) @c<<val end
23
+ def [](key) @c[key] end
19
24
  end
20
25
 
21
26
  class Parser < StringScanner
@@ -115,7 +120,7 @@ module <%= @classname %>
115
120
 
116
121
  def eof?() return @last_c == :eof end
117
122
 
118
- <%- @spec_ast.each do |name, args, cmds, first_state, states| -%>
123
+ <%- @spec_ast.each do |name, otype, args, cmds, first_state, states| -%>
119
124
  <%- args << "p=nil" -%>
120
125
  <%- args << "name='#{name}'" -%>
121
126
  def <%= name %>(<%= args.join(',') %>)
@@ -124,7 +129,13 @@ module <%= @classname %>
124
129
  <%- end -%>
125
130
  state='<%= first_state %>'
126
131
  <%- if states.size > 1 or accumulates?(states) or makes_calls?(states) -%>
127
- s = Node.new(name,@line,@pos)
132
+ <%- if otype == 'U' -%>
133
+ s = UNode.new(:name=>name,:sline=>@line,:schr=>@pos)
134
+ <%- elsif otype == '[]' -%>
135
+ s = []
136
+ <%- elsif otype == '{}' -%>
137
+ s = UHash.new
138
+ <%- end -%>
128
139
  <%- end -%>
129
140
  <%- accumulators(states).each do |_acc| -%>
130
141
  <%= _acc %> ||= ''
@@ -10,7 +10,7 @@ module GenMachine
10
10
  end
11
11
 
12
12
  def build
13
- c_name = c_args = c_cmds = c_first_state = c_states = nil
13
+ c_name = c_type = c_args = c_cmds = c_first_state = c_states = nil
14
14
  new_fun = false
15
15
  @files.each do |fname|
16
16
  File.new(fname,'r').each_with_index do |line, line_no|
@@ -22,11 +22,13 @@ module GenMachine
22
22
  if det=='|' && cols[0].include?('(')
23
23
  new_fun = true
24
24
  unless c_name.nil?
25
- @table << [c_name, c_args, c_cmds, c_first_state, process_states(c_states)]
25
+ @table << [c_name, c_type, c_args, c_cmds, c_first_state, process_states(c_states)]
26
26
  end
27
27
  parts = cols[0].split('(')
28
28
  c_name = parts.shift.to_underscored
29
- c_args = parts.join('(').sub(/\)$/,'').split(',')
29
+ c_args, c_type = parts.join('(').split(/::(U|\[\]|\{\})$/)
30
+ c_args = c_args[0..-2].split(',')
31
+ c_type ||= '[]'
30
32
  c_states = []
31
33
  c_cmds = (cols[3]||'').split(';')
32
34
  c_first_state = cols[4]
@@ -56,7 +58,7 @@ module GenMachine
56
58
  end
57
59
  end
58
60
  unless c_name.nil?
59
- @table << [c_name, c_args, c_cmds, c_first_state, process_states(c_states)]
61
+ @table << [c_name, c_type, c_args, c_cmds, c_first_state, process_states(c_states)]
60
62
  end
61
63
  end
62
64
  if @opts[:debug]
@@ -0,0 +1,3 @@
1
+ Parser for this very format.
2
+
3
+ | genmachine()::[] | | | | |
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: genmachine
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
9
+ - 3
10
+ version: 0.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joseph Wecker
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-16 00:00:00 -07:00
18
+ date: 2011-08-17 00:00:00 -07:00
19
19
  default_executable: genmachine
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -108,6 +108,7 @@ files:
108
108
  - lib/genmachine/generators/templates/ruby/executable.erb
109
109
  - lib/genmachine/generators/templates/ruby/lib.erb.rb
110
110
  - lib/genmachine/spec_parser.rb
111
+ - machines/genmachine.machine
111
112
  - misc/genmachine.vim
112
113
  - test/helper.rb
113
114
  - test/test_genmachine.rb