calyx 0.18.0 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +33 -0
  3. data/calyx.gemspec +2 -2
  4. data/examples/faker.json +1 -0
  5. data/examples/faker.rb +1 -1
  6. data/lib/calyx.rb +12 -8
  7. data/lib/calyx/format.rb +5 -0
  8. data/lib/calyx/grammar.rb +12 -0
  9. data/lib/calyx/mapping.rb +15 -0
  10. data/lib/calyx/modifiers.rb +8 -0
  11. data/lib/calyx/prefix_tree.rb +191 -0
  12. data/lib/calyx/production/affix_table.rb +53 -0
  13. data/lib/calyx/production/uniform_branch.rb +6 -0
  14. data/lib/calyx/production/weighted_branch.rb +6 -0
  15. data/lib/calyx/registry.rb +35 -17
  16. data/lib/calyx/rule.rb +25 -4
  17. data/lib/calyx/{production → syntax}/choices.rb +1 -1
  18. data/lib/calyx/{production → syntax}/concat.rb +18 -22
  19. data/lib/calyx/syntax/expression.rb +87 -0
  20. data/lib/calyx/{production → syntax}/memo.rb +1 -1
  21. data/lib/calyx/{production → syntax}/non_terminal.rb +1 -1
  22. data/lib/calyx/syntax/paired_mapping.rb +53 -0
  23. data/lib/calyx/{production → syntax}/terminal.rb +1 -1
  24. data/lib/calyx/syntax/token.rb +9 -0
  25. data/lib/calyx/{production → syntax}/unique.rb +1 -1
  26. data/lib/calyx/{production → syntax}/weighted_choices.rb +9 -2
  27. data/lib/calyx/version.rb +1 -1
  28. metadata +27 -86
  29. data/.travis.yml +0 -9
  30. data/docs/404.html +0 -7
  31. data/docs/CNAME +0 -1
  32. data/docs/_config.yml +0 -27
  33. data/docs/_data/breadcrumbs.yml +0 -9
  34. data/docs/_data/docs.yml +0 -35
  35. data/docs/_data/examples.yml +0 -9
  36. data/docs/_includes/breadcrumbs.html +0 -36
  37. data/docs/_includes/contents.html +0 -12
  38. data/docs/_includes/icon-github.html +0 -4
  39. data/docs/_includes/icon-rubygems.html +0 -9
  40. data/docs/_includes/navbar.html +0 -24
  41. data/docs/_includes/pagebar.html +0 -12
  42. data/docs/_layouts/default.html +0 -13
  43. data/docs/_layouts/docs.html +0 -14
  44. data/docs/_layouts/home.html +0 -13
  45. data/docs/_layouts/page.html +0 -20
  46. data/docs/_posts/2017-09-14-welcome-to-jekyll.markdown +0 -25
  47. data/docs/_posts/2017-09-21-0.17.0-released.md +0 -10
  48. data/docs/_styles/card.scss +0 -7
  49. data/docs/_styles/colors.scss +0 -18
  50. data/docs/_styles/content.scss +0 -57
  51. data/docs/_styles/cta.scss +0 -25
  52. data/docs/_styles/grid.scss +0 -22
  53. data/docs/_styles/media.scss +0 -50
  54. data/docs/_styles/menu.scss +0 -54
  55. data/docs/_styles/modifiers.scss +0 -3
  56. data/docs/_styles/navbar.scss +0 -161
  57. data/docs/_styles/pagebar.scss +0 -32
  58. data/docs/_styles/reset.scss +0 -92
  59. data/docs/_styles/scale.scss +0 -23
  60. data/docs/_styles/spread.scss +0 -55
  61. data/docs/_styles/styleguide.scss +0 -52
  62. data/docs/_styles/syntax.scss +0 -84
  63. data/docs/_styles/typography.scss +0 -49
  64. data/docs/_styles/yard.scss +0 -36
  65. data/docs/api.html +0 -9662
  66. data/docs/assets/calyx-docs.css +0 -792
  67. data/docs/assets/calyx-flower-outline.svg +0 -202
  68. data/docs/assets/calyx-flower-reverse.svg +0 -202
  69. data/docs/assets/calyx-flower.svg +0 -202
  70. data/docs/assets/logo-small.png +0 -0
  71. data/docs/assets/logos/calyx-flower-1.svg +0 -22
  72. data/docs/assets/logos/calyx-flower-2.svg +0 -21
  73. data/docs/content/documentation.html +0 -20
  74. data/docs/content/examples.html +0 -12
  75. data/docs/content/examples/any-gradient.md +0 -32
  76. data/docs/content/examples/faker.md +0 -16
  77. data/docs/content/examples/tiny-woodland-bot.md +0 -24
  78. data/docs/content/guides/context.md +0 -45
  79. data/docs/content/guides/expressions.md +0 -175
  80. data/docs/content/guides/features.md +0 -50
  81. data/docs/content/guides/formats.md +0 -37
  82. data/docs/content/guides/installation.md +0 -51
  83. data/docs/content/guides/random.md +0 -100
  84. data/docs/content/guides/results.md +0 -62
  85. data/docs/content/index.html +0 -44
  86. data/docs/content/introduction.md +0 -23
  87. data/docs/content/introduction/concepts.md +0 -82
  88. data/docs/content/introduction/contributing.md +0 -43
  89. data/docs/content/introduction/tutorial.md +0 -129
  90. data/docs/content/styleguide.html +0 -71
  91. data/docs/docs.scss +0 -94
  92. data/docs/index.html +0 -12
  93. data/docs/package-lock.json +0 -1536
  94. data/docs/package.json +0 -16
  95. data/examples/faker.yml +0 -42
  96. data/lib/calyx/production/expression.rb +0 -32
