rley 0.7.06 → 0.8.01

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.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +362 -62
  3. data/.travis.yml +6 -6
  4. data/CHANGELOG.md +20 -4
  5. data/LICENSE.txt +1 -1
  6. data/README.md +7 -7
  7. data/examples/NLP/engtagger.rb +193 -190
  8. data/examples/NLP/nano_eng/nano_en_demo.rb +7 -11
  9. data/examples/NLP/nano_eng/nano_grammar.rb +21 -21
  10. data/examples/NLP/pico_en_demo.rb +2 -2
  11. data/examples/data_formats/JSON/cli_options.rb +1 -1
  12. data/examples/data_formats/JSON/json_ast_builder.rb +21 -27
  13. data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
  14. data/examples/data_formats/JSON/json_demo.rb +1 -2
  15. data/examples/data_formats/JSON/json_grammar.rb +13 -13
  16. data/examples/data_formats/JSON/json_lexer.rb +8 -8
  17. data/examples/data_formats/JSON/json_minifier.rb +1 -1
  18. data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
  19. data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
  20. data/examples/general/calc_iter1/calc_grammar.rb +7 -6
  21. data/examples/general/calc_iter1/calc_lexer.rb +6 -4
  22. data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
  23. data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
  24. data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
  25. data/examples/general/calc_iter2/calc_grammar.rb +12 -12
  26. data/examples/general/calc_iter2/calc_lexer.rb +11 -10
  27. data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
  28. data/examples/general/left.rb +2 -2
  29. data/examples/general/right.rb +2 -2
  30. data/lib/rley.rb +1 -1
  31. data/lib/rley/base/dotted_item.rb +28 -31
  32. data/lib/rley/base/grm_items_builder.rb +6 -0
  33. data/lib/rley/constants.rb +2 -2
  34. data/lib/rley/engine.rb +22 -25
  35. data/lib/rley/formatter/asciitree.rb +3 -3
  36. data/lib/rley/formatter/bracket_notation.rb +1 -8
  37. data/lib/rley/formatter/debug.rb +6 -6
  38. data/lib/rley/formatter/json.rb +2 -2
  39. data/lib/rley/gfg/call_edge.rb +1 -1
  40. data/lib/rley/gfg/edge.rb +5 -5
  41. data/lib/rley/gfg/end_vertex.rb +2 -6
  42. data/lib/rley/gfg/epsilon_edge.rb +1 -5
  43. data/lib/rley/gfg/grm_flow_graph.rb +27 -23
  44. data/lib/rley/gfg/item_vertex.rb +10 -10
  45. data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
  46. data/lib/rley/gfg/scan_edge.rb +1 -1
  47. data/lib/rley/gfg/shortcut_edge.rb +2 -2
  48. data/lib/rley/gfg/start_vertex.rb +4 -8
  49. data/lib/rley/gfg/vertex.rb +43 -39
  50. data/lib/rley/interface.rb +16 -0
  51. data/lib/rley/lexical/token_range.rb +6 -6
  52. data/lib/rley/notation/all_notation_nodes.rb +2 -0
  53. data/lib/rley/notation/ast_builder.rb +191 -0
  54. data/lib/rley/notation/ast_node.rb +44 -0
  55. data/lib/rley/notation/ast_visitor.rb +113 -0
  56. data/lib/rley/notation/grammar.rb +49 -0
  57. data/lib/rley/notation/grammar_builder.rb +504 -0
  58. data/lib/rley/notation/grouping_node.rb +23 -0
  59. data/lib/rley/notation/parser.rb +56 -0
  60. data/lib/rley/notation/sequence_node.rb +35 -0
  61. data/lib/rley/notation/symbol_node.rb +29 -0
  62. data/lib/rley/notation/tokenizer.rb +192 -0
  63. data/lib/rley/parse_forest_visitor.rb +5 -5
  64. data/lib/rley/parse_rep/ast_base_builder.rb +48 -11
  65. data/lib/rley/parse_rep/cst_builder.rb +5 -6
  66. data/lib/rley/parse_rep/parse_forest_builder.rb +22 -18
  67. data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
  68. data/lib/rley/parse_rep/parse_rep_creator.rb +14 -16
  69. data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
  70. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
  71. data/lib/rley/parse_tree_visitor.rb +1 -1
  72. data/lib/rley/parser/error_reason.rb +4 -5
  73. data/lib/rley/parser/gfg_chart.rb +118 -26
  74. data/lib/rley/parser/gfg_parsing.rb +22 -33
  75. data/lib/rley/parser/parse_entry.rb +25 -31
  76. data/lib/rley/parser/parse_entry_set.rb +19 -16
  77. data/lib/rley/parser/parse_entry_tracker.rb +4 -4
  78. data/lib/rley/parser/parse_tracer.rb +13 -13
  79. data/lib/rley/parser/parse_walker_factory.rb +23 -28
  80. data/lib/rley/ptree/non_terminal_node.rb +7 -5
  81. data/lib/rley/ptree/parse_tree.rb +3 -3
  82. data/lib/rley/ptree/parse_tree_node.rb +5 -5
  83. data/lib/rley/ptree/terminal_node.rb +7 -7
  84. data/lib/rley/rley_error.rb +12 -12
  85. data/lib/rley/sppf/alternative_node.rb +6 -6
  86. data/lib/rley/sppf/composite_node.rb +7 -7
  87. data/lib/rley/sppf/epsilon_node.rb +3 -3
  88. data/lib/rley/sppf/leaf_node.rb +3 -3
  89. data/lib/rley/sppf/parse_forest.rb +16 -16
  90. data/lib/rley/sppf/sppf_node.rb +7 -8
  91. data/lib/rley/sppf/token_node.rb +3 -3
  92. data/lib/rley/syntax/{grammar_builder.rb → base_grammar_builder.rb} +61 -23
  93. data/lib/rley/syntax/grammar.rb +5 -5
  94. data/lib/rley/syntax/grm_symbol.rb +7 -7
  95. data/lib/rley/syntax/match_closest.rb +43 -0
  96. data/lib/rley/syntax/non_terminal.rb +9 -15
  97. data/lib/rley/syntax/production.rb +16 -10
  98. data/lib/rley/syntax/symbol_seq.rb +7 -9
  99. data/lib/rley/syntax/terminal.rb +4 -5
  100. data/lib/rley/syntax/verbatim_symbol.rb +3 -3
  101. data/lib/support/base_tokenizer.rb +19 -18
  102. data/spec/rley/base/dotted_item_spec.rb +2 -2
  103. data/spec/rley/engine_spec.rb +23 -21
  104. data/spec/rley/formatter/asciitree_spec.rb +7 -7
  105. data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
  106. data/spec/rley/formatter/json_spec.rb +1 -1
  107. data/spec/rley/gfg/end_vertex_spec.rb +5 -5
  108. data/spec/rley/gfg/grm_flow_graph_spec.rb +2 -2
  109. data/spec/rley/gfg/item_vertex_spec.rb +10 -10
  110. data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
  111. data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
  112. data/spec/rley/gfg/start_vertex_spec.rb +5 -5
  113. data/spec/rley/gfg/vertex_spec.rb +3 -3
  114. data/spec/rley/lexical/token_range_spec.rb +16 -16
  115. data/spec/rley/lexical/token_spec.rb +2 -2
  116. data/spec/rley/notation/grammar_builder_spec.rb +302 -0
  117. data/spec/rley/notation/parser_spec.rb +184 -0
  118. data/spec/rley/notation/tokenizer_spec.rb +370 -0
  119. data/spec/rley/parse_forest_visitor_spec.rb +165 -163
  120. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
  121. data/spec/rley/parse_rep/ast_builder_spec.rb +6 -7
  122. data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
  123. data/spec/rley/parse_rep/groucho_spec.rb +24 -26
  124. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +27 -27
  125. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +8 -8
  126. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +3 -3
  127. data/spec/rley/parse_tree_visitor_spec.rb +10 -8
  128. data/spec/rley/parser/dangling_else_spec.rb +445 -0
  129. data/spec/rley/parser/error_reason_spec.rb +6 -6
  130. data/spec/rley/parser/gfg_earley_parser_spec.rb +120 -12
  131. data/spec/rley/parser/gfg_parsing_spec.rb +6 -13
  132. data/spec/rley/parser/parse_entry_spec.rb +19 -19
  133. data/spec/rley/parser/parse_walker_factory_spec.rb +10 -10
  134. data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
  135. data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
  136. data/spec/rley/ptree/terminal_node_spec.rb +6 -6
  137. data/spec/rley/sppf/alternative_node_spec.rb +6 -6
  138. data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
  139. data/spec/rley/sppf/token_node_spec.rb +4 -4
  140. data/spec/rley/support/ambiguous_grammar_helper.rb +4 -5
  141. data/spec/rley/support/grammar_abc_helper.rb +3 -5
  142. data/spec/rley/support/grammar_ambig01_helper.rb +5 -6
  143. data/spec/rley/support/grammar_arr_int_helper.rb +5 -6
  144. data/spec/rley/support/grammar_b_expr_helper.rb +5 -6
  145. data/spec/rley/support/grammar_int_seq_helper.rb +51 -0
  146. data/spec/rley/support/grammar_l0_helper.rb +14 -17
  147. data/spec/rley/support/grammar_pb_helper.rb +8 -7
  148. data/spec/rley/support/grammar_sppf_helper.rb +3 -3
  149. data/spec/rley/syntax/{grammar_builder_spec.rb → base_grammar_builder_spec.rb} +35 -16
  150. data/spec/rley/syntax/grammar_spec.rb +6 -6
  151. data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
  152. data/spec/rley/syntax/match_closest_spec.rb +46 -0
  153. data/spec/rley/syntax/non_terminal_spec.rb +8 -8
  154. data/spec/rley/syntax/production_spec.rb +17 -13
  155. data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
  156. data/spec/rley/syntax/terminal_spec.rb +5 -5
  157. data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
  158. data/spec/spec_helper.rb +0 -12
  159. data/spec/support/base_tokenizer_spec.rb +7 -2
  160. metadata +48 -74
  161. data/.simplecov +0 -7
  162. data/lib/rley/parser/parse_state.rb +0 -83
  163. data/lib/rley/parser/parse_state_tracker.rb +0 -59
  164. data/lib/rley/parser/state_set.rb +0 -101
  165. data/spec/rley/parser/parse_state_spec.rb +0 -125
  166. data/spec/rley/parser/parse_tracer_spec.rb +0 -200
  167. data/spec/rley/parser/state_set_spec.rb +0 -130
