rley 0.1.04 → 0.1.05

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDA0YWZhMTI1Mzk3NDdlMTkyNTlmNzQ1ZDEzYzAwNWYxMzM3NjQwZA==
4
+ OTUxODY4MDAzOWE1NjFkYzc5NGFjYzNhZWIxMTRjMmY5NzA4Zjg3Yw==
5
5
  data.tar.gz: !binary |-
6
- YzU1N2ZkZDQ2ZjRkMTVjZTc5YjE1NTViOGQ5NTgzNGM2YWExZDQxNg==
6
+ ZTRlN2M4ZjUyZDE2MTVkMzBlODdjNjdkZWFjMzk5NjI0ZDI1MjNkZA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NjBjYWQ5MDk4NmMwMjlhNjEzOWI5ZWY2MzIwMmFiZDk2MTBmMWQ5YzBlOGZi
10
- MjZhNDU1OWZmZWY0YjA4NjAyMmM5NDM4ZTA3ZTdmYTdmNTc3MjQ1YzQzNzZl
11
- ZDk1M2RjNjQ1MDQ5NTViZTQ3NjY1OTVkZmRjZTVkNmVhMzU2ZjI=
9
+ MWE4NTFmODdjMjk3YTU0NjY5YTFmMmI3ZjRmYzNjMDdlYjYwN2FkOTE1YTc3
10
+ ZmE1YjY2MTAwNGIwZTcyMThiOTQ5MjVjZWIzZDM4NTE3YzA4NWY5ZTMyM2Y2
11
+ YTQ0YTdkZWE2YjVmYzA3MDE5MjJjNmM1YzE0YzUyMDY0NjBlNDc=
12
12
  data.tar.gz: !binary |-
13
- ODExMjQ0NmUwMGQ2YmY1ZTY5NzZhOGQ4MGFmZmUxN2YwY2ZiN2I4MzY1ZDli
14
- NTVhNmQ0YzI3MDA0NTE2N2Q2YjY4OTc2NzRlOTNiM2Q5ZTViMDE2ZmY5NTIx
15
- Y2UyNTNmZDViNTFhOWQzM2E5OWQyOTYxY2ZmMzBmMTQ2ZDViZDI=
13
+ YTFiMTNkZWVjYjVjYzNiMzg4N2E0ZDY0MWFkYWY5OWE0NGI1YjUyYTlkMjRj
14
+ YTU2NWM0ZDIwYTE2YWU2MmVjOTg2OTRhZTU0Njk1YjNmNTA0NjVjNDIzNDI2
15
+ NDkyMzBiYTc2MWI1ZmVhYTcyMjVkNzVjNTVjMTlmZjMyOTU5YjI=
@@ -1,3 +1,7 @@
1
+ ### 0.1.05 / 2014-12-10
2
+ * [NEW] New parse tree formatting classes `BaseFormatter` and `Debug`
3
+ * [CHANGE] Method `Parsing#parse_tree` now add links to Token objects in TerminalNodes.
4
+
1
5
  ### 0.1.04 / 2014-12-08
2
6
  * [CHANGE] File `parse_tree_visitor_spec.rb`. Added step-by-step test of a parse tree visit.
3
7
 
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Rley # Module used as a namespace
5
5
  # The version number of the gem.
6
- Version = '0.1.04'
6
+ Version = '0.1.05'
7
7
 
8
8
  # Brief description of the gem.
9
9
  Description = "Ruby implementation of the Earley's parsing algorithm"