data/lib/calyx/rule.rb CHANGED
@@ -2,20 +2,41 @@ module Calyx
2
2
  # Represents a named rule connected to a tree of productions that can be
3
3
  # evaluated and a trace which represents where the rule was declared.
4
4
  class Rule
5
- attr_reader :name, :productions, :trace
5
+ def self.build_ast(productions, registry)
6
+ if productions.first.is_a?(Hash)
7
+ # TODO: test that key is a string
8
+
9
+ if productions.first.first.last.is_a?(String)
10
+ # If value of the production is a strings then this is a
11
+ # paired mapping production.
12
+ Production::AffixTable.parse(productions.first, registry)
13
+ else
14
+ # Otherwise, we assume this is a weighted choice declaration and
15
+ # convert the hash to an array
16
+ Syntax::WeightedChoices.parse(productions.first.to_a, registry)
17
+ end
18
+ elsif productions.first.is_a?(Enumerable)
19
+ # TODO: this needs to change to support attributed/tagged grammars
20
+ Syntax::WeightedChoices.parse(productions, registry)
21
+ else
22
+ Syntax::Choices.parse(productions, registry)
23
+ end
24
+ end
25
+
26
+ attr_reader :name, :tree, :trace
6
27
 
7
28
  def initialize(name, productions, trace)
8
29
  @name = name.to_sym
9
- @productions = productions
30
+ @tree = productions
10
31
  @trace = trace
11
32
  end
12
33
 
13
34
  def size
14
- productions.size
35
+ tree.size
15
36
  end
16
37
 
17
38
  def evaluate(options)
18
- productions.evaluate(options)
39
+ tree.evaluate(options)
19
40
  end
20
41
  end
21
42
  end
@@ -1,7 +1,7 @@
1
1
  module Calyx
2
2
  # A type of production rule representing a list of possible rules, one of
3
3
  # which will chosen each time the grammar runs.
4
- module Production
4
+ module Syntax
5
5
  class Choices
6
6
  # Parse a list of productions and return a choice node which is the head
7
7
  # of a syntax tree of child nodes.
@@ -1,12 +1,12 @@
1
1
  module Calyx
2
- module Production
2
+ module Syntax
3
3
  # A type of production rule representing a string combining both template
4
4
  # substitutions and raw content.
5
5
  class Concat
