antelope 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +11 -0
  3. data/bin/antelope +3 -3
  4. data/examples/{example.err → example.ace.err} +9 -9
  5. data/examples/{example.inf → example.ace.inf} +57 -9
  6. data/examples/example.ate +70 -0
  7. data/examples/example.ate.err +192 -0
  8. data/examples/example.ate.inf +432 -0
  9. data/lib/antelope/ace/compiler.rb +4 -4
  10. data/lib/antelope/ace/errors.rb +0 -18
  11. data/lib/antelope/ace.rb +6 -12
  12. data/lib/antelope/cli.rb +1 -1
  13. data/lib/antelope/dsl/compiler.rb +117 -0
  14. data/lib/antelope/dsl/contexts/base.rb +29 -0
  15. data/lib/antelope/dsl/contexts/main.rb +63 -0
  16. data/lib/antelope/dsl/contexts/match.rb +24 -0
  17. data/lib/antelope/dsl/contexts/precedence.rb +20 -0
  18. data/lib/antelope/dsl/contexts/production.rb +24 -0
  19. data/lib/antelope/dsl/contexts/terminal.rb +28 -0
  20. data/lib/antelope/dsl/contexts.rb +16 -0
  21. data/lib/antelope/dsl.rb +9 -0
  22. data/lib/antelope/errors.rb +18 -1
  23. data/lib/antelope/generation/constructor/first.rb +10 -12
  24. data/lib/antelope/generation/constructor/follow.rb +6 -6
  25. data/lib/antelope/generation/constructor/nullable.rb +6 -6
  26. data/lib/antelope/generation/constructor.rb +4 -4
  27. data/lib/antelope/generation/recognizer/rule.rb +17 -17
  28. data/lib/antelope/generation/recognizer/state.rb +9 -10
  29. data/lib/antelope/generation/recognizer.rb +8 -11
  30. data/lib/antelope/generation/tableizer.rb +2 -2
  31. data/lib/antelope/generator/base.rb +7 -7
  32. data/lib/antelope/generator/ruby.rb +1 -1
  33. data/lib/antelope/grammar/generation.rb +77 -0
  34. data/lib/antelope/grammar/loading.rb +84 -0
  35. data/lib/antelope/{ace → grammar}/precedence.rb +2 -4
  36. data/lib/antelope/grammar/precedences.rb +64 -0
  37. data/lib/antelope/{ace → grammar}/production.rb +11 -12
  38. data/lib/antelope/grammar/productions.rb +154 -0
  39. data/lib/antelope/grammar/symbols.rb +64 -0
  40. data/lib/antelope/{ace → grammar}/token/epsilon.rb +1 -2
  41. data/lib/antelope/{ace → grammar}/token/error.rb +1 -3
  42. data/lib/antelope/{ace → grammar}/token/nonterminal.rb +1 -3
  43. data/lib/antelope/{ace → grammar}/token/terminal.rb +1 -3
  44. data/lib/antelope/{ace → grammar}/token.rb +12 -15
  45. data/lib/antelope/grammar.rb +68 -0
  46. data/lib/antelope/version.rb +1 -1
  47. data/lib/antelope.rb +12 -6
  48. data/spec/antelope/ace/compiler_spec.rb +6 -6
  49. data/spec/antelope/ace/scanner_spec.rb +7 -7
  50. data/spec/antelope/generation/constructor_spec.rb +131 -0
  51. data/spec/support/grammar_helper.rb +2 -3
  52. metadata +32 -19
  53. data/lib/antelope/ace/grammar/generation.rb +0 -80
  54. data/lib/antelope/ace/grammar/loading.rb +0 -53
  55. data/lib/antelope/ace/grammar/precedences.rb +0 -68
  56. data/lib/antelope/ace/grammar/productions.rb +0 -156
  57. data/lib/antelope/ace/grammar/symbols.rb +0 -66
  58. data/lib/antelope/ace/grammar.rb +0 -69
  59. data/spec/antelope/constructor_spec.rb +0 -133
