rley 0.7.07 → 0.7.08

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +348 -54
  3. data/LICENSE.txt +1 -1
  4. data/README.md +3 -2
  5. data/examples/NLP/engtagger.rb +193 -190
  6. data/examples/NLP/nano_eng/nano_grammar.rb +5 -5
  7. data/examples/data_formats/JSON/cli_options.rb +1 -1
  8. data/examples/data_formats/JSON/json_ast_builder.rb +12 -9
  9. data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
  10. data/examples/data_formats/JSON/json_grammar.rb +2 -2
  11. data/examples/data_formats/JSON/json_lexer.rb +8 -8
  12. data/examples/data_formats/JSON/json_minifier.rb +1 -1
  13. data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
  14. data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
  15. data/examples/general/calc_iter1/calc_grammar.rb +2 -2
  16. data/examples/general/calc_iter1/calc_lexer.rb +6 -4
  17. data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
  18. data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
  19. data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
  20. data/examples/general/calc_iter2/calc_grammar.rb +3 -3
  21. data/examples/general/calc_iter2/calc_lexer.rb +11 -10
  22. data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
  23. data/examples/general/left.rb +2 -2
  24. data/examples/general/right.rb +2 -2
  25. data/lib/rley/base/dotted_item.rb +23 -31
  26. data/lib/rley/constants.rb +2 -2
  27. data/lib/rley/engine.rb +20 -23
  28. data/lib/rley/formatter/asciitree.rb +3 -3
  29. data/lib/rley/formatter/bracket_notation.rb +1 -8
  30. data/lib/rley/formatter/debug.rb +6 -6
  31. data/lib/rley/formatter/json.rb +2 -2
  32. data/lib/rley/gfg/call_edge.rb +1 -1
  33. data/lib/rley/gfg/edge.rb +5 -5
  34. data/lib/rley/gfg/end_vertex.rb +2 -6
  35. data/lib/rley/gfg/epsilon_edge.rb +1 -5
  36. data/lib/rley/gfg/grm_flow_graph.rb +27 -23
  37. data/lib/rley/gfg/item_vertex.rb +10 -10
  38. data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
  39. data/lib/rley/gfg/scan_edge.rb +1 -1
  40. data/lib/rley/gfg/shortcut_edge.rb +2 -2
  41. data/lib/rley/gfg/start_vertex.rb +4 -8
  42. data/lib/rley/gfg/vertex.rb +43 -39
  43. data/lib/rley/lexical/token_range.rb +6 -6
  44. data/lib/rley/parse_forest_visitor.rb +5 -5
  45. data/lib/rley/parse_rep/ast_base_builder.rb +9 -11
  46. data/lib/rley/parse_rep/cst_builder.rb +5 -6
  47. data/lib/rley/parse_rep/parse_forest_builder.rb +20 -18
  48. data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
  49. data/lib/rley/parse_rep/parse_rep_creator.rb +11 -13
  50. data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
  51. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
  52. data/lib/rley/parse_tree_visitor.rb +1 -1
  53. data/lib/rley/parser/error_reason.rb +4 -5
  54. data/lib/rley/parser/gfg_chart.rb +20 -22
  55. data/lib/rley/parser/gfg_parsing.rb +16 -30
  56. data/lib/rley/parser/parse_entry.rb +25 -31
  57. data/lib/rley/parser/parse_entry_set.rb +18 -15
  58. data/lib/rley/parser/parse_entry_tracker.rb +4 -4
  59. data/lib/rley/parser/parse_state.rb +16 -21
  60. data/lib/rley/parser/parse_state_tracker.rb +4 -4
  61. data/lib/rley/parser/parse_tracer.rb +13 -13
  62. data/lib/rley/parser/parse_walker_factory.rb +23 -28
  63. data/lib/rley/parser/state_set.rb +9 -10
  64. data/lib/rley/ptree/non_terminal_node.rb +7 -5
  65. data/lib/rley/ptree/parse_tree.rb +3 -3
  66. data/lib/rley/ptree/parse_tree_node.rb +5 -5
  67. data/lib/rley/ptree/terminal_node.rb +7 -7
  68. data/lib/rley/rley_error.rb +12 -12
  69. data/lib/rley/sppf/alternative_node.rb +6 -6
  70. data/lib/rley/sppf/composite_node.rb +7 -7
  71. data/lib/rley/sppf/epsilon_node.rb +3 -3
  72. data/lib/rley/sppf/leaf_node.rb +3 -3
  73. data/lib/rley/sppf/parse_forest.rb +16 -16
  74. data/lib/rley/sppf/sppf_node.rb +7 -8
  75. data/lib/rley/sppf/token_node.rb +3 -3
  76. data/lib/rley/syntax/grammar.rb +5 -5
  77. data/lib/rley/syntax/grammar_builder.rb +9 -9
  78. data/lib/rley/syntax/grm_symbol.rb +6 -6
  79. data/lib/rley/syntax/non_terminal.rb +9 -15
  80. data/lib/rley/syntax/production.rb +10 -10
  81. data/lib/rley/syntax/symbol_seq.rb +7 -9
  82. data/lib/rley/syntax/terminal.rb +4 -5
  83. data/lib/rley/syntax/verbatim_symbol.rb +3 -3
  84. data/lib/support/base_tokenizer.rb +19 -18
  85. data/spec/rley/base/dotted_item_spec.rb +2 -2
  86. data/spec/rley/engine_spec.rb +17 -15
  87. data/spec/rley/formatter/asciitree_spec.rb +7 -7
  88. data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
  89. data/spec/rley/formatter/json_spec.rb +1 -1
  90. data/spec/rley/gfg/end_vertex_spec.rb +5 -5
  91. data/spec/rley/gfg/item_vertex_spec.rb +10 -10
  92. data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
  93. data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
  94. data/spec/rley/gfg/start_vertex_spec.rb +5 -5
  95. data/spec/rley/gfg/vertex_spec.rb +3 -3
  96. data/spec/rley/lexical/token_range_spec.rb +16 -16
  97. data/spec/rley/lexical/token_spec.rb +2 -2
  98. data/spec/rley/parse_forest_visitor_spec.rb +165 -163
  99. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
  100. data/spec/rley/parse_rep/ast_builder_spec.rb +6 -6
  101. data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
  102. data/spec/rley/parse_rep/groucho_spec.rb +21 -21
  103. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +26 -26
  104. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +6 -6
  105. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +2 -2
  106. data/spec/rley/parse_tree_visitor_spec.rb +10 -8
  107. data/spec/rley/parser/error_reason_spec.rb +6 -6
  108. data/spec/rley/parser/gfg_earley_parser_spec.rb +4 -2
  109. data/spec/rley/parser/gfg_parsing_spec.rb +4 -8
  110. data/spec/rley/parser/parse_entry_spec.rb +19 -19
  111. data/spec/rley/parser/parse_state_spec.rb +5 -5
  112. data/spec/rley/parser/parse_walker_factory_spec.rb +1 -1
  113. data/spec/rley/parser/state_set_spec.rb +22 -22
  114. data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
  115. data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
  116. data/spec/rley/ptree/terminal_node_spec.rb +6 -6
  117. data/spec/rley/sppf/alternative_node_spec.rb +6 -6
  118. data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
  119. data/spec/rley/sppf/token_node_spec.rb +4 -4
  120. data/spec/rley/support/ambiguous_grammar_helper.rb +3 -4
  121. data/spec/rley/support/grammar_abc_helper.rb +2 -4
  122. data/spec/rley/support/grammar_ambig01_helper.rb +4 -5
  123. data/spec/rley/support/grammar_arr_int_helper.rb +4 -5
  124. data/spec/rley/support/grammar_b_expr_helper.rb +4 -5
  125. data/spec/rley/support/grammar_l0_helper.rb +10 -11
  126. data/spec/rley/support/grammar_pb_helper.rb +6 -5
  127. data/spec/rley/support/grammar_sppf_helper.rb +1 -1
  128. data/spec/rley/syntax/grammar_builder_spec.rb +5 -5
  129. data/spec/rley/syntax/grammar_spec.rb +6 -6
  130. data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
  131. data/spec/rley/syntax/non_terminal_spec.rb +8 -8
  132. data/spec/rley/syntax/production_spec.rb +13 -13
  133. data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
  134. data/spec/rley/syntax/terminal_spec.rb +5 -5
  135. data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
  136. data/spec/spec_helper.rb +0 -12
  137. data/spec/support/base_tokenizer_spec.rb +7 -2
  138. metadata +21 -62
  139. data/.simplecov +0 -8