@@ -24,20 +24,16 @@ engine.build_grammar do
24
24
 
25
25
  # Here we define the productions (= grammar rules)
26
26
  rule 'Start' => 'S'
27
- rule 'S' => %w[NP VP]
28
- rule 'S' => %w[Aux NP VP]
27
+ rule 'S' => 'Aux? NP VP'
29
28
  rule 'S' => 'VP'
30
29
  rule 'NP' => 'Pronoun'
31
30
  rule 'NP' => 'Proper-Noun'
32
- rule 'NP' => %w[Determiner Nominal]
33
- rule 'Nominal' => %w[Noun]
34
- rule 'Nominal' => %w[Nominal Noun]
35
- rule 'VP' => 'Verb'
36
- rule 'VP' => %w[Verb NP]
37
- rule 'VP' => %w[Verb NP PP]
38
- rule 'VP' => %w[Verb PP]
39
- rule 'VP' => %w[VP PP]
40
- rule 'PP' => %w[Preposition NP]
31
+ rule 'NP' => 'Determiner Nominal'
32
+ rule 'Nominal' => 'Nominal? Noun'
33
+ rule 'VP' => 'Verb PP?'
34
+ rule 'VP' => 'Verb NP PP?'
35
+ rule 'VP' => 'VP PP'
36
+ rule 'PP' => 'Preposition NP'
41
37
  end