@@ -0,0 +1,63 @@
1
+ module Antelope
2
+ module DSL
3
+ module Contexts
4
+ # The main context of the Antelope DSL.
5
+ class Main < Base
6
+ def define(pass)
7
+ pass.each do |key, value|
8
+ case value
9
+ when Array
10
+ @defines[key] = value
11
+ else
12
+ @defines[key] = [value]
13
+ end
14
+ end
15
+ end
16
+
17
+ def terminals(&block)
18
+ @terminals.merge! context(Terminal, &block)
19
+ end
20
+
21
+ def precedences(&block)
22
+ @precedences = context(Precedence, &block)
23
+ end
24
+
25
+ def productions(&block)
26
+ @productions = context(Production, &block)
27
+ end
28
+
29
+ def template(template)
30
+ case template
31
+ when Hash
32
+ @templates.merge(template)
33
+ when String
34
+ @templates[:default] = template
35
+ else
36
+ raise ArgumentError, "Unexpected #{template.class}, " \
37
+ "expected String or Hash"
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def before_call
44
+ @defines = {}
45
+ @templates = {}
46
+ @terminals = {}
47
+ @precedences = []
48
+ @productions = []
49
+ end
50
+
51
+ def data
52
+ {
53
+ defines: @defines,
54
+ templates: @templates,
55
+ terminals: @terminals,
56
+ precedences: @precedences,
57
+ productions: @productions
58
+ }
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,24 @@
1
+ module Antelope
2
+ module DSL
3
+ module Contexts
4
+ class Match < Base
5
+ def match(options)
6
+ body = options.fetch(:body)
7
+ action = options.fetch(:action)
8
+ prec = options.fetch(:prec, '')
9
+
10
+ @matches << { body: body, action: "{#{action}}", prec: prec }
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :matches
16
+ alias_method :data, :matches
17
+
18
+ def before_call
19
+ @matches = []
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ module Antelope
2
+ module DSL
3
+ module Contexts
4
+ class Precedence < Base
5
+ def precedence(type, contents)
6
+ @precedences << [type].concat(contents)
7
+ end
8
+
9
+ private
10
+
11
+ attr_reader :precedences
12
+ alias_method :data, :precedences
13
+
14
+ def before_call
15
+ @precedences = []
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ module Antelope
2
+ module DSL
3
+ module Contexts
4
+ class Production < Base
5
+ def production(name, &block)
6
+ @productions[name].concat(context(Match, &block))
7
+ end
8
+
9
+ private
10
+
11
+ attr_reader :productions
12
+ alias_method :data, :productions
13
+
14
+ def before_call
15
+ @productions = Hash.new { |h, k| h[k] = [] }
16
+ end
17
+
18
+ def data
19
+ @productions
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ module Antelope
2
+ module DSL
3
+ module Contexts
4
+ class Terminal < Base
5
+ def terminal(map, value = true)
6
+ case map
7
+ when Hash
8
+ @terminals.merge!(map)
9
+ when Symbol, String
10
+ @terminals[map] = value
11
+ else
12
+ raise ArgumentError, "Unexpected #{map.class}, expected " \
13
+ "Hash or Symbol"
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :terminals
20
+ alias_method :data, :terminals
21
+
22
+ def before_call
23
+ @terminals = {}
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ require 'antelope/dsl/contexts/base'
4
+ require 'antelope/dsl/contexts/main'
5
+ require 'antelope/dsl/contexts/match'
6
+ require 'antelope/dsl/contexts/precedence'
7
+ require 'antelope/dsl/contexts/production'
8
+ require 'antelope/dsl/contexts/terminal'
9
+
10
+ module Antelope
11
+ module DSL
12
+ # The contexts implemented within a DSL.
13
+ module Contexts
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ require 'antelope/dsl/compiler'
4
+ require 'antelope/dsl/contexts'
5
+
6
+ module Antelope
7
+ module DSL
8
+ end
9
+ end
@@ -1,8 +1,25 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Antelope
4
-
5
4
  # Every error in antelope inherits this error class.
6
5
  class Error < StandardError
7
6
  end
7
+
8
+ # This is used primarily in the {Grammar}; if a rule references a
9
+ # token (a nonterminal or a terminal) that was not previously
10
+ # defined, this is raised.
11
+ class UndefinedTokenError < Error
12
+ end
13
+
14
+ # Used primarily in the {Compiler}, this is raised when the
15
+ # version requirement of the Ace file doesn't match the running
16
+ # version of Ace.
17
+ class IncompatibleVersionError < Error
18
+ end
19
+
20
+ # Primarily used in the {Grammar} (specifically
21
+ # {Grammar::Generation}), if the grammar could not determine the
22
+ # generator to use for the generation, it raises this.
23
+ class NoTypeError < Error
24
+ end
8
25
  end
@@ -3,10 +3,8 @@
3
3
  module Antelope
4
4
  module Generation
5
5
  class Constructor
6
-
7
6
  # Contains the methods to construct first sets for tokens.
8
7
  module First