@@ -32,7 +32,7 @@ module Rley # This module is used as a namespace
32
32
  # Returns a string containing a human-readable representation of the
33
33
  # production.
34
34
  # @return [String]
35
- def inspect()
35
+ def inspect
36
36
  result = selfie
37
37
  result << ' @antecedents=['
38
38
  antecedents.each do |antec|
@@ -40,7 +40,7 @@ module Rley # This module is used as a namespace
40
40
  end
41
41
  result << ']>'
42
42
 
43
- return result
43
+ result
44
44
  end
45
45
 
46
46
  # Add a link to an antecedent parse entry
@@ -53,56 +53,55 @@ module Rley # This module is used as a namespace
53
53
  def ==(other)
54
54
  return true if equal? other
55
55
 
56
- result = (vertex == other.vertex) && (origin == other.origin)
57
- return result
56
+ (vertex == other.vertex) && (origin == other.origin)
58
57
  end
59
-
58
+
60
59
  def hash
61
- @hash ||= "#{vertex.object_id}-#{origin}".hash
60
+ @hash ||= (vertex.oid_str + "-#{origin}").hash
62
61
  end
63
62
 
64
63
  # Returns true iff the vertex is a start vertex (i.e. of the form: .X)
65
- def start_entry?()
66
- return vertex.kind_of?(GFG::StartVertex)
64
+ def start_entry?
65
+ vertex.kind_of?(GFG::StartVertex)
67
66
  end