42
38
 
43
39
  ########################################
@@ -11,8 +11,8 @@ require 'rley' # Load the gem
11
11
  # based on chapter 12 from Jurafski & Martin book.
12
12
  # Daniel Jurafsky,‎ James H. Martin: "Speech and Language Processing";
13
13
  # 2009, Pearson Education, Inc., ISBN 978-0135041963
14
- # It defines the syntax of a sentence in a mini English-like language
15
- builder = Rley::Syntax::GrammarBuilder.new do
14
+ # It defines the syntax of a sentence in a mini English-like language
15
+ builder = Rley::grammar_builder do
16
16
  add_terminals('Pronoun', 'Proper-Noun')
17
17
  add_terminals('Determiner', 'Noun')
18
18
  add_terminals('Cardinal_number', 'Ordinal_number', 'Quant')
@@ -21,39 +21,39 @@ builder = Rley::Syntax::GrammarBuilder.new do
21
21
 
22
22
  rule 'language' => 'sentence'
23
23
  rule 'sentence' => 'declarative'
24
- rule 'sentence' => 'imperative'
24
+ rule 'sentence' => 'imperative'
25
25
  rule 'sentence' => 'yes_no_question'
26
26
  rule 'sentence' => 'wh_subject_question'
27
27
  rule 'sentence' => 'wh_non_subject_question'