6
- EXPRESSION = /(\{[A-Za-z0-9_@$\.]+\})/.freeze
6
+ EXPRESSION = /(\{[A-Za-z0-9_@$<>\.]+\})/.freeze
7
+ DEREF_OP = /([<>\.])/.freeze
7
8
  START_TOKEN = '{'.freeze
8
9
  END_TOKEN = '}'.freeze
9
- DEREF_TOKEN = '.'.freeze
10
10
 
11
11
  # Parses an interpolated string into fragments combining terminal strings
12
12
  # and non-terminal rules.
@@ -16,21 +16,14 @@ module Calyx
16
16
  # @param [String] production
17
17
  # @param [Calyx::Registry] registry
18
18
  def self.parse(production, registry)
19
- expansion = production.split(EXPRESSION).map do |atom|
19
+ expressions = production.split(EXPRESSION).map do |atom|
20
20
  if atom.is_a?(String)
21
21
  if atom.chars.first == START_TOKEN && atom.chars.last == END_TOKEN
22
- head, *tail = atom.slice(1, atom.length-2).split(DEREF_TOKEN)
23
- if head[0] == Memo::SIGIL
24
- rule = Memo.new(head, registry)
25
- elsif head[0] == Unique::SIGIL
26
- rule = Unique.new(head, registry)
22
+ head, *tail = atom.slice(1, atom.length-2).split(DEREF_OP)
23
+ if tail.any?
24
+ ExpressionChain.parse(head, tail, registry)
27
25
  else
28
- rule = NonTerminal.new(head, registry)
29
- end
30
- unless tail.empty?
31
- Expression.new(rule, tail, registry)
32
- else
33
- rule
26
+ Expression.parse(head, registry)
34
27
  end
35
28
  else
36
29
  Terminal.new(atom)
@@ -38,28 +31,31 @@ module Calyx
38
31
  end
39
32
  end
40
33
 
41
- self.new(expansion)
34
+ self.new(expressions)
42
35
  end
43
36
 
44
37
  # Initialize the concat node with an expansion of terminal and
45
38
  # non-terminal fragments.
46
39
  #
47
40
  # @param [Array] expansion
48
- def initialize(expansion)
49
- @expansion = expansion
41
+ def initialize(expressions)
42
+ @expressions = expressions
50
43
  end
51
44
 
52
- # Evaluate all the child nodes of this node and concatenate them together
53
- # into a single result.
45
+ # Evaluate all the child nodes of this node and concatenate each expansion
46
+ # together into a single result.
54
47
  #
55
48
  # @param [Calyx::Options] options
56
49
  # @return [Array]
57
50
  def evaluate(options)
58
- concat = @expansion.reduce([]) do |exp, atom|
51
+ expansion = @expressions.reduce([]) do |exp, atom|
59
52
  exp << atom.evaluate(options)
60
53
  end
61
54
 
62
- [:concat, concat]
55
+ #[:expansion, expansion]
56
+ # TODO: fix this along with a git rename
57
+ # Commented out because of a lot of tests depending on :concat symbol
58
+ [:concat, expansion]
63
59
  end
64
60
  end
65
61
  end