68
67
 
69
68
  # Returns true iff the vertex is at the start of rhs
70
69
  # (i.e. of the form: X => .Y
71
- def entry_entry?()
70
+ def entry_entry?
72
71
  return false unless vertex.kind_of?(GFG::ItemVertex)
73
72
 
74
- return vertex.dotted_item.at_start?
73
+ vertex.dotted_item.at_start?
75
74
  end
76
75
 
77
76
  # Returns true iff the vertex corresponds to a dotted item
78
77
  # X => Y
79
78
  def dotted_entry?
80
- return vertex.kind_of?(GFG::ItemVertex)
79
+ vertex.kind_of?(GFG::ItemVertex)
81
80
  end
82
81
 
83
82
  # Returns true iff the vertex is at end of rhs (i.e. of the form: X => Y.)
84
- def exit_entry?()
85
- return vertex.complete?
83
+ def exit_entry?
84
+ vertex.complete?
86
85
  end
87
86
 
88
87
  # Returns true iff the vertex is an end vertex (i.e. of the form: X.)
89
- def end_entry?()
90
- return vertex.kind_of?(GFG::EndVertex)
88
+ def end_entry?
89
+ vertex.kind_of?(GFG::EndVertex)
91
90
  end
92
91
 
93
92
  # Return the symbol before the dot (if any)
94
- def prev_symbol()
95
- return vertex.prev_symbol
93
+ def prev_symbol
94
+ vertex.prev_symbol
96
95
  end
97
96
 
98
97
  # Return the symbol after the dot (if any)
99
- def next_symbol()
100
- return vertex.next_symbol
98
+ def next_symbol
99
+ vertex.next_symbol
101
100
  end
102
101
 
103
102
  # Return true if the entry has no antecedent entry
104
- def orphan?()
105
- return antecedents.empty?
103
+ def orphan?
104
+ antecedents.empty?
106
105
  end
107
106
 
108
107
  =begin
@@ -117,11 +116,6 @@ module Rley # This module is used as a namespace
117
116
  return vertex.predicted_item?
118
117
  end
119
118
 