28
- rule 'declarative' => %w[NP VP]
28
+ rule 'declarative' => 'NP VP'
29
29
  rule 'imperative' => 'VP'
30
- rule 'yes_no_question' => %w[Aux NP VP]
31
- rule 'wh_subject_question' => %w[Wh_NP NP VP]
32
- rule 'wh_non_subject_question' => %w[Wh_NP Aux NP VP]
33
- rule 'NP' => %w[Predeterminer NP]
30
+ rule 'yes_no_question' => 'Aux NP VP'
31
+ rule 'wh_subject_question' => 'Wh_NP NP VP'
32
+ rule 'wh_non_subject_question' => 'Wh_NP Aux NP VP'
33
+ rule 'NP' => 'Predeterminer NP'
34
34
  rule 'NP' => 'Pronoun'
35
35
  rule 'NP' => 'Proper-Noun'
36
- rule 'NP' => %w[Det Card Ord Quant Nominal]
36
+ rule 'NP' => 'Det Card Ord Quant Nominal'
37
37
  rule 'VP' => 'Verb'
38
- rule 'VP' => %w[Verb NP]
39
- rule 'VP' => %w[Verb NP PP]
40
- rule 'VP' => %w[Verb PP]
38
+ rule 'VP' => 'Verb NP'
39
+ rule 'VP' => 'Verb NP PP'
40
+ rule 'VP' => 'Verb PP'
41
41
  rule 'Det' => 'Determiner'
42
42
  rule 'Det' => []
43
43
  rule 'Card' => 'Cardinal_number'
44
44
  rule 'Card' => []
45
45
  rule 'Ord' => 'Ordinal_number'
46
- rule 'Ord' => []
46
+ rule 'Ord' => []
47
47
  rule 'Nominal' => 'Noun'
48
- rule 'Nominal' => %w[Nominal Noun]
49
- rule 'Nominal' => %w[Nominal GerundVP]
50
- rule 'Nominal' => %w[Nominal RelClause]
51
- rule 'PP' => %w[Preposition NP]
48
+ rule 'Nominal' => 'Nominal Noun'
49
+ rule 'Nominal' => 'Nominal GerundVP'
50
+ rule 'Nominal' => 'Nominal RelClause'
51
+ rule 'PP' => 'Preposition NP'
52
52
  rule 'GerundVP' => 'GerundV'
53
- rule 'GerundVP' => %w[GerundV NP]
54
- rule 'GerundVP' => %w[GerundV NP PP]
55
- rule 'GerundVP' => %w[GerundV PP]
56
- rule 'RelClause' => %w[Relative_pronoun VP]
53
+ rule 'GerundVP' => 'GerundV NP'
54
+ rule 'GerundVP' => 'GerundV NP PP'
55
+ rule 'GerundVP' => 'GerundV PP'
56
+ rule 'RelClause' => 'Relative_pronoun VP'
57
57
  end
58
58
 
59
59
  # And now build the grammar...
@@ -26,8 +26,8 @@ engine.build_grammar do
26
26
  rule 'S' => 'NP VP'
27
27
  rule 'NP' => 'Proper-Noun'
28
28
  rule 'NP' => 'Determiner Noun'
