rley 0.1.09 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODQ1OTNmNjQ5YjA1NTFkMWU2MjczMDgzYjI1OGMwYjU4MGMzOWU4Mw==
4
+ YzgzNjZlYTc1NjRjYTkxZTNkNmVkNmE3MmY2OGRjNzAwYjBjM2E0MQ==
5
5
  data.tar.gz: !binary |-
6
- NDRhZTcyNDkxZjYxZWIwYzA4YWVlM2Q5NTNkZDAwNGM1MTI2YjdlMQ==
6
+ MmMzNWNiZjRlZDcyOTJiZmE0Nzc4Y2ZjYjBhYmYyM2ZkNTE5MzM5OQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZThlM2MwMGYzYmNlZmU4MzVjM2I3YWQwNTAwYzA3MWU1NzhjMGI1MTZmYTI4
10
- NDU5ZTg4NzVjZTBlOGViYmQxNDJhYjQyM2M3NjM3ZTZhNDFiMzU1NjZmYTdj
11
- YjM5YjRkYWFhZGNjNmYwOTVmN2QwODM2N2IyNGExMzgzODFiNjM=
9
+ YTRiZTJhZjRkOTcyYzQ3NTE4ZDFmZGQ1NTI4ZGM3MTdhOGVlN2Q2NGFlNWE1
10
+ NmVlMmE2NGUzYjJhOTE0MTJjNmY0ZmI3MDMzYTA3N2VjYzVlNGQ4ODNhNDc2
11
+ MzdiYzdkMzhlZWVmYTJhNWUxMjg4ZWM2OTQ3Zjg3ZDcyNDY1MjE=
12
12
  data.tar.gz: !binary |-
13
- MDIwNDE2Y2RiODNlN2UwZGRhNzY0NTJjMjVjZjE1ZmU5NmNjNDhiMDBkOGRi
14
- Yjk3OWViNDdlOGNkMWY3NTE1MDIxNTEzZWI3N2M5OTVhYzFkNDg2OWU4ODVm
15
- NzE4Mjg5MzliNThhOTk5ZDRiM2RiNDhmNmZhYzdjYzRlYzFiMmI=
13
+ YmE3MmE2OGM5MzBhMDY4NDgyNTA5MmY0NjA3ZjcyNDQ3Yzg3NDJiNTJjNzc0
14
+ NjczZDFjN2QyNTIwODNmYmE5ZGQwMzBjMTYwMWQwNDJkN2UwYWQ5MTc4MWJh
15
+ OWU5OTdlNmFkNWYyNTA2NzU3NWI0MjUxZTM1NjRmMzE4MGNhOGE=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ### 0.1.10 / 2014-12-14
2
+ * [CHANGE] Added more examples in `examples` folder (e.g. parsing then parse tree ).
3
+ * [CHANGE] File `rley.rb`: added more requires of the library to ease integration.
4
+
1
5
  ### 0.1.09 / 2014-12-14
2
6
  * [CHANGE] Source code refactored to please Rubocop (0.28.0)
3
7
  * [CHANGE] File `.rubucop.yml` Disabled VariableNam style cop.