@@ -0,0 +1,33 @@
1
+ module Rley # This module is used as a namespace
2
+
3
+ # Namespace dedicated to parse tree formatters.
4
+ module Formatter
5
+
6
+ # Superclass for parse tree formatters.
7
+ class BaseFormatter
8
+ # The IO output stream in which the formatter's result will be sent.
9
+ attr(:output)
10
+
11
+ # Constructor.
12
+ # @param anIO [IO] an output IO where the formatter's result will
13
+ # be placed.
14
+ def initialize(anIO)
15
+ @output = anIO
16
+ end
17
+
18
+ public
19
+
20
+ # Given a parse tree visitor, perform the visit
21
+ # and render the visit events in the output stream.
22
+ # @param aVisitor [ParseTreeVisitor]
23
+ def render(aVisitor)
24
+ aVisitor.subscribe(self)
25
+ aVisitor.start
26
+ aVisitor.unsubscribe(self)
27
+ end
28
+
29
+ end # class
30
+ end # module
31
+ end # module
32
+
33
+ # End of file
@@ -0,0 +1,121 @@
1
+ require_relative 'base_formatter'
2
+
3
+
4
+ module Rley # This module is used as a namespace
5
+ # Namespace dedicated to parse tree formatters.
6
+ module Formatter
7
+
8
+ # A formatter class that renders the visit notification events
9
+ # from a parse tree visitor
10
+ # @example
11
+ # some_grammar = ... # Points to a DynamicGrammar-like object
12
+ # # Output the result to the standard console output
13
+ # formatter = Sequitur::Formatter::Debug.new(STDOUT)
14
+ # # Render the visit notifications
15
+ # formatter.run(some_grammar.visitor)
16
+ class Debug < BaseFormatter
17
+ # Current indentation level
18
+ attr(:indentation)
19
+
20
+ # Constructor.
21
+ # @param anIO [IO] The output stream to which the rendered grammar
22
+ # is written.
23
+ def initialize(anIO)
24
+ super(anIO)
25
+ @indentation = 0
26
+ end
27
+
28
+ public
29
+
30
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
31
+ # Notification of a visit event: the visitor is about to visit the given
32
+ # parse tree
33
+ # @param _ptree [ParseTree]
34
+ def before_ptree(_ptree)
35
+ output_event(__method__, indentation)
36
+ indent
37
+ end
38
+
39
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
40
+ # Notification of a visit event: the visitor is about to visit
41
+ # a non-terminal node
42
+ # @param _nonterm [NonTerminalNode]
43
+ def before_non_terminal(_nonterm)
44
+ output_event(__method__, indentation)
45
+ indent
46
+ end
47
+
48
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
49
+ # Notification of a visit event: the visitor is about to visit
50
+ # the children of a non-terminal node
51
+ # @param _parent [NonTerminalNode]
52
+ # @param _children [Array] array of children nodes
53
+ def before_children(_parent, _children)
54
+ output_event(__method__, indentation)
55
+ indent
56
+ end
57
+
58
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
59
+ # Notification of a visit event: the visitor is about to visit
60
+ # a terminal node
61
+ # @param _term [TerminalNode]
62
+ def before_terminal(_term)
63
+ output_event(__method__, indentation)
64
+ end
65
+
66
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
67
+ # Notification of a visit event: the visitor completed the visit of
68
+ # a terminal node.
69
+ # @param _term [TerminalNode]
70
+ def after_terminal(_term)
71
+ output_event(__method__, indentation)
72
+ end
73
+
74
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
75
+ # Notification of a visit event: the visitor completed the visit of
76
+ # a non-terminal node
77
+ # @param _nonterm [NonTerminalNode]
78
+ def after_non_terminal(_)
79
+ dedent
80
+ output_event(__method__, indentation)
81
+ end
82
+
83
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
84
+ # Notification of a visit event: the visitor completed the visit of
85
+ # the children of a non-terminal node.
86
+ # @param _parent [NonTerminalNode]
87
+ # @param _children [Array] array of children nodes
88
+ def after_children(_parent, _children)
89
+ dedent
90
+ output_event(__method__, indentation)
91
+ end
92
+
93
+
94
+ # Method called by a ParseTreeVisitor to which the formatter subscribed.
95
+ # Notification of a visit event: the visitor completed the visit
96
+ # of the given parse tree
97
+ # @param _ptree [ParseTree]
98
+ def after_ptree(_ptree)
99
+ dedent
100
+ output_event(__method__, indentation)
101
+ end
102
+
103
+ private
104
+
105
+ def indent()
106
+ @indentation += 1
107
+ end
108
+
109
+ def dedent()
110
+ @indentation -= 1
111
+ end
112
+
113
+ def output_event(anEvent, indentationLevel)
114
+ output.puts "#{' ' * 2 * indentationLevel}#{anEvent}"
115
+ end
116
+
117
+ end # class
118
+ end # module
119
+ end # module
120
+
121
+ # End of file
@@ -42,7 +42,9 @@ module Rley # This module is used as a namespace
42
42
  when Syntax::Terminal
43
43
  state_set_index -= 1
44
44
  ptree.step_back(state_set_index)
45
- #ptree.current_node.token = tokens[state_set_index]
45
+ if ptree.current_node.is_a?(PTree::TerminalNode)
46
+ ptree.current_node.token = tokens[state_set_index]
47
+ end
46
48
  parse_state = chart[state_set_index].predecessor_state(parse_state)