120
- # Next expected symbol in the production
121
- def next_symbol()
122
- return vertex.next_symbol
123
- end
124
-
125
119
  # Does this parse state have the 'other' as successor?
126
120
  def precedes?(other)
127
121
  return false if self == other
@@ -145,21 +139,21 @@ module Rley # This module is used as a namespace
145
139
  # The format of the text representation is
146
140
  # "format of dotted rule" + " | " + origin
147
141
  # @return [String]
148
- def to_s()
149
- return vertex.label + " | #{origin}"
142
+ def to_s
143
+ vertex.label + " | #{origin}"
150
144
  end
151
145
 
152
146
  protected
153
147
 
154
148
  # Returns a human-readable and partial representation of itself.
155
149
  # @return [String]
156
- def selfie()
150
+ def selfie
157
151
  result = +"#<#{self.class.name}:#{object_id}"
158
152
  result << " @vertex=<#{vertex.class.name}:#{vertex.object_id}"
159
153
  result << " label=#{vertex.label}>"
160
154
  result << " @origin=#{origin}"
161
155
 
162
- return result
156
+ result
163
157
  end
164
158
 
165
159
  private
@@ -169,7 +163,7 @@ module Rley # This module is used as a namespace
169
163
  def valid_vertex(aVertex)
170
164
  raise StandardError, 'GFG vertex cannot be nil' if aVertex.nil?
171
165
 
172
- return aVertex
166
+ aVertex
173
167
  end
174
168
  end # class
175
169
  end # module
@@ -16,44 +16,45 @@ module Rley # This module is used as a namespace
16
16
 
17
17
  # @return [Array<ParseEntry>] The array of parse entries
18
18
  attr_reader :entries
19
-
19
+
20
20
  # @return [Hash] A Hash with pairs { hash of ParseEntry => ParseEntry }
21
- attr_reader :membership
21
+ attr_reader :membership
22
22
 
23
23
  # Constructor.
24
- def initialize()
24
+ def initialize
25
25
  @entries = []
26
26
  @membership = {}
27
27
  @entries4term = Hash.new { |hash, key| hash[key] = [] }
28
28
  @entries4n_term = Hash.new { |hash, key| hash[key] = [] }
29
29
  end
30
-
31
- # Returns a string containing a human-readable representation of the
30
+
31
+ # Returns a string containing a human-readable representation of the
32
32
  # set of parse entries.
33
33
  # @return [String]
34
- def inspect()
34
+ def inspect
35
35
  result = +"#<#{self.class.name}:#{object_id}"
36
36
  result << ' @entries=['
37
37
  entries.each { |e| result << e.inspect }
38
38
  result << ']>'
39
- return result
39
+
40
+ result
40
41
  end
41
42
 
42
43
  # Access the entry at given position
43
44
  def [](index)
44
- return entries[index]
45
+ entries[index]
45
46
  end
46
47
 
47
48
  # Returns a Hash with pairs of the form:
48
49
  # terminal symbol => [ parse entry expecting the terminal ]
49
50
  def entries4term(aTerminal)
50
- return @entries4term.fetch(aTerminal, [])
51
+ @entries4term.fetch(aTerminal, [])
51
52
  end
52
53
 
53
54
  # Returns a Hash with pairs of the form:
54
55
  # non terminal symbol => [ parse entry expecting the non-terminal ]
55
56
  def entries4n_term(aNonTerminal)
56
- return @entries4n_term.fetch(aNonTerminal, [])
57
+ @entries4n_term.fetch(aNonTerminal, [])
57
58
  end
58
59
 
59
60
  # Append the given entry (if it isn't yet in the set)
@@ -71,11 +72,11 @@ module Rley # This module is used as a namespace
71
72
  result = anEntry
72
73
  end
73
74
 
74
- return result
75
+ result
75
76
  end
76
77
 
77
78
  # Return an Array of Arrays of ambiguous parse entries.
78
- def ambiguities()
79
+ def ambiguities
79
80
  complete_entries = entries.select(&:exit_entry?)
80
81
  return [] if complete_entries.size <= 1
81
82
 
@@ -90,20 +91,22 @@ module Rley # This module is used as a namespace
90
91
  ambiguous_groups << a_group if a_group.size > 1