29
- rule 'NP' => 'Determiner Noun PP'
30
- rule 'VP' => 'Verb NP'
29
+ rule 'NP' => 'Determiner Noun PP'
30
+ rule 'VP' => 'Verb NP'
31
31
  rule 'VP' => 'Verb NP PP'
32
32
  rule 'PP' => 'Preposition NP'
33
33
  end
@@ -55,7 +55,7 @@ END_TEXT
55
55
 
56
56
  rep_help = <<-END_TEXT
57
57
  Set the parse tree representation (default: cst)
58
- cst Concrete Syntax Tree. The out-of-the-box parse tree
58
+ cst Concrete Syntax Tree. The out-of-the-box parse tree
59
59
  representation.
60
60
  ast Abstract Syntaxt Tree. A customized parse tree for JSON.
61
61
  It is a more compact and practical representation.
@@ -9,7 +9,7 @@ require_relative 'json_ast_nodes'
9
9
  # The Builder pattern creates a complex object
10
10
  # (say, a parse tree) from simpler objects (terminal and non-terminal
11
11
  # nodes) and using a step by step approach.
12
- class JSONASTBuilder < Rley::ParseRep::ASTBaseBuilder
12
+ class JSONASTBuilder < Rley::ParseRep::ASTBaseBuilder
13
13
  Terminal2NodeClass = {
14
14
  'false' => JSONBooleanNode,
15
15
  'true' => JSONBooleanNode,
@@ -19,35 +19,33 @@ class JSONASTBuilder < Rley::ParseRep::ASTBaseBuilder
19
19
  }.freeze
20
20
 
21
21
  protected
22
-
23
- def terminal2node()
22
+
23
+ def terminal2node
24
24
  Terminal2NodeClass
25
25
  end
26
-
26
+
27
27
  # Default class for representing terminal nodes.
28
28
  # @return [Class]
29
- def terminalnode_class()
29
+ def terminalnode_class
30
30
  JSONTerminalNode
31
31
  end
32
-
32
+
33
+ # rubocop: disable Naming/VariableNumber
34
+
35
+ # rule 'JSON_text' => 'value'
33
36
  def reduce_JSON_text_0(_aProd, aRange, theTokens, theChildren)
34
37
  return_first_child(aRange, theTokens, theChildren)
35
38
  end
36
-
37
- # rule 'object' => %w[begin-object member-list end-object]
39
+
40
+ # rule 'object' => 'begin-object member-list? end-object'
38
41
  def reduce_object_0(aProduction, _range, _tokens, theChildren)
39
42
  second_child = theChildren[1]
40
43
  second_child.symbol = aProduction.lhs
41
44
  return second_child
42
45
  end
43
46
 
44
- # rule 'object' => %w[begin-object end-object]
45
- def reduce_object_1(aProduction, _range, _tokens, _children)
46
- return JSONObjectNode.new(aProduction.lhs)
47
- end
48
-
49
- # rule 'member-list' => %w[member-list value-separator member]
50
- def reduce_member_list_0(_range, _tokens, theChildren)
47
+ # rule 'member-list' => 'member-list value-separator member'
48
+ def reduce_member_list_0(_production, _range, _tokens, theChildren)
51
49
  node = theChildren[0]
52
50
  node.members << theChildren.last
53
51
  return node
@@ -60,35 +58,31 @@ class JSONASTBuilder < Rley::ParseRep::ASTBaseBuilder
60
58
  return node
61
59
  end
62
60
 
63
- # rule 'member' => %w[string name-separator value]
61
+ # rule 'member' => 'string name-separator value'
64
62
  def reduce_member_0(aProduction, _range, _tokens, theChildren)
65
63
  return JSONPair.new(theChildren[0], theChildren[2], aProduction.lhs)
66
64
  end
67
65
 
68
- # rule 'array' => %w[begin-array array-items end-array]
66
+ # rule 'array' => 'begin-array array-items? end-array'
69
67
  def reduce_array_0(aProduction, _range, _tokens, theChildren)
70
68
  second_child = theChildren[1]
71
69
  second_child.symbol = aProduction.lhs