@@ -0,0 +1,72 @@
1
+ # Purpose: to demonstrate how to build and render a parse tree
2
+
3
+ require 'rley' # Load the gem
4
+
5
+ # Steps to render a parse tree (of a valid parsed input):
6
+ # 1. Define a grammar
7
+ # 2. Create a tokenizer for the language
8
+ # 3. Create a parser for that grammar
9
+ # 4. Tokenize the input
10
+ # 5. Let the parser process the input
11
+ # 6. Generate a parse tree from the parse result
12
+ # 7. Render the parse tree (in JSON)
13
+
14
+ ########################################
15
+ # Step 1. Define a grammar for a very simple language
16
+ # It recognizes/generates strings like 'b', 'abc', 'aabcc', 'aaabccc',...
17
+ # (based on example in N. Wirth's book "Compiler Construction", p. 6)
18
+ # Let's create the grammar step-by-step with the grammar builder:
19
+ builder = Rley::Syntax::GrammarBuilder.new
20
+ builder.add_terminals('a', 'b', 'c')
21
+ builder.add_production('S' => 'A')
22
+ builder.add_production('A' => %w(a A c))
23
+ builder.add_production('A' => 'b')
24
+
25
+ # And now build the grammar...
26
+ grammar_abc = builder.grammar
27
+
28
+
29
+ ########################################
30
+ # 2. Create a tokenizer for the language
31
+ # The tokenizer transforms the input into an array of tokens
32
+ def tokenizer(aText, aGrammar)
33
+ tokens = aText.chars.map do |ch|
34
+ terminal = aGrammar.name2symbol[ch]
35
+ fail StandardError, "Unknown input character '#{ch}'" if terminal.nil?
36
+ Rley::Parser::Token.new(ch, terminal)
37
+ end
38
+
39
+ return tokens
40
+ end
41
+
42
+ ########################################
43
+ # Step 3. Create a parser for that grammar
44
+ parser = Rley::Parser::EarleyParser.new(grammar_abc)
45
+
46
+ ########################################
47
+ # Step 3. Tokenize the input
48
+ valid_input = 'aabcc'
49
+ tokens = tokenizer(valid_input, grammar_abc)
50
+
51
+ ########################################
52
+ # Step 5. Let the parser process the input
53
+ result = parser.parse(tokens)
54
+
55
+
56
+ ########################################
57
+ # Step 6. Generate a parse tree from the parse result
58
+ ptree = result.parse_tree
59
+
60
+ ########################################
61
+ # Step 7. Render the parse tree (in JSON)
62
+ # Let's create a parse tree visitor
63
+ visitor = Rley::ParseTreeVisitor.new(ptree)
64
+
65
+ #Here we create a renderer object...
66
+ renderer = Rley::Formatter::Json.new(STDOUT)
67
+
68
+ # Now emit the parse tree as JSON on the console output
69
+ puts "JSON rendering of the parse tree for '#{valid_input}' input:"
70
+ renderer.render(visitor)
71
+
72
+ # End of file
@@ -0,0 +1,71 @@
1
+ # Purpose: to demonstrate how to build a recognizer
2
+ # A recognizer is a kind of parser that indicates whether the input
3
+ # complies to the grammar or not.
4
+
5
+ require 'rley' # Load the gem
6
+
7
+ # Steps to build a recognizer:
8
+ # 1. Define a grammar
9
+ # 2. Create a parser for that grammar
10
+ # 3. Build the input
11
+ # 4. Let the parser process the input
12
+ # 5. Check the parser's result to see whether the input was valid (=recognized)
13
+
14
+ ########################################
15
+ # Step 1. Define a grammar for a very simple language
16
+ # It recognizes/generates strings like 'b', 'abc', 'aabcc', 'aaabccc',...
17
+ # (based on example in N. Wirth's book "Compiler Construction", p. 6)
18
+ # Let's create the grammar step-by-step with the grammar builder:
19
+ builder = Rley::Syntax::GrammarBuilder.new
20
+ builder.add_terminals('a', 'b', 'c')
21
+ builder.add_production('S' => 'A')
22
+ builder.add_production('A' => %w(a A c))
23
+ builder.add_production('A' => 'b')
24
+
25
+ # And now build the grammar...
26
+ grammar_abc = builder.grammar
27
+
28
+ # Keep track of the terminal symbols of the grammar:
29
+ term_a = grammar_abc.name2symbol['a']
30
+ term_b = grammar_abc.name2symbol['b']
31
+ term_c = grammar_abc.name2symbol['c']
32
+
33
+ ########################################
34
+ # Step 2. Create a parser for that grammar
35
+ parser = Rley::Parser::EarleyParser.new(grammar_abc)
36
+
37
+ ########################################
38
+ # Step 3. Build the input
39
+ # Mimicking the output of a tokenizer
40
+ valid_input = [
41
+ Rley::Parser::Token.new('a', term_a),
42
+ Rley::Parser::Token.new('a', term_a),
43
+ Rley::Parser::Token.new('b', term_b),
44
+ Rley::Parser::Token.new('c', term_c),
45
+ Rley::Parser::Token.new('c', term_c)
46
+ ]
47
+
48
+ ########################################
49
+ # Step 4. Let the parser process the input
50
+ result = parser.parse(valid_input)
51
+
52
+
53
+ ########################################
54
+ # Step 5. Check the parser's result to see whether the input was valid
55
+ puts "Successful parse of 'aabcc'? #{result.success?}"
56
+ # Output: Successful parse of 'aabcc'? true
57
+
58
+
59
+
60
+ # Let's redo steps 3, 4, 5 again with an invalid input.
61
+ invalid_input = [
62
+ Rley::Parser::Token.new('a', term_a),
63
+ Rley::Parser::Token.new('a', term_a),
64
+ Rley::Parser::Token.new('b', term_b),
65
+ Rley::Parser::Token.new('c', term_c)
66
+ ]
67
+ result = parser.parse(invalid_input)
68
+ puts "Successful parse of 'aabc'? #{result.success?}"
69
+ # Output: Successful parse of 'aabc'? false
70
+
71
+ # End of file
data/lib/rley.rb CHANGED
@@ -4,6 +4,10 @@
4
4
 
5
5
  require_relative './rley/constants'
6
6
  require_relative './rley/syntax/grammar_builder'
7
+ require_relative './rley/parser/token'
7
8
  require_relative './rley/parser/earley_parser'
9
+ require_relative './rley/parse_tree_visitor'
10
+ require_relative './rley/formatter/debug'
11
+ require_relative './rley/formatter/json'
8
12
 
9
13
  # End of file
@@ -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.09'
6
+ Version = '0.1.10'
7
7
 
8
8
  # Brief description of the gem.
9
9
  Description = "Ruby implementation of the Earley's parsing algorithm"
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.1.09
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
@@ -101,6 +101,8 @@ files:
101
101
  - README.md
102
102
  - examples/grammars/grammar_abc.rb
103
103
  - examples/grammars/grammar_L0.rb
104
+ - examples/parsers/parsing_abc.rb
105
+ - examples/recognizers/recognizer_abc.rb
104
106
  - lib/rley.rb
105
107
  - lib/rley/constants.rb
106
108
  - lib/rley/formatter/base_formatter.rb