47
49
  curr_dotted_item = parse_state.dotted_rule
48
50
 
@@ -147,6 +149,11 @@ module Rley # This module is used as a namespace
147
149
  candidate_states = last_chart_entry.states_for(start_production)
148
150
  return candidate_states.find(&:complete?)
149
151
  end
152
+
153
+ # Complete the generated parse tree.
154
+ # Link each terminal node to its corresponding token object.
155
+ def complete_ptree()
156
+ end
150
157
  end # class
151
158
  end # module
152
159
  end # module
@@ -0,0 +1,120 @@
1
+ require_relative '../../spec_helper'
2
+ require 'stringio'
3
+
4
+ # require_relative '../../../lib/rley/dynamic_grammar'
5
+ require_relative '../support/grammar_abc_helper'
6
+ require_relative '../../../lib/rley/parser/token'
7
+ require_relative '../../../lib/rley/parser/earley_parser'
8
+ require_relative '../../../lib/rley/ptree/parse_tree'
9
+ require_relative '../../../lib/rley/parse_tree_visitor'
10
+ # Load the class under test
11
+ require_relative '../../../lib/rley/formatter/debug'
12
+
13
+ module Rley # Re-open the module to get rid of qualified names
14
+ module Formatter
15
+
16
+ describe Debug do
17
+ include GrammarABCHelper # Mix-in module with builder for grammar abc
18
+
19
+ # Factory method. Build a production with the given sequence
20
+ # of symbols as its rhs.
21
+ let(:grammar_abc) do
22
+ builder = grammar_abc_builder
23
+ builder.grammar
24
+ end
25
+
26
+ # Variables for the terminal symbols
27
+ let(:a_) { grammar_abc.name2symbol['a'] }
28
+ let(:b_) { grammar_abc.name2symbol['b'] }
29
+ let(:c_) { grammar_abc.name2symbol['c'] }
30
+
31
+ # Helper method that mimicks the output of a tokenizer
32
+ # for the language specified by gramma_abc
33
+ let(:grm_abc_tokens1) do
34
+ [
35
+ Parser::Token.new('a', a_),
36
+ Parser::Token.new('a', a_),
37
+ Parser::Token.new('b', b_),
38
+ Parser::Token.new('c', c_),
39
+ Parser::Token.new('c', c_)
40
+ ]
41
+ end
42
+
43
+ # Factory method that builds a sample parse tree.
44
+ # Generated tree has the following structure:
45
+ # S[0,5]
46
+ # +- A[0,5]
47
+ # +- a[0,0]
48
+ # +- A[1,4]
49
+ # | +- a[1,1]
50
+ # | +- A[2,3]
51
+ # | | +- b[2,3]
52
+ # | +- c[3,4]
53
+ # +- c[4,5]
54
+ # Capital letters represent non-terminal nodes
55
+ let(:grm_abc_ptree1) do
56
+ parser = Parser::EarleyParser.new(grammar_abc)
57
+ parse_result = parser.parse(grm_abc_tokens1)
58
+ parse_result.parse_tree
59
+ end
60
+
61
+ let(:destination) { StringIO.new('', 'w') }
62
+
63
+ context 'Standard creation & initialization:' do
64
+
65
+ it 'should be initialized with an IO argument' do
66
+ expect { Debug.new(StringIO.new('', 'w')) }.not_to raise_error
67
+ end
68
+
69
+ it 'should know its output destination' do
70
+ instance = Debug.new(destination)
71
+ expect(instance.output).to eq(destination)
72
+ end
73
+ end # context
74
+
75
+
76
+
77
+ context 'Formatting events:' do
78
+ it 'should support visit events of a parse tree' do
79
+ instance = Debug.new(destination)
80
+ visitor = Rley::ParseTreeVisitor.new(grm_abc_ptree1)
81
+ instance.render(visitor)
82
+ expectations = <<-SNIPPET
83
+ before_ptree
84
+ before_non_terminal
85
+ before_children
86
+ before_non_terminal
87
+ before_children
88
+ before_terminal
89
+ after_terminal
90
+ before_non_terminal
91
+ before_children
92
+ before_terminal
93
+ after_terminal
94
+ before_non_terminal
95
+ before_children
96
+ before_terminal
97
+ after_terminal
98
+ after_children
99
+ after_non_terminal
100
+ before_terminal
101
+ after_terminal
102
+ after_children
103
+ after_non_terminal
104
+ before_terminal
105
+ after_terminal
106
+ after_children
107
+ after_non_terminal
108
+ after_children
109
+ after_non_terminal
110
+ after_ptree
111
+ SNIPPET
112
+ expect(destination.string).to eq(expectations)
113
+ end
114
+ end # context
115
+ end # describe
116
+
117
+ end # module
118
+ end # module
119
+
120
+ # End of file
@@ -1,6 +1,7 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
- require_relative '../../lib/rley/syntax/grammar_builder'
3
+
4
+ require_relative './support/grammar_abc_helper'
4
5
  require_relative '../../lib/rley/parser/token'