@@ -0,0 +1,87 @@
1
+ module Calyx
2
+ module Syntax
3
+ # A symbolic expression representing a single template substitution.
4
+ class Expression
5
+ def self.parse(symbol, registry)
6
+ if symbol[0] == Memo::SIGIL
7
+ Memo.new(symbol, registry)
8
+ elsif symbol[0] == Unique::SIGIL
9
+ Unique.new(symbol, registry)
10
+ else
11
+ NonTerminal.new(symbol, registry)
12
+ end
13
+ end
14
+ end
15
+
16
+ class Modifier < Struct.new(:type, :name, :map_dir)
17
+ def self.filter(name)
18
+ new(:filter, name, nil)
19
+ end
20
+
21
+ def self.map_left(name)
22
+ new(:map, name, :left)
23
+ end
24
+
25
+ def self.map_right(name)
26
+ new(:map, name, :right)
27
+ end
28
+ end
29
+
30
+ # Handles filter chains that symbolic expressions can pass through to
31
+ # generate a custom substitution.
32
+ class ExpressionChain
33
+ def self.parse(production, production_chain, registry)
34
+ modifier_chain = production_chain.each_slice(2).map do |op_token, target|
35
+ rule = target.to_sym
36
+ case op_token
37
+ when Token::EXPR_FILTER then Modifier.filter(rule)
38
+ when Token::EXPR_MAP_LEFT then Modifier.map_left(rule)
39
+ when Token::EXPR_MAP_RIGHT then Modifier.map_right(rule)
40
+ else
41
+ # Should not end up here because the regex excludes it but this
42
+ # could be a place to add a helpful parse error on any weird
43
+ # chars used by the expression—current behaviour is to pass
44
+ # the broken expression through to the result as part of the
45
+ # text, as if that is what the author meant.
46
+ raise("unreachable")
47
+ end
48
+ end
49
+
50
+ expression = Expression.parse(production, registry)
51
+
52
+ self.new(expression, modifier_chain, registry)
53
+ end
54
+
55
+ # @param [#evaluate] production
56
+ # @param [Array] modifiers
57
+ # @param [Calyx::Registry] registry
58
+ def initialize(production, modifiers, registry)
59
+ @production = production
60
+ @modifiers = modifiers
61
+ @registry = registry
62
+ end
63
+
64
+ # Evaluate the expression by expanding the non-terminal to produce a
65
+ # terminal string, then passing it through the given modifier chain and
66
+ # returning the transformed result.
67
+ #
68
+ # @param [Calyx::Options] options
69
+ # @return [Array]
70
+ def evaluate(options)
71
+ expanded = @production.evaluate(options).flatten.reject { |o| o.is_a?(Symbol) }.join
72
+ chain = []
73
+
74
+ expression = @modifiers.reduce(expanded) do |value, modifier|
75
+ case modifier.type
76
+ when :filter
77
+ @registry.expand_filter(modifier.name, value)
78
+ when :map
79
+ @registry.expand_map(modifier.name, value, modifier.map_dir)
80
+ end
81
+ end
82
+
83
+ [:expression, expression]
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,5 +1,5 @@
1
1
  module Calyx
2
- module Production
2
+ module Syntax
3
3
  # A type of production rule representing a memoized subsitution which
4
4
  # returns the first value selected on all subsequent lookups.
5
5
  class Memo
@@ -1,5 +1,5 @@
1
1
  module Calyx
2
- module Production
2
+ module Syntax
3
3
  # A type of production rule that represents a non-terminal expansion,
4
4
  # linking one rule to another.
5
5
  class NonTerminal
@@ -0,0 +1,53 @@
1
+ module Calyx
2
+ module Syntax
3
+ # A type of production rule representing a bidirectional dictionary of
4
+ # mapping pairs that can be used as a substitution table in template
5
+ # expressions.
6
+ class PairedMapping
7
+ def self.parse(productions, registry)
8
+ # TODO: handle wildcard expressions
9
+ self.new(productions)
10
+ end
11
+
12
+ # %es
13
+ # prefix: nil, suffix: 'es'
14
+ # match: 'buses' -> ends_with(suffix)
15
+
16
+ # %y
17
+ # prefix: nil, suffix: 'ies'
18
+
19
+ def initialize(mapping)
20
+ @lhs_index = PrefixTree.new
21
+ @rhs_index = PrefixTree.new
22
+
23
+ @lhs_list = mapping.keys
24
+ @rhs_list = mapping.values
25
+
26
+ @lhs_index.add_all(@lhs_list)
27
+ @rhs_index.add_all(@rhs_list)
28
+ end
29
+
30
+ def value_for(key)
31
+ match = @lhs_index.lookup(key)
32
+ result = @rhs_list[match.index]
33
+
34
+ if match.captured
35
+ result.sub("%", match.captured)
36
+ else
37
+ result
38
+ end
39
+ end
40
+
41
+ def key_for(value)
42
+ match = @rhs_index.lookup(value)
43
+ result = @lhs_list[match.index]
44
+
45
+ if match.captured
46
+ result.sub("%", match.captured)
47
+ else
48
+ result
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  module Calyx
2
- module Production
2
+ module Syntax
3
3
  # A type of production rule that terminates with a resulting string atom.