91
92
  end
92
93
 
93
- return ambiguous_groups
94
+ ambiguous_groups
94
95
  end
95
96
 
96
97
  # The list of distinct expected terminal symbols. An expected symbol
97
98
  # is on the left of a dot in a parse state of the parse set.
98
- def expected_terminals()
99
+ def expected_terminals
99
100
  return @entries4term.keys
100
101
  end
101
-
102
+
102
103
  def count_edges
104
+ # rubocop: disable Lint/UselessAssignment
103
105
  entries.reduce(0) do |sub_result, entry|
104
106
  sub_result += entry.vertex.edges.size
105
107
  end
106
108
  end
109
+ # rubocop: enable Lint/UselessAssignment
107
110
 
108
111
  private
109
112
 
@@ -40,16 +40,16 @@ module Rley # This module is used as a namespace
40
40
  end
41
41
 
42
42
  # The dotted item for the current parse entry.
43
- def curr_dotted_item()
43
+ def curr_dotted_item
44
44
  parse_entry.dotted_rule
45
45
  end
46
46
 
47
- def symbol_on_left()
48
- return curr_dotted_item.prev_symbol
47
+ def symbol_on_left
48
+ curr_dotted_item.prev_symbol
49
49
  end
50
50
 
51
51
  # Notification that one begins with the previous entry set
52
- def to_prev_entry_set()
52
+ def to_prev_entry_set
53
53
  self.entry_set_index = entry_set_index - 1
54
54
  end
55
55
  end # class
@@ -18,26 +18,24 @@ module Rley # This module is used as a namespace
18
18
  def ==(other)
19
19
  return true if equal?(other)
20
20
 
21
- result = (dotted_rule == other.dotted_rule) &&
22
- (origin == other.origin)
23
-
24
- return result
21
+ (dotted_rule == other.dotted_rule) &&
22
+ (origin == other.origin)
25
23
  end
26
24
 
27
25
  # Returns true if the dot is at the end of the rhs of the production.
28
26
  # In other words, the complete rhs matches the input.
29
- def complete?()
30
- return dotted_rule.reduce_item?
27
+ def complete?
28
+ dotted_rule.reduce_item?
31
29
  end
32
30
 
33
31
  # Returns true if the dot is at the start of the rhs of the production.
34
- def predicted?()
35
- return dotted_rule.predicted_item?
32
+ def predicted?
33
+ dotted_rule.predicted_item?
36
34
  end
37
35
 
38
36
  # Next expected symbol in the production
39
- def next_symbol()
40
- return dotted_rule.next_symbol
37
+ def next_symbol
38
+ dotted_rule.next_symbol
41
39
  end
42
40
 
43
41
  # Does this parse state have the 'other' as successor?
@@ -50,31 +48,28 @@ module Rley # This module is used as a namespace
50
48
  return false unless dotted_rule.production == other_production
51
49
 
52
50
  prev_position = other.dotted_rule.prev_position
53
- result = if prev_position.nil?
54
- false
55
- else
56
- dotted_rule.position == prev_position
57
- end
58
-
59
- return result
51
+ if prev_position.nil?
52
+ false
53
+ else
54
+ dotted_rule.position == prev_position
55
+ end
60
56
  end
61
57
 
62
58
  # Give a String representation of itself.
63
59
  # The format of the text representation is
64
60
  # "format of dotted rule" + " | " + origin
65
61
  # @return [String]
66
- def to_s()
67
- return dotted_rule.to_s + " | #{origin}"
62
+ def to_s
63
+ dotted_rule.to_s + " | #{origin}"
68
64
  end
69
65
 
70
-
71
66
  private
72
67
 
73
68
  # Return the validated dotted item(rule)
74
69
  def valid_dotted_rule(aDottedRule)
75
70
  raise StandardError, 'Dotted item cannot be nil' if aDottedRule.nil?
76
71
 
77
- return aDottedRule
72
+ aDottedRule
78
73
  end
79
74
  end # class
80
75
  end # module