5
6
  require_relative '../../lib/rley/parser/earley_parser'
6
7
  # Load the class under test
@@ -8,12 +9,10 @@ require_relative '../../lib/rley/parse_tree_visitor'
8
9
 
9
10
  module Rley # Open this namespace to avoid module qualifier prefixes
10
11
  describe ParseTreeVisitor do
12
+ include GrammarABCHelper # Mix-in module with builder for grammar abc
13
+
11
14
  let(:grammar_abc) do
12
- builder = Syntax::GrammarBuilder.new
13
- builder.add_terminals('a', 'b', 'c')
14
- builder.add_production('S' => ['A'])
15
- builder.add_production('A' => %w(a A c))
16
- builder.add_production('A' => ['b'])
15
+ builder = grammar_abc_builder
17
16
  builder.grammar
18
17
  end
19
18
 
@@ -0,0 +1,19 @@
1
+ # Load the builder class
2
+ require_relative '../../../lib/rley/syntax/grammar_builder'
3
+
4
+
5
+ module GrammarABCHelper
6
+
7
+ # Factory method. Creates a grammar builder for a simple grammar.
8
+ # (based on example in N. Wirth "Compiler Construction" book, p. 6)
9
+ def grammar_abc_builder()
10
+ builder = Rley::Syntax::GrammarBuilder.new
11
+ builder.add_terminals('a', 'b', 'c')
12
+ builder.add_production('S' => ['A'])
13
+ builder.add_production('A' => %w(a A c))
14
+ builder.add_production('A' => ['b'])
15
+
16
+ return builder
17
+ end
18
+ end # module
19
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rley
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.04
4
+ version: 0.1.05
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-08 00:00:00.000000000 Z
11
+ date: 2014-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -89,6 +89,8 @@ files:
89
89
  - examples/grammars/grammar_L0.rb
90
90
  - lib/rley.rb
91
91
  - lib/rley/constants.rb
92
+ - lib/rley/formatter/base_formatter.rb
93
+ - lib/rley/formatter/debug.rb
92
94
  - lib/rley/parser/chart.rb
93
95
  - lib/rley/parser/dotted_item.rb
94
96
  - lib/rley/parser/earley_parser.rb
@@ -111,6 +113,7 @@ files:
111
113
  - lib/rley/syntax/symbol_seq.rb
112
114
  - lib/rley/syntax/terminal.rb
113
115
  - lib/rley/syntax/verbatim_symbol.rb
116
+ - spec/rley/formatter/debug_spec.rb
114
117
  - spec/rley/parser/chart_spec.rb
115
118
  - spec/rley/parser/dotted_item_spec.rb
116
119
  - spec/rley/parser/earley_parser_spec.rb
@@ -123,6 +126,7 @@ files:
123
126
  - spec/rley/ptree/parse_tree_node_spec.rb
124
127
  - spec/rley/ptree/parse_tree_spec.rb
125
128
  - spec/rley/ptree/token_range_spec.rb
129
+ - spec/rley/support/grammar_abc_helper.rb
126
130
  - spec/rley/syntax/grammar_builder_spec.rb
127
131
  - spec/rley/syntax/grammar_spec.rb
128
132
  - spec/rley/syntax/grm_symbol_spec.rb
@@ -165,6 +169,7 @@ signing_key:
165
169
  specification_version: 4
166
170
  summary: Ruby implementation of the Earley's parsing algorithm
167
171
  test_files:
172
+ - spec/rley/formatter/debug_spec.rb
168
173
  - spec/rley/parser/chart_spec.rb
169
174
  - spec/rley/parser/dotted_item_spec.rb
170
175
  - spec/rley/parser/earley_parser_spec.rb