72
- return second_child
73
- end
74
-
75
- # rule 'array' => %w[begin-array end-array]
76
- def reduce_array_1(_range, _tokens, _children)
77
- return JSONArrayNode.new
70
+ return second_child
78
71
  end
79
72
 
80
- # rule 'array-items' => %w[array-items value-separator value]
81
- def reduce_array_items_0(_range, _tokens, theChildren)
73
+ # rule 'array-items' => 'array-items value-separator value'
74
+ def reduce_array_items_0(_production, _range, _tokens, theChildren)
82
75
  node = theChildren[0]
83
76
  node.children << theChildren[2]
84
77
  return node
85
78
  end
86
-
87
- # rule 'array-items' => %w[value]
79
+
80
+ # rule 'array-items' => 'value'
88
81
  def reduce_array_items_1(aProduction, _range, _tokens, theChildren)
89
82
  node = JSONArrayNode.new(aProduction.lhs)
90
83
  node.children << theChildren[0]
91
84
  return node
92
85
  end
86
+ # rubocop: enable Naming/VariableNumber
93
87
  end # class
94
88
  # End of file
@@ -16,11 +16,11 @@ JSONTerminalNode = Struct.new(:token, :value, :position) do
16
16
  self.value = aLiteral.dup
17
17
  end
18
18
 
19
- def symbol()
19
+ def symbol
20
20
  token.terminal
21
21
  end
22
22
 
23
- def to_ruby()
23
+ def to_ruby
24
24
  value
25
25
  end
26
26
 
@@ -29,9 +29,9 @@ JSONTerminalNode = Struct.new(:token, :value, :position) do
29
29
  def accept(aVisitor)
30
30
  aVisitor.visit_terminal(self)
31
31
  end
32
-
32
+
33
33
  def done!
34
- # Do nothing
34
+ # Do nothing
35
35
  end
36
36
  end
37
37
 
@@ -77,23 +77,18 @@ class JSONCompositeNode
77
77
  def accept(aVisitor)
78
78
  aVisitor.visit_nonterminal(self)
79
79
  end
80
-
80
+
81
81
  def done!
82
- # Do nothing
82
+ # Do nothing
83
83
  end
84
84
 
85
85
  alias subnodes children
86
86
  end # class
87
87
 
88
-
89
88
  class JSONArrayNode < JSONCompositeNode
90
- def initialize(aSymbol)
91
- super(aSymbol)
92
- end
93
-
94
89
  # Convert this tree node in a simpler Ruby representation.
95
90
  # Basically a JSON object corresponds to a Ruhy Hash
96
- def to_ruby()
91
+ def to_ruby
97
92
  rep = []
98
93
  children.each do |child|
99
94
  rep << child.to_ruby
@@ -114,7 +109,7 @@ class JSONPair
114
109
  @symbol = aSymbol
115
110
  end
116
111
 
117
- def children()
112
+ def children
118
113
  return [name, value]
119
114
  end
120
115
 
@@ -125,27 +120,23 @@ class JSONPair
125
120
  def accept(aVisitor)
126
121
  aVisitor.visit_nonterminal(self)
127
122
  end
128
-
123
+
129
124
  def done!
130
125
  # Do nothing
131
126
  end
132
-
127
+
133
128
  def to_ruby
134
129
  rep = {}
135
130
  rep[name.to_ruby] = value.to_ruby
136
131
 
137
- return rep
132
+ return rep
138
133
  end
139
134
  end # class
140
135
 
141
136
  class JSONObjectNode < JSONCompositeNode
142
- def initialize(aSymbol)
143
- super(aSymbol)
144
- end
145
-
146
137
  # Convert this tree node in a simpler Ruby representation.
147
138
  # Basically a JSON object corresponds to a Ruby Hash
148
- def to_ruby()
139
+ def to_ruby
149
140
  rep = {}
150
141
  members.each do |pair|
151
142
  rep[pair.name.to_ruby] = pair.value.to_ruby
@@ -37,9 +37,8 @@ case cli_options[:format]
37
37
  raise StandardError, msg if tree_rep == :cst
38
38
  end
39
39
 
40
-
41
40
  # Create a Rley facade object