@@ -28,7 +28,7 @@ module Rley # This module is used as a namespace
28
28
  # Write accessor. Set the given parse state as the current one.
29
29
  def parse_state=(aParseState)
30
30
  raise StandardError, 'Nil parse state' if aParseState.nil?
31
-
31
+
32
32
  @parse_state = aParseState
33
33
  processed_states[parse_state] = true
34
34
  end
@@ -40,16 +40,16 @@ module Rley # This module is used as a namespace
40
40
  end
41
41
 
42
42
  # The dotted item for the current parse state.
43
- def curr_dotted_item()
43
+ def curr_dotted_item
44
44
  parse_state.dotted_rule
45
45
  end
46
46
 
47
- def symbol_on_left()
47
+ def symbol_on_left
48
48
  return curr_dotted_item.prev_symbol
49
49
  end
50
50
 
51
51
  # Notification that one begins with the previous state set
52
- def to_prev_state_set()
52
+ def to_prev_state_set
53
53
  self.state_set_index = state_set_index - 1
54
54
  end
55
55
  end # class
@@ -11,9 +11,7 @@ module Rley # This module is used as a namespace
11
11
 
12
12
  # The trace level
13
13
  attr_reader(:level)
14
-
15
14
  attr_reader(:lexemes)
16
-
17
15
  attr_reader(:col_width)
18
16
 
19
17
  def initialize(aTraceLevel, anIO, aTokenSequence)
@@ -36,8 +34,8 @@ module Rley # This module is used as a namespace
36
34
  def trace_scanning(aStatesetIndex, aParseState)
37
35
  return unless level
38
36
 
39
- scan_picture = '[' + '-' * (col_width - 1) + ']'
40
- org = OpenStruct.new(origin: aStatesetIndex - 1,
37
+ scan_picture = "[#{'-' * (col_width - 1)}]"
38
+ org = OpenStruct.new(origin: aStatesetIndex - 1,
41
39
  dotted_rule: aParseState.dotted_rule)
42
40
  trace_diagram(aStatesetIndex, org, scan_picture)
43
41
  end
@@ -47,35 +45,36 @@ module Rley # This module is used as a namespace
47
45
 
48
46
  trace_diagram(aStatesetIndex, aParseState, '>')
49
47
  end
50
-
48
+
51
49
  def trace_completion(aStatesetIndex, aParseState)
52
50
  return unless level
53
51
 
54
- if aStatesetIndex == lexemes.size && aParseState.origin.zero? &&
52
+ if aStatesetIndex == lexemes.size && aParseState.origin.zero? &&
55
53
  aParseState.complete?
56
54
  picture = '=' * (col_width * lexemes.size - 1)
57
55
  else
58
56
  count = col_width * (aStatesetIndex - aParseState.origin) - 1
59
57
  picture = '-' * count
60
58
  end
61
- completion_picture = '[' + picture + (aParseState.complete? ? ']' : '>')
59
+ completion_picture = "[#{picture}#{aParseState.complete? ? ']' : '>'}"
62
60
  trace_diagram(aStatesetIndex, aParseState, completion_picture)
63
61
  end
64
62
 
65
63
  private
66
64
 
67
- def emit_tokens()
65
+ def emit_tokens
68
66
  literals = lexemes.map { |lx| "'#{lx}'" }
69
- print_if 1, '[' + literals.join(', ') + "]\n"
67
+ print_if 1, "[#{literals.join(', ')}]\n"
70
68
  end
71
69
 
72
- def emit_heading()
70
+ def emit_heading
73
71
  longest = lexemes.map(&:length).max
74
72
  @col_width = longest + 3
75
73
  headers = lexemes.map { |l| l.center(col_width - 1, ' ').to_s }
76
- print_if 1, '|.' + headers.join('.') + ".|\n"
74
+ print_if 1, "|.#{headers.join('.')}.|\n"
77
75
  end
78
76
 
77
+ # rubocop: disable Style/StringConcatenation
79
78
  def padding(aStatesetIndex, aParseState, aPicture)
80
79
  l_pad_pattern = '.' + ' ' * (col_width - 1)
81
80
  left_padding = l_pad_pattern * [0, aParseState.origin].max
@@ -83,6 +82,7 @@ module Rley # This module is used as a namespace
83
82
  right_padding = r_pad_pattern * (lexemes.size - aStatesetIndex)
84
83
  return left_padding + aPicture + right_padding
85
84
  end
85
+ # rubocop: enable Style/StringConcatenation
86
86
 
87
87
  def parse_state_str(aStatesetIndex, aParseState)
88
88
  "[#{aParseState.origin}:#{aStatesetIndex}] #{aParseState.dotted_rule}"
@@ -91,10 +91,10 @@ module Rley # This module is used as a namespace
91
91
  def trace_diagram(aStatesetIndex, aParseState, aPicture)
92
92
  diagram = padding(aStatesetIndex, aParseState, aPicture)
93
93
  prefix = '|'
94
- suffix = '| ' + parse_state_str(aStatesetIndex, aParseState)
94
+ suffix = "| #{parse_state_str(aStatesetIndex, aParseState)}"
95
95
  trace = prefix + diagram + suffix
96
96
 
97
- print_if 1, trace + "\n"
97
+ print_if 1, "#{trace}\n"
98
98
  end
99
99
  end # class
100
100
  end # module
@@ -21,16 +21,13 @@ module Rley # This module is used as a namespace
21
21
  # non-terminal symbol => { index(=origin) => start entry }
22
22
  :return_stack, # @return [Array<ParseEntry>] A stack of parse entries
23
23
  :backtrack_points,
24
- :lazy_walk # If true and revisit end vertex then jump to start vertex
25
- )
26
-
24
+ :lazy_walk) # If true and revisit end vertex then jump to start vertex
27
25
 