4
4
  class Terminal
5
5
  # Construct a terminal node with the given value.
@@ -0,0 +1,9 @@
1
+ module Calyx
2
+ module Syntax
3
+ module Token
4
+ EXPR_MAP_LEFT = "<"
5
+ EXPR_MAP_RIGHT = ">"
6
+ EXPR_FILTER = "."
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  module Calyx
2
- module Production
2
+ module Syntax
3
3
  # A type of production rule representing a unique substitution which only
4
4
  # returns values that have not previously been selected. The probability
5
5
  # that a given rule will be selected increases as more selections are made
@@ -1,5 +1,5 @@
1
1
  module Calyx
2
- module Production
2
+ module Syntax
3
3
  # A type of production rule representing a map of possible rules with
4
4
  # associated weights that define the expected probability of a rule
5
5
  # being chosen.
@@ -12,7 +12,7 @@ module Calyx
12
12
  #
13
13
  # @param [Array<Array>, Hash<#to_s, Float>] productions
14
14
  # @param [Calyx::Registry] registry
15
- # @return [Calyx::Production::WeightedChoices]
15
+ # @return [Calyx::Syntax::WeightedChoices]
16
16
  def self.parse(productions, registry)
17
17
  if productions.first.last.is_a?(Range)
18
18
  range_max = productions.max { |a,b| a.last.max <=> b.last.max }.last.max
@@ -63,6 +63,13 @@ module Calyx
63
63
  @collection = collection
64
64
  end
65
65
 
66
+ # The number of possible choices available for this rule.
67
+ #
68
+ # @return [Integer]
69
+ def size
70
+ @collection.size
71
+ end
72
+
66
73
  # Evaluate the choice by randomly picking one of its possible options,
67
74
  # balanced according to the given weights.
68
75
  #
data/lib/calyx/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Calyx
2
- VERSION = '0.18.0'.freeze
2
+ VERSION = '0.22.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calyx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rickerby
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-30 00:00:00.000000000 Z
11
+ date: 2021-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.10'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.10'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -60,8 +60,8 @@ executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
+ - ".github/workflows/ruby.yml"
63
64
  - ".gitignore"
64
- - ".travis.yml"
65
65
  - CODE_OF_CONDUCT.md
66
66
  - CONTRIBUTING.md
67
67
  - Gemfile
@@ -69,98 +69,40 @@ files:
69
69
  - README.md
70
70
  - SYNTAX.md
71
71
  - calyx.gemspec