42
- # If necessary, select AST representation
41
+ # If requested, select AST representation
43
42
  engine = Rley::Engine.new do |cfg|
44
43
  builder = tree_rep == :ast ? JSONASTBuilder : nil
45
44
  cfg.repr_builder = builder
@@ -9,30 +9,30 @@ require 'rley' # Load the gem
9
9
  # Original JSON grammar is available at: http://www.json.org/fatfree.html
10
10
  # Official JSON grammar: http://rfc7159.net/rfc7159#rfc.section.2
11
11
  # Names of grammar elements are based on the RFC 7159 documentation
12
- builder = Rley::Syntax::GrammarBuilder.new do
12
+ builder = Rley::grammar_builder do
13
13
  add_terminals('false', 'null', 'true') # Literal names
14
14
  add_terminals('string', 'number')
15
15
  add_terminals('begin-object', 'end-object') # For '{', '}' delimiters
16
16
  add_terminals('begin-array', 'end-array') # For '[', ']' delimiters
17
17
  add_terminals('name-separator', 'value-separator') # For ':', ',' separators
18
+
18
19
  rule 'JSON_text' => 'value'
19
20
  rule 'value' => 'false'
20
21
  rule 'value' => 'null'
21
- rule 'value' => 'true'
22
- rule 'value' => 'object'
22
+ rule 'value' => 'true'
23
23
  rule 'value' => 'array'
24
+ rule 'value' => 'object'
24
25
  rule 'value' => 'number'
25
- rule 'value' => 'string'
26
- rule 'object' => %w[begin-object member-list end-object]
27
- rule 'object' => %w[begin-object end-object]
26
+ rule 'value' => 'string'
27
+ rule 'object' => 'begin-object member_list? end-object'
28
+
28
29
  # Next rule is an example of a left recursive rule
29
- rule 'member-list' => %w[member-list value-separator member]
30
- rule 'member-list' => 'member'
31
- rule 'member' => %w[string name-separator value]
32
- rule 'array' => %w[begin-array array-items end-array]
33
- rule 'array' => %w[begin-array end-array]
34
- rule 'array-items' => %w[array-items value-separator value]
35
- rule 'array-items' => %w[value]
30
+ rule 'member_list' => 'member_list value-separator member'
31
+ rule 'member_list' => 'member'
32
+ rule 'member' => 'string name-separator value'
33
+ rule 'array' => 'begin-array array_items? end-array'
34
+ rule 'array_items' => 'array_items value-separator value'
35
+ rule 'array_items' => 'value'
36
36
  end
37
37
 
38
38
  # And now build the JSON grammar...
@@ -28,19 +28,19 @@ class JSONLexer
28
28
  @line_start = 0
29
29
  end
30
30
 
31
- def tokens()
31
+ def tokens
32
32
  tok_sequence = []
33
33
  until @scanner.eos?
34
34
  token = _next_token
35
35
  tok_sequence << token unless token.nil?
36
36
  end
37
37
 
38
- return tok_sequence
38
+ tok_sequence
39
39
  end
40
40
 
41
41
  private
42
42
 
43
- def _next_token()
43
+ def _next_token
44
44
  token = nil
45
45
  skip_whitespaces
46
46
  curr_ch = scanner.getch # curr_ch is at start of token or eof reached...
@@ -58,7 +58,7 @@ class JSONLexer
58
58
  keyw = scanner.scan(/false|true|null/)
59
59
  if keyw.nil?
60
60
  invalid_keyw = scanner.scan(/\w+/)
61
- raise ScanError.new("Invalid keyword: #{invalid_keyw}")
61
+ raise ScanError, "Invalid keyword: #{invalid_keyw}"
62
62
  else
63
63
  token = build_token(keyw, keyw)
64
64
  end