28
26
  WalkerBacktrackpoint = Struct.new(
29
27
  :entry_set_index, # Sigma set index of current parse entry
30
28
  :return_stack, # A stack of parse entries
31
29
  :visitee, # The parse entry being visited
32
- :antecedent_index
33
- )
30
+ :antecedent_index)
34
31
 
35
32
  # A factory that creates an Enumerator object
36
33
  # that itself walks through a GFGParsing object.
@@ -53,6 +50,7 @@ module Rley # This module is used as a namespace
53
50
  # @param lazyWalk [Boolean] if true then take some shortcut in re-visits.
54
51
  # @return [Enumerator] yields visit events when walking over the
55
52
  # parse result
53
+ # rubocop: disable Style/OptionalBooleanParameter
56
54
  def build_walker(acceptingEntry, maxIndex, lazyWalk = false)
57
55
  msg = 'Internal error: nil entry argument'
58
56
  raise StandardError, msg if acceptingEntry.nil?
@@ -60,7 +58,7 @@ module Rley # This module is used as a namespace
60
58
  # Local context for the enumerator
61
59
  ctx = init_context(acceptingEntry, maxIndex, lazyWalk)
62
60
 
63
- walker = Enumerator.new do |receiver| # 'receiver' is a Yielder
61
+ Enumerator.new do |receiver| # 'receiver' is a Yielder
64
62
  # At this point: current entry == accepting entry
65
63
 
66
64
  loop do
@@ -70,7 +68,7 @@ module Rley # This module is used as a namespace
70
68
  if ctx.curr_entry.orphan? # No antecedent?...
71
69
  msg_prefix = "No antecedent for #{ctx.curr_entry}"
72
70
  msg_suffix = "at rank #{ctx.entry_set_index}"
73
- err_msg = msg_prefix + ' ' + msg_suffix
71
+ err_msg = "#{msg_prefix} #{msg_suffix}"
74
72
  raise StandardError, err_msg unless ctx.curr_entry.start_entry?
75
73
  break if ctx.backtrack_points.empty?
76
74
 
@@ -84,9 +82,8 @@ module Rley # This module is used as a namespace
84
82
  ctx.curr_entry = result.last
85
83
  end
86
84
  end
87
-
88
- return walker
89
85
  end
86
+ # rubocop: enable Style/OptionalBooleanParameter
90
87
 
91
88
  private
92
89
 