72
- - docs/404.html
73
- - docs/CNAME
74
- - docs/_config.yml
75
- - docs/_data/breadcrumbs.yml
76
- - docs/_data/docs.yml
77
- - docs/_data/examples.yml
78
- - docs/_includes/breadcrumbs.html
79
- - docs/_includes/contents.html
80
- - docs/_includes/icon-github.html
81
- - docs/_includes/icon-rubygems.html
82
- - docs/_includes/navbar.html
83
- - docs/_includes/pagebar.html
84
- - docs/_layouts/default.html
85
- - docs/_layouts/docs.html
86
- - docs/_layouts/home.html
87
- - docs/_layouts/page.html
88
- - docs/_posts/2017-09-14-welcome-to-jekyll.markdown
89
- - docs/_posts/2017-09-21-0.17.0-released.md
90
- - docs/_styles/card.scss
91
- - docs/_styles/colors.scss
92
- - docs/_styles/content.scss
93
- - docs/_styles/cta.scss
94
- - docs/_styles/grid.scss
95
- - docs/_styles/media.scss
96
- - docs/_styles/menu.scss
97
- - docs/_styles/modifiers.scss
98
- - docs/_styles/navbar.scss
99
- - docs/_styles/pagebar.scss
100
- - docs/_styles/reset.scss
101
- - docs/_styles/scale.scss
102
- - docs/_styles/spread.scss
103
- - docs/_styles/styleguide.scss
104
- - docs/_styles/syntax.scss
105
- - docs/_styles/typography.scss
106
- - docs/_styles/yard.scss
107
- - docs/api.html
108
- - docs/assets/calyx-docs.css
109
- - docs/assets/calyx-flower-outline.svg
110
- - docs/assets/calyx-flower-reverse.svg
111
- - docs/assets/calyx-flower.svg
112
- - docs/assets/logo-small.png
113
- - docs/assets/logos/calyx-flower-1.svg
114
- - docs/assets/logos/calyx-flower-2.svg
115
- - docs/content/documentation.html
116
- - docs/content/examples.html
117
- - docs/content/examples/any-gradient.md
118
- - docs/content/examples/faker.md
119
- - docs/content/examples/tiny-woodland-bot.md
120
- - docs/content/guides/context.md
121
- - docs/content/guides/expressions.md
122
- - docs/content/guides/features.md
123
- - docs/content/guides/formats.md
124
- - docs/content/guides/installation.md
125
- - docs/content/guides/random.md
126
- - docs/content/guides/results.md
127
- - docs/content/index.html
128
- - docs/content/introduction.md
129
- - docs/content/introduction/concepts.md
130
- - docs/content/introduction/contributing.md
131
- - docs/content/introduction/tutorial.md
132
- - docs/content/styleguide.html
133
- - docs/docs.scss
134
- - docs/index.html
135
- - docs/package-lock.json
136
- - docs/package.json
137
72
  - examples/any_gradient.rb
73
+ - examples/faker.json
138
74
  - examples/faker.rb
139
- - examples/faker.yml
140
75
  - examples/tiny_woodland_bot.rb
141
76
  - lib/calyx.rb
142
77
  - lib/calyx/errors.rb
143
78
  - lib/calyx/format.rb
144
79
  - lib/calyx/grammar.rb
80
+ - lib/calyx/mapping.rb
145
81
  - lib/calyx/modifiers.rb
146
82
  - lib/calyx/options.rb
147
- - lib/calyx/production/choices.rb
148
- - lib/calyx/production/concat.rb
149
- - lib/calyx/production/expression.rb
150
- - lib/calyx/production/memo.rb
151
- - lib/calyx/production/non_terminal.rb
152
- - lib/calyx/production/terminal.rb
153
- - lib/calyx/production/unique.rb
154
- - lib/calyx/production/weighted_choices.rb
83
+ - lib/calyx/prefix_tree.rb
84
+ - lib/calyx/production/affix_table.rb
85
+ - lib/calyx/production/uniform_branch.rb
86
+ - lib/calyx/production/weighted_branch.rb
155
87
  - lib/calyx/registry.rb
156
88
  - lib/calyx/result.rb
157
89
  - lib/calyx/rule.rb
90
+ - lib/calyx/syntax/choices.rb
91
+ - lib/calyx/syntax/concat.rb
92
+ - lib/calyx/syntax/expression.rb
93
+ - lib/calyx/syntax/memo.rb
94
+ - lib/calyx/syntax/non_terminal.rb
95
+ - lib/calyx/syntax/paired_mapping.rb
96
+ - lib/calyx/syntax/terminal.rb
97
+ - lib/calyx/syntax/token.rb
98
+ - lib/calyx/syntax/unique.rb
99
+ - lib/calyx/syntax/weighted_choices.rb
158
100
  - lib/calyx/version.rb
159
101
  homepage: https://github.com/maetl/calyx
160
102
  licenses:
161
103
  - MIT
162
104
  metadata: {}
163
- post_install_message:
105
+ post_install_message:
164
106
  rdoc_options: []
165
107
  require_paths:
166
108
  - lib
@@ -175,9 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
117
  - !ruby/object:Gem::Version
176
118
  version: '0'
177
119
  requirements: []
178
- rubyforge_project:
179
- rubygems_version: 2.7.6
180
- signing_key:
120
+ rubygems_version: 3.1.2
121
+ signing_key:
181
122
  specification_version: 4
182
123
  summary: Generate text with declarative recursive grammars
183
124
  test_files: []