@@ -68,7 +68,7 @@ class JSONLexer
68
68
  value = scanner.scan(/([^"\\]|\\.)*/)
69
69
  end_delimiter = scanner.getch
70
70
  err_msg = 'No closing quotes (") found'
71
- raise ScanError.new(err_msg) if end_delimiter.nil?
71
+ raise ScanError, err_msg if end_delimiter.nil?
72
72
 
73
73
  token = build_token(value, 'string')
74
74
 
@@ -81,12 +81,12 @@ class JSONLexer
81
81
  erroneous = curr_ch.nil? ? '' : curr_ch
82
82
  sequel = scanner.scan(/.{1,20}/)
83
83
  erroneous += sequel unless sequel.nil?
84
- raise ScanError.new("Unknown token #{erroneous}")
84
+ raise ScanError, "Unknown token #{erroneous}"
85
85
  end # case
86
86
  break unless token.nil? && (curr_ch = scanner.getch)
87
87
  end
88
88
 
89
- return token
89
+ token
90
90
  end
91
91
 
92
92
  def build_token(lexeme, token)
@@ -94,7 +94,7 @@ class JSONLexer
94
94
  Rley::Lexical::Token.new(lexeme, token, pos)
95
95
  end
96
96
 
97
- def skip_whitespaces()
97
+ def skip_whitespaces
98
98
  matched = scanner.scan(/[ \t\f\n\r]+/)
99
99
  return if matched.nil?
100
100
 
@@ -35,7 +35,7 @@ class JSONMinifier
35
35
  lexeme = aTerm.token.lexeme
36
36
  literal = if aTerm.symbol.name == 'string'
37
37
  # String values are delimited by double quotes
38
- '"' + lexeme + '"'
38
+ "\"#{lexeme}\""
39
39
  else
40
40
  lexeme
41
41
  end
@@ -15,8 +15,8 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
15
15
  }.freeze
16
16
 
17
17
  protected
18
-
19
- def terminal2node()
18
+
19
+ def terminal2node
20
20
  Terminal2NodeClass
21
21
  end
22
22
 
@@ -26,7 +26,9 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
26
26
  operator_node.children << theChildren[2]
27
27
  return operator_node
28
28
  end
29
-
29
+
30
+ # rubocop: disable Naming/VariableNumber
31
+
30
32
  # rule 'expression' => 'simple_expression'
31
33
  def reduce_expression_0(_production, aRange, theTokens, theChildren)
32
34
  return_first_child(aRange, theTokens, theChildren)
@@ -35,32 +37,32 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
35
37
  # rule 'simple_expression' => 'term'
36
38
  def reduce_simple_expression_0(_production, aRange, theTokens, theChildren)
37
39
  return_first_child(aRange, theTokens, theChildren)
38
- end
40
+ end
39
41
 
40
42
  # rule 'simple_expression' => %w[simple_expression add_operator term]
41
43
  def reduce_simple_expression_1(_production, _range, _tokens, theChildren)
42
44
  reduce_binary_operator(theChildren)
43
45
  end
44
-
45
- # rule 'term' => 'factor'
46
+
47
+ # rule 'term' => 'factor'
46
48
  def reduce_term_0(_production, aRange, theTokens, theChildren)
47
49
  return_first_child(aRange, theTokens, theChildren)
48
- end
50
+ end
49
51
 
50
52
  # rule 'term' => %w[term mul_operator factor]
51
53
  def reduce_term_1(_production, _range, _tokens, theChildren)
52
54
  reduce_binary_operator(theChildren)
53
55
  end
54
-
56
+
55
57
  # rule 'factor' => 'NUMBER'
56
58
  def reduce_factor_0(_aProd, aRange, theTokens, theChildren)
57
59
  return_first_child(aRange, theTokens, theChildren)
58
60
  end
59
-
61
+
60
62
  # # rule 'factor' => %w[LPAREN expression RPAREN]
61
63
  def reduce_factor_1(_aProd, aRange, theTokens, theChildren)
62
64
  return_second_child(aRange, theTokens, theChildren)
63
- end
65
+ end
64
66
 
65
67
  # rule 'add_operator' => 'PLUS'
66
68
  def reduce_add_operator_0(_production, _range, _tokens, theChildren)
@@ -81,5 +83,6 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
81
83
  def reduce_mul_operator_1(_production, _range, _tokens, theChildren)
82
84
  return CalcDivideNode.new(theChildren[0].symbol)
83
85
  end
86
+ # rubocop: enable Naming/VariableNumber
84
87
  end # class
85
88
  # End of file