9
-
10
8
  # Initialize.
11
9
  def initialize
12
10
  @firstifying = []
@@ -27,12 +25,12 @@ module Antelope
27
25
  # # if A is a nonterminal and a_1, a_2, ..., a_3 are all
28
26
  # # of the right-hand sides of its productions.
29
27
  #
30
- # @param token [Ace::Token, Array<Ace::Token>]
31
- # @return [Set<Ace::Token::Terminal>]
28
+ # @param token [Grammar::Token, Array<Grammar::Token>]
29
+ # @return [Set<Grammar::Token::Terminal>]
32
30
  # @see #first_array
33
31
  def first(token)
34
32
  case token
35
- when Ace::Token::Nonterminal
33
+ when Grammar::Token::Nonterminal
36
34
  firstifying(token) do
37
35
  productions = grammar.productions[token.name]
38
36
  productions.map { |prod|
@@ -40,12 +38,12 @@ module Antelope
40
38
  end
41
39
  when Array
42
40
  first_array(token)
43
- when Ace::Token::Epsilon
41
+ when Grammar::Token::Epsilon
44
42
  Set.new
45
- when Ace::Token::Terminal
43
+ when Grammar::Token::Terminal
46
44
  Set.new([token])
47
45
  else
48
- incorrect_argument! token, Ace::Token, Array
46
+ incorrect_argument! token, Grammar::Token, Array
49
47
  end
50
48
  end
51
49
 
@@ -57,8 +55,8 @@ module Antelope
57
55
  # sets for (since some tokens may be nullable). We then add
58
56
  # those sets to our set.
59
57
  #
60
- # @param tokens [Array<Ace::Token>]
61
- # @return [Set<Ace::Token>]
58
+ # @param tokens [Array<Grammar::Token>]
59
+ # @return [Set<Grammar::Token>]
62
60
  def first_array(tokens)
63
61
  tokens.dup.delete_if { |_| @firstifying.include?(_) }.
64
62
  each_with_index.take_while do |token, i|
@@ -73,9 +71,9 @@ module Antelope
73
71
  # Helps keep track of the nonterminals we're finding FIRST
74
72
  # sets for. This helps prevent recursion.
75
73
  #
76
- # @param tok [Ace::Token::Nonterminal]
74
+ # @param tok [Grammar::Token::Nonterminal]
77
75
  # @yield once.
78
- # @return [Set<Ace::Token>]
76
+ # @return [Set<Grammar::Token>]
79
77
  def firstifying(tok)
80
78
  @firstifying << tok
81
79
  out = yield
@@ -18,12 +18,12 @@ module Antelope
18
18
  # generates the FOLLOW set for the given token, and then
19
19
  # caches it.
20
20
  #
21
- # @return [Set<Ace::Token>]
21
+ # @return [Set<Grammar::Token>]
22
22
  # @see Constructor#incorrect_argument!
23
23
  # @see #generate_follow_set
24
24
  def follow(token)
25
- unless token.is_a? Ace::Token::Nonterminal
26
- incorrect_argument! token, Ace::Token::Nonterminal
25
+ unless token.is_a? Grammar::Token::Nonterminal
26
+ incorrect_argument! token, Grammar::Token::Nonterminal
27
27
  end
28
28
 
29
29
  @follows.fetch(token) { generate_follow_set(token) }
@@ -62,8 +62,8 @@ module Antelope
62
62
  # cache the result of a FOLLOW set, the empty set will be
63
63
  # returned).
64
64
  #
65
- # @param token [Ace::Token::Nonterminal]
66
- # @return [Set<Ace::Token>]
65
+ # @param token [Grammar::Token::Nonterminal]
66
+ # @return [Set<Grammar::Token>]
67
67
  # @see First#first
68
68
  # @see Nullable#nullable?
69
69
  def generate_follow_set(token)
@@ -96,7 +96,7 @@ module Antelope
96
96
  end
97
97
  end
98
98
 
99
- # Replace the cached empty set with our filled set.
99
+ # ReplGrammar the cached empty set with our filled set.
100
100
  @follows[token] = set
101
101
  end
102
102
  end
@@ -22,12 +22,12 @@ module Antelope
22
22
  # # if A is a nonterminal and a_1, a_2, ..., a_n are all
23
23
  # # of the right-hand sides of its productions
24
24
  #
25
- # @param token [Ace::Token, Array<Ace::Token>] the token to
25
+ # @param token [Grammar::Token, Array<Grammar::Token>] the token to
26
26
  # check.
27
27
  # @return [Boolean] if the token can reduce to ϵ.
28
28
  def nullable?(token)
29
29
  case token
30
- when Ace::Token::Nonterminal
30
+ when Grammar::Token::Nonterminal
31
31
  nullifying(token) do
32
32
  productions = grammar.productions[token.name]
33
33
  !!productions.any? { |prod| nullable?(prod[:items]) }
@@ -35,12 +35,12 @@ module Antelope
35
35
  when Array
36
36
  token.dup.delete_if { |tok|
37
37
  @nullifying.include?(tok) }.all? { |tok| nullable?(tok) }
38
- when Ace::Token::Epsilon
38
+ when Grammar::Token::Epsilon
39
39
  true
40
- when Ace::Token::Terminal
40
+ when Grammar::Token::Terminal
41
41
  false
42
42
  else
43
- incorrect_argument! token, Ace::Token, Array
43
+ incorrect_argument! token, Grammar::Token, Array
44
44
  end
45
45
  end
46
46
 
@@ -49,7 +49,7 @@ module Antelope
49
49
  # Helps keep track of the nonterminals we're checking for
50
50
  # nullability. This helps prevent recursion.
51
51
  #
52
- # @param tok [Ace::Token::Nonterminal]
52
+ # @param tok [Grammar::Token::Nonterminal]
53
53
  # @yield once.
54
54
  # @return [Boolean]
55
55
  def nullifying(tok)
@@ -18,17 +18,17 @@ module Antelope
18
18
 
19
19
  # The grammar.
20
20
  #
21
- # @return [Ace::Grammar]
21
+ # @return [Grammar::Grammar]
22
22
  attr_reader :grammar
23
23
 
24
24
  # The augmented productions generated by the constructor.
25
25
  #
26
- # @return [Set<Ace::Production>]
26
+ # @return [Set<Grammar::Production>]
27
27
  attr_reader :productions
28
28
 
29
29
  # Initialize.
30
30
  #
31
- # @param grammar [Ace::Grammar] the grammar.
31
+ # @param grammar [Grammar::Grammar] the grammar.
32
32
  def initialize(grammar)
33
33
  @productions = Set.new
34
34
  @grammar = grammar
@@ -120,7 +120,7 @@ module Antelope
120
120
  private
121
121
 
122
122
  def incorrect_argument!(arg, *types)
123
- raise ArgumentError, "Expected one of #{types.join(", ")}, got #{arg.class}"
123
+ raise ArgumentError, "Expected one of #{types.join(', ')}, got #{arg.class}"
124
124
  end
125
125
  end
126
126
  end
@@ -13,12 +13,12 @@ module Antelope
13
13
 
14
14
  # The left-hand side of the rule.
15
15
  #
16
- # @return [Ace::Token::Nonterminal]
16
+ # @return [Grammar::Token::Nonterminal]
17
17
  attr_reader :left
18
18
 
19
19
  # The right-hand side of the rule.
20
20
  #
21
- # @return [Array<Ace::Token>]
21
+ # @return [Array<Grammar::Token>]
22
22
  attr_reader :right
23
23
 
24
24
  # The current position inside of the rule.
@@ -28,7 +28,7 @@ module Antelope
28
28
 
29
29
  # The block to be executed on production match.
30
30
  #
31
- # @deprecated Use {Ace::Production#block} instead.
31
+ # @deprecated Use {Grammar::Production#block} instead.
32
32
  # @return [String]
33
33
  attr_reader :block
34
34
 
@@ -47,19 +47,19 @@ module Antelope
47
47
 
48
48
  # The precedence for this rule.
49
49
  #
50
- # @return [Ace::Precedence]
50
+ # @return [Grammar::Precedence]
51
51
  attr_accessor :precedence
52
52
 
53
53
  # The associated production.
54
54
  #
55
- # @return [Ace::Production]
55
+ # @return [Grammar::Production]
56
56
  attr_reader :production
57
57
 
58
58
  include Comparable
59
59
 
60
60
  # Initialize the rule.
61
61
  #
62
- # @param production [Ace::Production] the production
62
+ # @param production [Grammar::Production] the production
63
63
  # that this rule is based off of.
64
64
  # @param position [Numeric] the position that this rule is in
65
65
  # the production.
@@ -71,7 +71,7 @@ module Antelope
71
71
  @precedence = production.prec
72
72
  @production = production
73
73
  @block = production.block
74
- @id = "%10x" % object_id
74
+ @id = format('%10x', object_id)
75
75
 
76
76
  if inherited
77
77
  @left, @right = inherited
@@ -85,7 +85,7 @@ module Antelope
85
85
  # @return [String]
86
86
  def inspect
87
87
  "#<#{self.class} id=#{id} left=#{left} " \
88
- "right=[#{right.join(" ")}] position=#{position}>"
88
+ "right=[#{right.join(' ')}] position=#{position}>"
89
89
  end
90
90
 
91
91
  # Give a nicer representation of the rule as a string. Shows
@@ -97,16 +97,16 @@ module Antelope
97
97
  # @return [String]
98
98
  def to_s(dot = true)
99
99
  "#{id}/#{precedence.type.to_s[0]}#{precedence.level}: " \
100
- "#{left} → #{right[0, position].join(" ")}" \
101
- "#{"" if dot}#{right[position..-1].join(" ")}"
100
+ "#{left} → #{right[0, position].join(' ')}" \
101
+ "#{'' if dot}#{right[position..-1].join(' ')}"
102
102
  end
103
103
 
104
104
  # Returns the active token. If there is no active token, it
105
- # returns a blank {Ace::Token}.
105
+ # returns a blank {Grammar::Token}.
106
106
  #
107
- # @return [Ace::Token]
107
+ # @return [Grammar::Token]
108
108
  def active
109
- right[position] or Ace::Token.new(nil)
109
+ right[position] || Grammar::Token.new(nil)
110
110
  end
111
111
 
112
112
  # Creates the rule after this one by incrementing the position
@@ -174,9 +174,9 @@ module Antelope
174
174
  # @return [Numeric]
175
175
  def ===(other)
176
176
  if other.is_a? Rule
177
- left === other.left and right.size == other.right.size and
178
- right.each_with_index.
179
- all? { |e, i| e === other.right[i] }
177
+ left === other.left && right.size == other.right.size &&
178
+ right.each_with_index
179
+ .all? { |e, i| e === other.right[i] }
180
180
  else
181
181
  super
182
182
  end
@@ -206,7 +206,7 @@ module Antelope
206
206
  # @note This is not intended for use. It is only defined to
207
207
  # make equality checking easier, and to create a hash.
208
208
  # @private
209
- # @return [Array<(Ace::Token::Nonterminal, Array<Ace::Token>, Numeric)>]
209
+ # @return [Array<(Grammar::Token::Nonterminal, Array<Grammar::Token>, Numeric)>]
210
210
  def to_a
211
211
  @_array ||= [left, right, position]
212
212
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
- require "forwardable"
4
- require "securerandom"
3
+ require 'forwardable'
4
+ require 'securerandom'
5
5
 
6
6
  module Antelope
7
7
  module Generation
@@ -37,7 +37,7 @@ module Antelope
37
37
  def initialize
38
38
  @rules = Set.new
39
39
  @transitions = {}
40
- @id = "%10x" % object_id
40
+ @id = format('%10x', object_id)
41
41
  end
42
42
 
43
43
  # Gives a nice string representation of the state.
@@ -45,8 +45,8 @@ module Antelope
45
45
  # @return [String]
46
46
  def inspect
47
47
  "#<#{self.class} id=#{id} " \
48
- "transitions=[#{transitions.keys.join(", ")}] " \
49
- "rules=[{#{rules.to_a.join("} {")}}]>"
48
+ "transitions=[#{transitions.keys.join(', ')}] " \
49
+ "rules=[{#{rules.to_a.join('} {')}}]>"
50
50
  end
51
51
 
52
52
  # Merges another state with this state. It copies all of the
@@ -61,7 +61,7 @@ module Antelope
61
61
  "got #{other.class}" unless other.is_a? State
62
62
 
63
63
  self << other
64
- self.transitions.merge! other.transitions
64
+ transitions.merge! other.transitions
65
65
 
66
66
  self
67
67
  end
@@ -90,7 +90,7 @@ module Antelope
90
90
  when State
91
91
  rule.rules.map(&:clone).each { |r| self << r }
92
92
  when Rule
93
- rules << rule #unless rules.include? rule
93
+ rules << rule
94
94
  when Array, Set
95
95
  rule.each do |part|
96
96
  self << part
@@ -120,10 +120,9 @@ module Antelope
120
120
  other_rules = other.rules.to_a
121
121
  other.transitions == transitions &&
122
122
  rules.size == other_rules.size &&
123
- rules.each_with_index.
124
- all? { |rule, i| rule === other_rules[i] }
123
+ rules.each_with_index
124
+ .all? { |rule, i| rule === other_rules[i] }
125
125
  end
126
-
127
126
  end
128
127
  end
129
128
  end
@@ -1,16 +1,14 @@
1
1
  # encoding: utf-8
2
2
 
3
- require "antelope/generation/recognizer/rule"
4
- require "antelope/generation/recognizer/state"
3
+ require 'antelope/generation/recognizer/rule'
4
+ require 'antelope/generation/recognizer/state'
5
5
 
6
6
  module Antelope
7
7
  module Generation
8
-
9
8
  # Recognizes all of the states in the grammar.
10
9
  #
11
10
  # @see http://redjazz96.tumblr.com/post/88446352960
12
11
  class Recognizer
13
-
14
12
  # A list of all of the states in the grammar.
15
13
  #
16
14
  # @return [Set<State>]
@@ -24,12 +22,12 @@ module Antelope
24
22
 
25
23
  # The grammar that the recognizer is running off of.
26
24
  #
27
- # @return [Ace::Grammar]
25
+ # @return [Grammar]
28
26
  attr_reader :grammar
29
27
 
30
28
  # Initialize the recognizer.
31
29
  #
32
- # @param grammar [Ace::Grammar]
30
+ # @param grammar [Grammar]
33
31
  def initialize(grammar)
34
32
  @grammar = grammar
35
33
  @states = Set.new
@@ -102,7 +100,7 @@ module Antelope
102
100
  # @return [void]
103
101
  def compute_closure(state)
104
102
  fixed_point(state.rules) do
105
- state.rules.select { |_| _.active.nonterminal? }.each do |rule|
103
+ state.rules.select { |r| r.active.nonterminal? }.each do |rule|
106
104
  grammar.productions[rule.active.name].each do |prod|
107
105
  state << Rule.new(prod, 0)
108
106
  end
@@ -115,9 +113,9 @@ module Antelope
115
113
 
116
114
  actives.each do |active|
117
115
  next if state.transitions[active.name]
118
- rules = state.rules.
119
- select { |r| r.active == active && r.succ? }.
120
- map(&:succ).to_set
116
+ rules = state.rules
117
+ .select { |r| r.active == active && r.succ? }
118
+ .map(&:succ).to_set
121
119
  s = states.find { |st| rules.subset? st.rules } || begin
122
120
  s = State.new << rules
123
121
  compute_closure(s)
@@ -174,7 +172,6 @@ module Antelope
174
172
  added = enum.size - added
175
173
  end
176
174
  end
177
-
178
175
  end
179
176
  end
180
177
  end
@@ -8,7 +8,7 @@ module Antelope
8
8
 
9
9
  # The grammar that the table is based off of.
10
10
  #
11
- # @return [Ace::Grammar]
11
+ # @return [Grammar]
12
12
  attr_accessor :grammar
13
13
 
14
14
  # The table itself.
@@ -25,7 +25,7 @@ module Antelope
25
25
 
26
26
  # Initialize.
27
27
  #
28
- # @param grammar [Ace::Grammar]
28
+ # @param grammar [Grammar]
29
29
  def initialize(grammar)
30
30
  @grammar = grammar
31
31
  end
@@ -118,15 +118,15 @@ module Antelope
118
118
  end
119
119
 
120
120
  def coerce_nested_hash(key, value)
121
- parts = key.split('.').map { |p| p.gsub(/-/, "_") }
121
+ parts = key.split('.').map { |p| p.gsub(/-/, '_') }
122
122
  top = {}
123
123
  hash = top
124
- parts.each_with_index do |part, i|
124
+ parts.each_with_index do |part, _|
125
125
  hash[part] = if parts.last == part
126
- value
127
- else
128
- {}
129
- end
126
+ value
127
+ else
128
+ {}
129
+ end
130
130
  hash = hash[part]
131
131
  end
132
132
 
@@ -162,7 +162,7 @@ module Antelope
162
162
  # otherwise, if the first argument isn't "false", return
163
163
  # true.
164
164
 
165
- values[0].to_s != "false"
165
+ values[0].to_s != 'false'
166
166
  when Array
167
167
  values.zip(type).map do |value, t|
168
168
  coerce_directive_value(defined, [value], t)
@@ -71,7 +71,7 @@ module Antelope
71
71
  # @return [void]
72
72
  def generate
73
73
  template "ruby", "#{file}.rb" do |body|
74
- sprintf(grammar.compiler.body, :write => body)
74
+ sprintf(grammar.compiler.body, write: body)
75
75
  end
76
76
  end
77
77
  end