@@ -101,12 +98,12 @@ module Rley # This module is used as a namespace
101
98
  context.backtrack_points = []
102
99
  context.lazy_walk = lazyWalk
103
100
 
104
- return context
101
+ context
105
102
  end
106
103
 
107
104
  # Initialize the non-terminal to start entry mapping
108
- def init_nterm2start()
109
- h = Hash.new do |hsh, defval|
105
+ def init_nterm2start
106
+ Hash.new do |hsh, defval|
110
107
  entry, index = defval
111
108
  nonterm = entry.vertex.non_terminal
112
109
  if hsh.include? nonterm
@@ -116,11 +113,10 @@ module Rley # This module is used as a namespace
116
113
  hsh[nonterm] = { index => entry }
117
114
  end
118
115
  end
119
-
120
- return h
121
116
  end
122
117
 
123
118
  # [event, entry, index, vertex]
119
+ # rubocop: disable Lint/DuplicateBranch
124
120
  def visit_entry(anEntry, aContext)
125
121
  index = aContext.entry_set_index
126
122
  aContext.nterm2start[[anEntry, index]] if anEntry.start_entry?
@@ -156,11 +152,12 @@ module Rley # This module is used as a namespace
156
152
  event = [:visit, anEntry, index]
157
153
  end
158
154
 
159
- return event
155
+ event
160
156
  end
157
+ # rubocop: enable Lint/DuplicateBranch
161
158
 
162
159
  def detect_scan_edge(_ctx)
163
- return nil unless aContext.curr_entry.dotted_entry?
160
+ nil unless aContext.curr_entry.dotted_entry?
164
161
  end
165
162
 
166
163
  # Given the current entry from context object
@@ -170,13 +167,11 @@ module Rley # This module is used as a namespace
170
167
  entries = []
171
168
  return entries if aContext.curr_entry.orphan?
172
169
 
173
- entries = if aContext.curr_entry.antecedents.size == 1
174
- antecedent_of(aContext)
175
- else
176
- select_antecedent(aContext)
177
- end
178
-
179
- entries
170
+ if aContext.curr_entry.antecedents.size == 1
171
+ antecedent_of(aContext)
172
+ else
173
+ select_antecedent(aContext)
174
+ end
180
175
  end
181
176
 
182
177
  # Handle the case of an entry having one antecedent only
@@ -205,7 +200,7 @@ module Rley # This module is used as a namespace
205
200
  raise NotImplementedError, "edge is a #{traversed_edge.class}"
206
201
  end
207
202
 
208
- return events
203
+ events
209
204
  end
210
205
 
211
206
  # Handle the case of an entry having multiple antecedents
@@ -231,7 +226,7 @@ module Rley # This module is used as a namespace
231
226
  raise StandardError, 'Internal error'
232
227
  end
233
228
 
234
- return [new_entry]
229
+ [new_entry]
235
230
  end
236
231
 
237
232
  def add_backtrack_point(aContext)
@@ -243,7 +238,7 @@ module Rley # This module is used as a namespace
243
238
  bp.antecedent_index = 0
244
239
  aContext.backtrack_points << bp
245
240
  # puts "Backtrack size after addition #{aContext.backtrack_points.size}"
246
- return bp
241
+ bp
247
242
  end
248
243
 
249
244
  def use_backtrack_point(aContext)
@@ -263,7 +258,7 @@ module Rley # This module is used as a namespace
263
258
  # puts "Backtrack size after backtracking #{aContext.backtrack_points.size}"
264
259
 
265
260
  # Emit a backtrack event
266
- return [:backtrack, bp.visitee, aContext.entry_set_index]
261
+ [:backtrack, bp.visitee, aContext.entry_set_index]
267
262
  end
268
263
 
269
264
  # From the antecedent of the current parse entry
@@ -287,7 +282,7 @@ module Rley # This module is used as a namespace
287
282
  new_entry ||= aContext.curr_entry
288
283
 
289
284
  # puts "Pop from return stack matching entry #{new_entry}"
290
- return new_entry
285
+ new_entry
291
286
  end
292
287
  end # class
293
288
  end # module