rley 0.5.13 → 0.5.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/examples/general/left.rb +3 -1
- data/examples/general/right.rb +3 -1
- data/lib/rley/constants.rb +1 -1
- data/lib/rley/gfg/edge.rb +2 -2
- data/lib/rley/parser/parse_tree_builder.rb +1 -1
- data/lib/rley/sppf/alternative_node.rb +8 -6
- data/lib/rley/sppf/composite_node.rb +11 -1
- data/lib/rley/sppf/epsilon_node.rb +2 -5
- data/lib/rley/sppf/leaf_node.rb +10 -1
- data/lib/rley/sppf/non_terminal_node.rb +8 -2
- data/lib/rley/sppf/sppf_node.rb +8 -4
- data/lib/rley/sppf/token_node.rb +9 -7
- data/spec/rley/sppf/token_node_spec.rb +46 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 331a505963faf201ef03664616805ce831a591e0
|
4
|
+
data.tar.gz: 1e80b03ca806612f72fa97db13dd49b1cc55e218
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e070d60d75abd4beace97c65d938a7bc4e81e1c9c4bc0c4d3f0b1bba4acd13662e3196f83113bfd5def31992d2df85367dc6a3fb6ab367480e6e1d51d9d6d98d
|
7
|
+
data.tar.gz: 3816e3675513be5608d731fba3b37e9c08b41ced276403182790dcb8d38235cd88c7908b8a3540bf2c5afc87fec84e3340a1b61f9caf55fa095e9b4f6092774d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
### 0.5.14 / 2018-XX-XX
|
2
|
+
* [NEW] Files spec/rley/sppf/token_node_spec.rb` Added RSpec file for testing `SPPF::TokenNode` class.
|
3
|
+
* [CHANGE] Files `lib/rley/sppf` Minor update in the YARD documentation of the SPPF node classes.
|
4
|
+
* [FIX] Method `Parser::CSTRawNode#initialize`. Yard warning because of duplicate parameter names in documentation.
|
5
|
+
* [FIX] Method `GFG::Edge#initialize`. Yard warning because parameter names were missing in documentation.
|
6
|
+
|
1
7
|
### 0.5.13 / 2018-02-09
|
2
8
|
* [CHANGE] File `examples/general/SRL/grammar.rb added names to each production rule.
|
3
9
|
* [CHANGE] File `examples/general/SRL/ast_builder.rb Code refactoring to take profit of rule naming.
|
@@ -24,7 +30,7 @@
|
|
24
30
|
* [CHANGE] File `examples/general/SRL/grammar.rb increased coverage of Simple Regex Language parser.
|
25
31
|
* [CHANGE] File `examples/general/SRL/ast_builder.rb Added transformation rules for constructing regular expressions.
|
26
32
|
* [CHANGE] File `examples/general/SRL/spac/integration_spec.rb Added tests for SRL expressions.
|
27
|
-
* [FIX] Added an custom `inspect` method to
|
33
|
+
* [FIX] Added an custom `inspect` method to several core classes. This was necessary because default implementation from Ruby got lost with object graphs.
|
28
34
|
|
29
35
|
### 0.5.10 / 2017-12-02
|
30
36
|
* [CHANGE] Dir `examples/general/SRL/ Added support for digit range to Simple Regex Language parser.
|
data/examples/general/left.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Purpose: define a grammar with left-recursive rule
|
2
2
|
require 'rley' # Load Rley library
|
3
3
|
|
4
|
-
# Instantiate a builder object that will build the grammar for us
|
4
|
+
# Instantiate a builder object that will build the grammar for us.
|
5
5
|
builder = Rley::Syntax::GrammarBuilder.new do
|
6
|
+
# The grammar defines a language that consists in a sequence
|
7
|
+
# of 0 or more dots...
|
6
8
|
add_terminals('DOT')
|
7
9
|
|
8
10
|
# Grammar with left recursive rule.
|
data/examples/general/right.rb
CHANGED
@@ -3,9 +3,11 @@ require 'rley' # Load Rley library
|
|
3
3
|
|
4
4
|
# Instantiate a builder object that will build the grammar for us
|
5
5
|
builder = Rley::Syntax::GrammarBuilder.new do
|
6
|
+
# The grammar defines a language that consists in a sequence
|
7
|
+
# of 0 or more dots...
|
6
8
|
add_terminals('DOT')
|
7
9
|
|
8
|
-
# Grammar with
|
10
|
+
# Grammar with right recursive rule.
|
9
11
|
rule 'r_dots' => []
|
10
12
|
rule 'r_dots' => %w[DOT r_dots]
|
11
13
|
end
|
data/lib/rley/constants.rb
CHANGED
data/lib/rley/gfg/edge.rb
CHANGED
@@ -8,8 +8,8 @@ module Rley # This module is used as a namespace
|
|
8
8
|
attr_reader :successor
|
9
9
|
|
10
10
|
# Construct a directed edge between two given vertices
|
11
|
-
# @param [Vertex]
|
12
|
-
# @param [Vertex]
|
11
|
+
# @param thePredecessor [Vertex]
|
12
|
+
# @param theSuccessor [Vertex]
|
13
13
|
def initialize(thePredecessor, theSuccessor)
|
14
14
|
@successor = theSuccessor
|
15
15
|
thePredecessor.add_edge(self)
|
@@ -13,7 +13,7 @@ module Rley # This module is used as a namespace
|
|
13
13
|
# Structure used internally by ParseTreeBuilder class.
|
14
14
|
CSTRawNode = Struct.new(:range, :symbol, :children) do
|
15
15
|
# Constructor.
|
16
|
-
# @param
|
16
|
+
# @param aRange [Lexical::TokenRange] The token position range.
|
17
17
|
# @param aSymbol [Syntax::Symbol] A symbol from grammar.
|
18
18
|
def initialize(aRange, aSymbol)
|
19
19
|
super
|
@@ -5,16 +5,17 @@ module Rley # This module is used as a namespace
|
|
5
5
|
# A node in a parse forest that is a child
|
6
6
|
# of a parent node with :or refinement
|
7
7
|
class AlternativeNode < CompositeNode
|
8
|
-
# GFG vertex label
|
8
|
+
# @return [String] GFG vertex label
|
9
9
|
attr_reader(:label)
|
10
10
|
|
11
|
-
# Link to lhs symbol
|
11
|
+
# @return [Syntax::NonTerminal] Link to lhs symbol
|
12
12
|
attr_reader(:symbol)
|
13
13
|
|
14
|
-
# @param aVertex [ItemVertex]
|
15
|
-
#
|
16
|
-
# consideration.
|
17
|
-
# @param aRange [TokenRange]
|
14
|
+
# @param aVertex [GFG::ItemVertex]
|
15
|
+
# A GFG vertex that corresponds to a dotted item
|
16
|
+
# with the dot at the end) for the alternative under consideration.
|
17
|
+
# @param aRange [Lexical::TokenRange]
|
18
|
+
# A range of token indices corresponding to this node.
|
18
19
|
def initialize(aVertex, aRange)
|
19
20
|
super(aRange)
|
20
21
|
@label = aVertex.label
|
@@ -23,6 +24,7 @@ module Rley # This module is used as a namespace
|
|
23
24
|
|
24
25
|
# Emit a (formatted) string representation of the node.
|
25
26
|
# Mainly used for diagnosis/debugging purposes.
|
27
|
+
# @return [String]
|
26
28
|
def to_string(indentation)
|
27
29
|
return "Alt(#{label})#{range.to_string(indentation)}"
|
28
30
|
end
|
@@ -5,18 +5,28 @@ module Rley # This module is used as a namespace
|
|
5
5
|
# Abstract class. The generalization for nodes that have
|
6
6
|
# children node(s).
|
7
7
|
class CompositeNode < SPPFNode
|
8
|
-
# Array
|
8
|
+
# @return [Array<SPFFNode>] Sub-nodes (children).
|
9
9
|
attr_reader(:subnodes)
|
10
10
|
|
11
|
+
# Constructor
|
12
|
+
# @param aRange [Lexical::TokenRange]
|
11
13
|
def initialize(aRange)
|
12
14
|
super(aRange)
|
13
15
|
@subnodes = []
|
14
16
|
end
|
15
17
|
|
18
|
+
# Add a sub-node (child) to this one.
|
19
|
+
# @param aSubnode [SPPFNode]
|
16
20
|
def add_subnode(aSubnode)
|
17
21
|
subnodes.unshift(aSubnode)
|
18
22
|
end
|
23
|
+
|
24
|
+
# @return [String] a text representation of the node.
|
25
|
+
def inspect()
|
26
|
+
key
|
27
|
+
end
|
19
28
|
|
29
|
+
# @return [String]
|
20
30
|
def key()
|
21
31
|
@key ||= to_string(0)
|
22
32
|
end
|
@@ -5,7 +5,7 @@ module Rley # This module is used as a namespace
|
|
5
5
|
# A leaf node in a parse forest that matches an empty
|
6
6
|
# string from the input
|
7
7
|
class EpsilonNode < LeafNode
|
8
|
-
# aPosition is the position of the token in the input stream.
|
8
|
+
# aPosition [Integer] is the position of the token in the input stream.
|
9
9
|
def initialize(aPosition)
|
10
10
|
range = { low: aPosition, high: aPosition }
|
11
11
|
super(range)
|
@@ -13,13 +13,10 @@ module Rley # This module is used as a namespace
|
|
13
13
|
|
14
14
|
# Emit a (formatted) string representation of the node.
|
15
15
|
# Mainly used for diagnosis/debugging purposes.
|
16
|
+
# @return [String]
|
16
17
|
def to_string(indentation)
|
17
18
|
return "_#{range.to_string(indentation)}"
|
18
19
|
end
|
19
|
-
|
20
|
-
def key()
|
21
|
-
@key ||= to_string(0)
|
22
|
-
end
|
23
20
|
end # class
|
24
21
|
end # module
|
25
22
|
end # module
|
data/lib/rley/sppf/leaf_node.rb
CHANGED
@@ -2,9 +2,18 @@ require_relative 'sppf_node'
|
|
2
2
|
|
3
3
|
module Rley # This module is used as a namespace
|
4
4
|
module SPPF # This module is used as a namespace
|
5
|
-
# Abstract class. The generalization for nodes that don't have
|
5
|
+
# Abstract class. The generalization for SPPF nodes that don't have
|
6
6
|
# child node.
|
7
7
|
class LeafNode < SPPFNode
|
8
|
+
# @return [String] a text representation of the node.
|
9
|
+
def inspect()
|
10
|
+
key
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [String]
|
14
|
+
def key()
|
15
|
+
@key ||= to_string(0)
|
16
|
+
end
|
8
17
|
end # class
|
9
18
|
end # module
|
10
19
|
end # module
|
@@ -3,21 +3,26 @@ require_relative 'composite_node'
|
|
3
3
|
module Rley # This module is used as a namespace
|
4
4
|
module SPPF # This module is used as a namespace
|
5
5
|
# A node in a parse forest that matches exactly one
|
6
|
-
# non-terminal symbol
|
6
|
+
# non-terminal symbol.
|
7
7
|
class NonTerminalNode < CompositeNode
|
8
|
-
# Link to the non-terminal symbol
|
8
|
+
# @return [Syntax::NonTerminal] Link to the non-terminal symbol
|
9
9
|
attr_reader(:symbol)
|
10
10
|
|
11
11
|
# Indication on how the sub-nodes contribute to the 'success'
|
12
12
|
# of parent node. Possible values: :and, :or
|
13
13
|
attr_accessor :refinement
|
14
14
|
|
15
|
+
# Constructor
|
16
|
+
# @param aNonTerminal [Syntax::NonTerminal]
|
17
|
+
# @param aRange [Lexical::TokenRange]
|
15
18
|
def initialize(aNonTerminal, aRange)
|
16
19
|
super(aRange)
|
17
20
|
@symbol = aNonTerminal
|
18
21
|
@refinement = :and
|
19
22
|
end
|
20
23
|
|
24
|
+
# Add a sub-node (child) to this one.
|
25
|
+
# @param aSubnode [SPPFNode]
|
21
26
|
def add_subnode(aSubnode)
|
22
27
|
if refinement == :or
|
23
28
|
subnodes << aSubnode
|
@@ -28,6 +33,7 @@ module Rley # This module is used as a namespace
|
|
28
33
|
|
29
34
|
# Emit a (formatted) string representation of the node.
|
30
35
|
# Mainly used for diagnosis/debugging purposes.
|
36
|
+
# @return [String] a text representation of the node.
|
31
37
|
def to_string(indentation)
|
32
38
|
return "#{symbol.name}#{range.to_string(indentation)}"
|
33
39
|
end
|
data/lib/rley/sppf/sppf_node.rb
CHANGED
@@ -3,18 +3,22 @@ require_relative '../lexical/token_range'
|
|
3
3
|
module Rley # This module is used as a namespace
|
4
4
|
module SPPF # This module is used as a namespace
|
5
5
|
# Abstract class. The generalization for all kinds of nodes
|
6
|
-
# occurring in a shared packed parse forest.
|
6
|
+
# occurring in a shared packed parse forest (SPPF).
|
7
7
|
class SPPFNode
|
8
8
|
|
9
|
-
#
|
9
|
+
# @return [Lexical::TokenRange]
|
10
|
+
# A range of token indices corresponding to this node.
|
10
11
|
attr_reader(:range)
|
11
12
|
|
13
|
+
# Constructor
|
14
|
+
# @param aRange [Lexical::TokenRange]
|
12
15
|
def initialize(aRange)
|
13
16
|
@range = Lexical::TokenRange.new(aRange)
|
14
17
|
end
|
15
18
|
|
16
|
-
# Return the origin
|
17
|
-
#
|
19
|
+
# Return the origin, that is, the index of the
|
20
|
+
# first token matched by this node.
|
21
|
+
# @return [Integer]
|
18
22
|
def origin()
|
19
23
|
return range.low
|
20
24
|
end
|
data/lib/rley/sppf/token_node.rb
CHANGED
@@ -2,12 +2,16 @@ require_relative 'leaf_node'
|
|
2
2
|
|
3
3
|
module Rley # This module is used as a namespace
|
4
4
|
module SPPF # This module is used as a namespace
|
5
|
-
# A node
|
6
|
-
# token from the input
|
5
|
+
# A SPPF node that matches exactly one
|
6
|
+
# token from the input.
|
7
7
|
class TokenNode < LeafNode
|
8
|
+
# @return [Lexical::Token]
|
9
|
+
# The input token that is represented by this parse node.
|
8
10
|
attr_reader(:token)
|
9
11
|
|
10
|
-
#
|
12
|
+
# Constructor
|
13
|
+
# @param aToken [Lexical::Token] input token represented by this node.
|
14
|
+
# @param aPosition [Integer] index of the token in the input stream.
|
11
15
|
def initialize(aToken, aPosition)
|
12
16
|
range = { low: aPosition, high: aPosition + 1 }
|
13
17
|
super(range)
|
@@ -16,13 +20,11 @@ module Rley # This module is used as a namespace
|
|
16
20
|
|
17
21
|
# Emit a (formatted) string representation of the node.
|
18
22
|
# Mainly used for diagnosis/debugging purposes.
|
23
|
+
# @param indentation [Integer]
|
24
|
+
# @return [String]
|
19
25
|
def to_string(indentation)
|
20
26
|
return "#{token.terminal.name}#{range.to_string(indentation)}"
|
21
27
|
end
|
22
|
-
|
23
|
-
def key()
|
24
|
-
@key ||= to_string(0)
|
25
|
-
end
|
26
28
|
end # class
|
27
29
|
end # module
|
28
30
|
end # module
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require_relative '../../spec_helper'
|
3
|
+
|
4
|
+
require_relative '../../../lib/rley/syntax/terminal'
|
5
|
+
require_relative '../../../lib/rley/lexical/token_range'
|
6
|
+
require_relative '../../../lib/rley/lexical/token'
|
7
|
+
|
8
|
+
# Load the class under test
|
9
|
+
require_relative '../../../lib/rley/sppf/token_node'
|
10
|
+
|
11
|
+
module Rley # Open this namespace to avoid module qualifier prefixes
|
12
|
+
module SPPF # Open this namespace to avoid module qualifier prefixes
|
13
|
+
describe TokenNode do
|
14
|
+
let(:sample_symbol) { Syntax::Terminal.new('Noun') }
|
15
|
+
let(:sample_token) { Lexical::Token.new('language', sample_symbol) }
|
16
|
+
let(:sample_position) { 3 }
|
17
|
+
|
18
|
+
subject { TokenNode.new(sample_token, sample_position) }
|
19
|
+
|
20
|
+
context 'Initialization:' do
|
21
|
+
it 'should know its token' do
|
22
|
+
expect(subject.token).to eq(sample_token)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should know its token range' do
|
26
|
+
expect(subject.origin).to eq(sample_position)
|
27
|
+
expect(subject.range.low).to eq(sample_position)
|
28
|
+
expect(subject.range.high).to eq(sample_position + 1)
|
29
|
+
end
|
30
|
+
end # context
|
31
|
+
|
32
|
+
context 'Provided services:' do
|
33
|
+
it 'should know its string representation' do
|
34
|
+
expect(subject.to_string(0)).to eq('Noun[3, 4]')
|
35
|
+
expect(subject.inspect).to eq('Noun[3, 4]')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return a key value of itself' do
|
39
|
+
expect(subject.key).to eq('Noun[3, 4]')
|
40
|
+
end
|
41
|
+
end # context
|
42
|
+
end # describe
|
43
|
+
end # module
|
44
|
+
end # module
|
45
|
+
|
46
|
+
# End of file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rley
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
@@ -304,6 +304,7 @@ files:
|
|
304
304
|
- spec/rley/ptree/terminal_node_spec.rb
|
305
305
|
- spec/rley/sppf/alternative_node_spec.rb
|
306
306
|
- spec/rley/sppf/non_terminal_node_spec.rb
|
307
|
+
- spec/rley/sppf/token_node_spec.rb
|
307
308
|
- spec/rley/support/ambiguous_grammar_helper.rb
|
308
309
|
- spec/rley/support/expectation_helper.rb
|
309
310
|
- spec/rley/support/grammar_abc_helper.rb
|
@@ -398,6 +399,7 @@ test_files:
|
|
398
399
|
- spec/rley/ptree/terminal_node_spec.rb
|
399
400
|
- spec/rley/sppf/alternative_node_spec.rb
|
400
401
|
- spec/rley/sppf/non_terminal_node_spec.rb
|
402
|
+
- spec/rley/sppf/token_node_spec.rb
|
401
403
|
- spec/rley/syntax/grammar_builder_spec.rb
|
402
404
|
- spec/rley/syntax/grammar_spec.rb
|
403
405
|
- spec/rley/syntax/grm_symbol_spec.rb
|