zenlish 0.2.05 → 0.2.07

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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +228 -0
  3. data/CHANGELOG.md +19 -0
  4. data/Gemfile +5 -3
  5. data/LICENSE.txt +1 -1
  6. data/Rakefile +5 -3
  7. data/lib/zenlish/feature/boolean_domain.rb +6 -4
  8. data/lib/zenlish/feature/boolean_value.rb +3 -2
  9. data/lib/zenlish/feature/enumeration_domain.rb +5 -2
  10. data/lib/zenlish/feature/feature.rb +9 -7
  11. data/lib/zenlish/feature/feature_def.rb +9 -6
  12. data/lib/zenlish/feature/feature_domain.rb +4 -2
  13. data/lib/zenlish/feature/feature_struct.rb +3 -1
  14. data/lib/zenlish/feature/feature_struct_def.rb +5 -3
  15. data/lib/zenlish/feature/feature_struct_def_bearer.rb +6 -4
  16. data/lib/zenlish/feature/feature_value.rb +4 -2
  17. data/lib/zenlish/feature/identifier_domain.rb +5 -3
  18. data/lib/zenlish/feature/identifier_value.rb +3 -2
  19. data/lib/zenlish/feature/symbol_value.rb +3 -1
  20. data/lib/zenlish/inflect/atomic_o_expression.rb +2 -1
  21. data/lib/zenlish/inflect/composite_o_expression.rb +3 -1
  22. data/lib/zenlish/inflect/concatenation.rb +3 -2
  23. data/lib/zenlish/inflect/equals_literal.rb +3 -1
  24. data/lib/zenlish/inflect/feature_heading.rb +2 -5
  25. data/lib/zenlish/inflect/formal_argument.rb +3 -1
  26. data/lib/zenlish/inflect/function_call.rb +4 -1
  27. data/lib/zenlish/inflect/heading.rb +2 -0
  28. data/lib/zenlish/inflect/inflection_rule.rb +2 -0
  29. data/lib/zenlish/inflect/inflection_table.rb +6 -4
  30. data/lib/zenlish/inflect/inflection_table_builder.rb +21 -18
  31. data/lib/zenlish/inflect/input_asis.rb +3 -0
  32. data/lib/zenlish/inflect/input_expression.rb +4 -2
  33. data/lib/zenlish/inflect/literal_asis.rb +4 -1
  34. data/lib/zenlish/inflect/matches_pattern.rb +2 -0
  35. data/lib/zenlish/inflect/membership.rb +2 -0
  36. data/lib/zenlish/inflect/method_heading.rb +3 -6
  37. data/lib/zenlish/inflect/not_equals_literal.rb +2 -0
  38. data/lib/zenlish/inflect/nullary_input_expression.rb +3 -1
  39. data/lib/zenlish/inflect/output_expression.rb +6 -0
  40. data/lib/zenlish/inflect/substitution.rb +3 -1
  41. data/lib/zenlish/inflect/unary_input_expression.rb +4 -1
  42. data/lib/zenlish/inflect/unconditionally_true.rb +4 -2
  43. data/lib/zenlish/lang/dictionary.rb +19 -16
  44. data/lib/zenlish/lang/lemmatizer.rb +40 -0
  45. data/lib/zenlish/lang/zenlish_grammar.rb +6 -4
  46. data/lib/zenlish/lex/empty_lexicon_factory.rb +3 -2
  47. data/lib/zenlish/lex/lexeme.rb +6 -4
  48. data/lib/zenlish/lex/lexical_entry.rb +6 -4
  49. data/lib/zenlish/lex/lexicon.rb +4 -3
  50. data/lib/zenlish/lex/literal.rb +3 -1
  51. data/lib/zenlish/lexer/lexer.rb +144 -0
  52. data/lib/zenlish/trie/base_trie_node.rb +27 -0
  53. data/lib/zenlish/trie/trie.rb +132 -0
  54. data/lib/zenlish/trie/trie_node.rb +21 -0
  55. data/lib/zenlish/trie/trie_root.rb +10 -0
  56. data/lib/zenlish/version.rb +3 -1
  57. data/lib/zenlish/wclasses/adjective.rb +4 -2
  58. data/lib/zenlish/wclasses/adverb.rb +3 -1
  59. data/lib/zenlish/wclasses/adverb_maybe.rb +3 -1
  60. data/lib/zenlish/wclasses/adverb_not.rb +2 -0
  61. data/lib/zenlish/wclasses/all_word_classes.rb +3 -1
  62. data/lib/zenlish/wclasses/article.rb +2 -0
  63. data/lib/zenlish/wclasses/auxiliary.rb +2 -0
  64. data/lib/zenlish/wclasses/auxiliary_be.rb +7 -6
  65. data/lib/zenlish/wclasses/auxiliary_do.rb +6 -5
  66. data/lib/zenlish/wclasses/cardinal.rb +3 -1
  67. data/lib/zenlish/wclasses/common_noun.rb +2 -0
  68. data/lib/zenlish/wclasses/comparative_particle.rb +5 -3
  69. data/lib/zenlish/wclasses/conjunction.rb +2 -0
  70. data/lib/zenlish/wclasses/conjunctive_pronoun.rb +2 -0
  71. data/lib/zenlish/wclasses/coordinator.rb +4 -2
  72. data/lib/zenlish/wclasses/definite_article.rb +2 -0
  73. data/lib/zenlish/wclasses/degree_adverb.rb +2 -0
  74. data/lib/zenlish/wclasses/demonstrative_determiner.rb +6 -4
  75. data/lib/zenlish/wclasses/demonstrative_pronoun.rb +2 -0
  76. data/lib/zenlish/wclasses/determiner.rb +3 -1
  77. data/lib/zenlish/wclasses/distributive_determiner.rb +2 -0
  78. data/lib/zenlish/wclasses/existential_there.rb +2 -0
  79. data/lib/zenlish/wclasses/fronting_quantifier.rb +3 -1
  80. data/lib/zenlish/wclasses/indefinite_article.rb +2 -0
  81. data/lib/zenlish/wclasses/indefinite_pronoun.rb +3 -1
  82. data/lib/zenlish/wclasses/irregular_linking_verb.rb +3 -1
  83. data/lib/zenlish/wclasses/irregular_verb.rb +13 -15
  84. data/lib/zenlish/wclasses/irregular_verb_be.rb +8 -7
  85. data/lib/zenlish/wclasses/irregular_verb_can.rb +8 -7
  86. data/lib/zenlish/wclasses/irregular_verb_do.rb +7 -6
  87. data/lib/zenlish/wclasses/irregular_verb_extension.rb +8 -7
  88. data/lib/zenlish/wclasses/irregular_verb_have.rb +12 -11
  89. data/lib/zenlish/wclasses/irregular_verb_know.rb +3 -1
  90. data/lib/zenlish/wclasses/irregular_verb_say.rb +3 -1
  91. data/lib/zenlish/wclasses/irregular_verb_think.rb +3 -1
  92. data/lib/zenlish/wclasses/lexical_verb.rb +3 -4
  93. data/lib/zenlish/wclasses/linking_adverb.rb +2 -0
  94. data/lib/zenlish/wclasses/modal_verb_can.rb +7 -5
  95. data/lib/zenlish/wclasses/noun.rb +4 -2
  96. data/lib/zenlish/wclasses/numeral.rb +2 -0
  97. data/lib/zenlish/wclasses/personal_pronoun.rb +8 -6
  98. data/lib/zenlish/wclasses/possessive_determiner.rb +13 -12
  99. data/lib/zenlish/wclasses/preposition.rb +3 -1
  100. data/lib/zenlish/wclasses/preposition_of.rb +2 -0
  101. data/lib/zenlish/wclasses/preposition_than.rb +2 -0
  102. data/lib/zenlish/wclasses/pronoun.rb +3 -1
  103. data/lib/zenlish/wclasses/proper_noun.rb +10 -8
  104. data/lib/zenlish/wclasses/quantifier.rb +3 -1
  105. data/lib/zenlish/wclasses/regular_verb.rb +9 -9
  106. data/lib/zenlish/wclasses/regular_verb_want.rb +4 -2
  107. data/lib/zenlish/wclasses/relative_pronoun.rb +4 -2
  108. data/lib/zenlish/wclasses/subordinating_conjunction.rb +7 -5
  109. data/lib/zenlish/wclasses/verb.rb +5 -3
  110. data/lib/zenlish/wclasses/word_class.rb +7 -5
  111. data/lib/zenlish.rb +3 -3
  112. data/spec/spec_helper.rb +3 -1
  113. data/spec/zenlish/feature/boolean_domain_spec.rb +16 -16
  114. data/spec/zenlish/feature/boolean_value_spec.rb +7 -6
  115. data/spec/zenlish/feature/enumeration_domain_spec.rb +21 -21
  116. data/spec/zenlish/feature/feature_def_spec.rb +15 -14
  117. data/spec/zenlish/feature/feature_spec.rb +17 -17
  118. data/spec/zenlish/feature/feature_struct_def_bearer_spec.rb +23 -21
  119. data/spec/zenlish/feature/feature_struct_def_spec.rb +26 -25
  120. data/spec/zenlish/feature/identifier_domain_spec.rb +15 -15
  121. data/spec/zenlish/feature/identifier_value_spec.rb +10 -9
  122. data/spec/zenlish/feature/symbol_value_spec.rb +9 -8
  123. data/spec/zenlish/inflect/concatenation_spec.rb +14 -14
  124. data/spec/zenlish/inflect/equals_literal_spec.rb +17 -16
  125. data/spec/zenlish/inflect/feature_heading_spec.rb +22 -21
  126. data/spec/zenlish/inflect/formal_argument_spec.rb +7 -7
  127. data/spec/zenlish/inflect/function_call_spec.rb +11 -12
  128. data/spec/zenlish/inflect/inflection_rule_spec.rb +28 -24
  129. data/spec/zenlish/inflect/inflection_table_builder_spec.rb +62 -57
  130. data/spec/zenlish/inflect/inflection_table_spec.rb +49 -46
  131. data/spec/zenlish/inflect/input_asis_spec.rb +12 -15
  132. data/spec/zenlish/inflect/literal_asis_spec.rb +10 -10
  133. data/spec/zenlish/inflect/matches_pattern_spec.rb +16 -15
  134. data/spec/zenlish/inflect/membership_spec.rb +17 -16
  135. data/spec/zenlish/inflect/method_heading_spec.rb +15 -14
  136. data/spec/zenlish/inflect/not_equals_literal_spec.rb +17 -16
  137. data/spec/zenlish/inflect/substitution_spec.rb +10 -11
  138. data/spec/zenlish/inflect/unconditionally_true_spec.rb +8 -6
  139. data/spec/zenlish/lang/dictionary_spec.rb +28 -31
  140. data/spec/zenlish/lang/lemmatizer_spec.rb +43 -0
  141. data/spec/zenlish/lang/zenlish_grammar_spec.rb +5 -5
  142. data/spec/zenlish/lex/empty_lexicon_factory_spec.rb +8 -8
  143. data/spec/zenlish/lex/lexeme_spec.rb +27 -28
  144. data/spec/zenlish/lex/lexical_entry_spec.rb +15 -15
  145. data/spec/zenlish/lex/lexicon_spec.rb +52 -50
  146. data/spec/zenlish/lex/literal_spec.rb +8 -8
  147. data/spec/zenlish/lexer/lexer_spec.rb +52 -0
  148. data/spec/zenlish/parser/lesson1_spec.rb +81 -81
  149. data/spec/zenlish/parser/lesson2_spec.rb +133 -138
  150. data/spec/zenlish/parser/lesson3_spec.rb +186 -226
  151. data/spec/zenlish/parser/zparser_spec.rb +8 -7
  152. data/spec/zenlish/support/minimal_lexicon.rb +2 -0
  153. data/spec/zenlish/support/var2word.rb +16 -9
  154. data/spec/zenlish/trie/base_trie_node_spec.rb +33 -0
  155. data/spec/zenlish/trie/trie_spec.rb +108 -0
  156. data/spec/zenlish/wclasses/common_noun_spec.rb +15 -19
  157. data/spec/zenlish/wclasses/demonstrative_determiner_spec.rb +12 -12
  158. data/spec/zenlish/wclasses/irregular_verb_can_spec.rb +18 -18
  159. data/spec/zenlish/wclasses/irregular_verb_extension_spec.rb +10 -10
  160. data/spec/zenlish/wclasses/irregular_verb_spec.rb +28 -28
  161. data/spec/zenlish/wclasses/lexical_verb_spec.rb +9 -9
  162. data/spec/zenlish/wclasses/modal_verb_can_spec.rb +12 -12
  163. data/spec/zenlish/wclasses/noun_spec.rb +7 -7
  164. data/spec/zenlish/wclasses/personal_pronoun_spec.rb +20 -23
  165. data/spec/zenlish/wclasses/possessive_determiner_spec.rb +28 -31
  166. data/spec/zenlish/wclasses/preposition_spec.rb +5 -5
  167. data/spec/zenlish/wclasses/proper_noun_spec.rb +3 -3
  168. data/spec/zenlish/wclasses/regular_verb_spec.rb +30 -30
  169. data/spec/zenlish/wclasses/regular_verb_want_spec.rb +30 -0
  170. data/spec/zenlish/wclasses/verb_spec.rb +9 -9
  171. data/spec/zenlish_spec.rb +4 -2
  172. data/zenlish.gemspec +18 -14
  173. metadata +49 -16
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Inflect
3
5
  class FormalArgument
4
6
  attr_reader :index
5
-
7
+
6
8
  def initialize(anIndex)
7
9
  @index = anIndex
8
10
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'atomic_o_expression'
2
4
 
3
5
  module Zenlish
@@ -6,6 +8,7 @@ module Zenlish
6
8
  attr_reader :mth_name
7
9
 
8
10
  def initialize(aMethodName)
11
+ super()
9
12
  @mth_name = aMethodName
10
13
  end
11
14
 
@@ -14,4 +17,4 @@ module Zenlish
14
17
  end
15
18
  end # class
16
19
  end # module
17
- end # module
20
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../feature/feature'
2
4
  require_relative '../feature/feature_def'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Inflect
3
5
  # An inflection rule has two-parts:
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module Zenlish
3
4
  module Inflect
@@ -28,6 +29,7 @@ module Zenlish
28
29
  end
29
30
  err_msg = "Table has #{headings.size} headings, instead of #{constraints.size}"
30
31
  raise StandardError, err_msg if constraints.size != headings.size
32
+
31
33
  actuals = []
32
34
  headings.each_with_index do |hd, idx|
33
35
  if constraints[idx]
@@ -50,7 +52,7 @@ module Zenlish
50
52
  def all_inflections(aLexeme)
51
53
  constraints = Array.new(headings.size) { |_i| nil }
52
54
  heading_matches = []
53
- headings.each_with_index do |hd, idx|
55
+ headings.each_with_index do |hd, _idx|
54
56
  heading_matches << hd.all_matches(aLexeme)
55
57
  end
56
58
  w_forms = nil
@@ -60,8 +62,8 @@ module Zenlish
60
62
  inflect(aLexeme, [item])
61
63
  end
62
64
  else
63
- vector_1 = heading_matches.shift
64
- all_combos = vector_1.product(*heading_matches)
65
+ vector1 = heading_matches.shift
66
+ all_combos = vector1.product(*heading_matches)
65
67
  w_forms = all_combos.map do |combination|
66
68
  inflect(aLexeme, combination)
67
69
  end
@@ -71,4 +73,4 @@ module Zenlish
71
73
  end
72
74
  end # class
73
75
  end # module
74
- end # module
76
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'feature_heading'
2
4
  require_relative 'method_heading'
3
5
  require_relative 'formal_argument'
@@ -13,19 +15,19 @@ require_relative 'substitution'
13
15
  require_relative 'inflection_rule'
14
16
  require_relative 'inflection_table'
15
17
 
16
- # DecisionTable: Common_form
17
- # | NUMBER | .base_form | Common_form |
18
- # | singular | X | base_form |
19
- # | plural | ~ /[^aeiouy]y$/ | sub(base_form, /y$/, "ies")|
20
- # | plural | X | base_form + "s" |
21
- # build('Common_form') do
22
- # feature_heading 'NUMBER'
23
- # method_heading 'base_form'
24
- # | NUMBER | base_form | Common_form |
25
- # rule [equals(:singular), dont_care ], col('base_form')
26
- # rule [equals(:plural) , matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies')
27
- # rule [equals(:plural) , dont_care ], concat(col('base_form'), 's')
28
- # end
18
+ # DecisionTable: Common_form
19
+ # | NUMBER | .base_form | Common_form |
20
+ # | singular | X | base_form |
21
+ # | plural | ~ /[^aeiouy]y$/ | sub(base_form, /y$/, "ies")|
22
+ # | plural | X | base_form + "s" |
23
+ # build('Common_form') do
24
+ # feature_heading 'NUMBER'
25
+ # method_heading 'base_form'
26
+ # | NUMBER | base_form | Common_form |
27
+ # rule [equals(:singular), dont_care ], col('base_form')
28
+ # rule [equals(:plural) , matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies')
29
+ # rule [equals(:plural) , dont_care ], concat(col('base_form'), 's')
30
+ # end
29
31
 
30
32
  module Zenlish
31
33
  module Inflect
@@ -50,20 +52,20 @@ module Zenlish
50
52
  def feature_heading(aFeatureName)
51
53
  hd = FeatureHeading.new(aFeatureName)
52
54
  headings << hd
53
- table.add_heading(hd) if table
55
+ table&.add_heading(hd)
54
56
  end
55
57
 
56
58
  def method_heading(aMethodName)
57
59
  hd = MethodHeading.new(aMethodName)
58
60
  headings << hd
59
- table.add_heading(hd) if table
61
+ table&.add_heading(hd)
60
62
  end
61
63
 
62
64
  def rule(conditions, consequent)
63
65
  @conds = []
64
66
  rl = InflectionRule.new(conditions.dup, consequent)
65
67
  rules << rl
66
- table.add_rule(rl) if table
68
+ table&.add_rule(rl)
67
69
 
68
70
  rl
69
71
  end
@@ -107,6 +109,7 @@ module Zenlish
107
109
  col_index = headings.find_index { |hd| hd.label == aColName }
108
110
  err_msg = "Cannot find heading named '#{aColName}'."
109
111
  raise StandardError, err_msg if col_index.nil?
112
+
110
113
  formal = FormalArgument.new(col_index)
111
114
  InputAsIs.new(formal)
112
115
  end
@@ -132,7 +135,7 @@ module Zenlish
132
135
 
133
136
  private
134
137
 
135
- def reset()
138
+ def reset
136
139
  @table = nil
137
140
  @headings = []
138
141
  @conds = []
@@ -144,4 +147,4 @@ module Zenlish
144
147
  # end
145
148
  end # class
146
149
  end # module
147
- end # module
150
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'atomic_o_expression'
2
4
 
3
5
  module Zenlish
@@ -6,6 +8,7 @@ module Zenlish
6
8
  attr_reader :formal
7
9
 
8
10
  def initialize(anArgument)
11
+ super()
9
12
  @formal = anArgument
10
13
  end
11
14
 
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Inflect
3
5
  class InputExpression
4
6
  def success?(_lexeme, _heading_values)
5
7
  raise NotImplementedError, 'Method must be implemented in subclass(es).'
6
- end
8
+ end
7
9
  end # class
8
10
  end # module
9
- end # module
11
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'atomic_o_expression'
2
4
 
3
5
  module Zenlish
@@ -6,6 +8,7 @@ module Zenlish
6
8
  attr_reader :text
7
9
 
8
10
  def initialize(aLiteralValue)
11
+ super()
9
12
  @text = aLiteralValue
10
13
  end
11
14
 
@@ -14,4 +17,4 @@ module Zenlish
14
17
  end
15
18
  end # class
16
19
  end # module
17
- end # module
20
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'unary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'unary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -1,20 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'heading'
2
4
 
3
5
  module Zenlish
4
6
  module Inflect
5
7
  class MethodHeading < Heading
6
-
7
- def initialize(aLabel)
8
- super(aLabel)
9
- end
10
-
11
8
  def evaluate_for(aFeatureBearer)
12
9
  aFeatureBearer.send(label)
13
10
  end
14
11
 
15
12
  def all_matches(aFeatureBearer)
16
13
  [evaluate_for(aFeatureBearer)]
17
- end
14
+ end
18
15
  end # class
19
16
  end # module
20
17
  end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'unary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'input_expression'
2
4
 
3
5
  module Zenlish
@@ -5,4 +7,4 @@ module Zenlish
5
7
  class NullaryInputExpression < InputExpression
6
8
  end # class
7
9
  end # module
8
- end # module
10
+ end # module
@@ -1,6 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Inflect
5
+ # rubocop: disable Lint/EmptyClass
6
+
3
7
  class OutputExpression
4
8
  end # class
9
+
10
+ # rubocop: enable Lint/EmptyClass
5
11
  end # module
6
12
  end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'literal_asis'
2
4
  require_relative 'composite_o_expression'
3
5
 
@@ -62,4 +64,4 @@ module Zenlish
62
64
  end
63
65
  end # class
64
66
  end # module
65
- end # module
67
+ end # module
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'input_expression'
2
4
 
3
5
  module Zenlish
4
6
  module Inflect
5
7
  class UnaryInputExpression < InputExpression
6
8
  attr_reader :argument
7
-
9
+
8
10
  def initialize(anArgument)
11
+ super()
9
12
  @argument = anArgument
10
13
  end
11
14
  end # class
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'nullary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -5,7 +7,7 @@ module Zenlish
5
7
  class UnconditionallyTrue < NullaryInputExpression
6
8
  def success?(_headings, _lexeme, _heading_values)
7
9
  true
8
- end
10
+ end
9
11
  end # class
10
12
  end # module
11
- end # module
13
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  unless defined?(Zenlish::Lang::Dictionary)
2
4
  require_relative '../feature/feature_struct_def_bearer'
3
5
  module Zenlish
@@ -9,7 +11,7 @@ unless defined?(Zenlish::Lang::Dictionary)
9
11
  sandbox = Object.new
10
12
  sandbox.extend(Zenlish::Lex::EmptyLexiconFactory)
11
13
  Dictionary = sandbox.create_empty_lexicon
12
- self.extend(Feature::FeatureStructDefBearer)
14
+ extend(Feature::FeatureStructDefBearer)
13
15
 
14
16
  # @param aLemma [String] is the canonical form, dictionary form,
15
17
  # or citation form of a headword.
@@ -18,6 +20,7 @@ unless defined?(Zenlish::Lang::Dictionary)
18
20
  entry = Zenlish::Lex::LexicalEntry.new(aLemma)
19
21
  wclass = Dictionary.name2terminal[aWClassName]
20
22
  raise StandardError, "Undefined word class for '#{aLemma}'" unless wclass
23
+
21
24
  lexeme = Zenlish::Lex::Lexeme.new(wclass, entry, aFeatureHash)
22
25
  lexeme.instance_exec(&aBlock) if block_given?
23
26
  lexeme.freeze
@@ -90,17 +93,17 @@ unless defined?(Zenlish::Lang::Dictionary)
90
93
  end
91
94
  add_entry('here', 'Adverb')
92
95
  # example: ...from here (works as a pronoun of a place)
93
- add_entry('here', 'CommonNoun', {'NUMBER' => enumeration(:singular),
94
- 'PARADIGM' => [identifier, 'Singular_only']})
96
+ add_entry('here', 'CommonNoun', { 'NUMBER' => enumeration(:singular),
97
+ 'PARADIGM' => [identifier, 'Singular_only'] })
95
98
  add_entry('I', 'PersonalPronoun', { 'PERSON' => enumeration(:first),
96
99
  'GENDER' => enumeration(:feminine, :masculine) })
97
100
  add_entry('if', 'SubordinatingConjunction')
98
101
  add_entry('in', 'Preposition')
99
102
  add_entry('inside', 'Preposition')
100
103
  add_entry('it', 'PersonalPronoun', { 'PERSON' => enumeration(:third),
101
- 'PARADIGM' => [identifier, 'ppn_3rd_paradigm']})
104
+ 'PARADIGM' => [identifier, 'ppn_3rd_paradigm'] })
102
105
  add_entry('its', 'PossessiveDeterminer', { 'PERSON' => enumeration(:third),
103
- 'PARADIGM' => [identifier, 'possdet_3rd_paradigm']})
106
+ 'PARADIGM' => [identifier, 'possdet_3rd_paradigm'] })
104
107
  add_entry('kind', 'CommonNoun')
105
108
  add_entry('know', 'IrregularVerbKnow') do
106
109
  forms past_simple: 'knew', past_participle: 'known'
@@ -120,13 +123,13 @@ unless defined?(Zenlish::Lang::Dictionary)
120
123
  add_entry('more', 'Adverb')
121
124
  add_entry('move', 'RegularVerb')
122
125
  add_entry('much', 'Adverb')
123
- add_entry('my', 'PossessiveDeterminer',{ 'PERSON' => enumeration(:first),
124
- 'GENDER' => enumeration(:feminine, :masculine)})
126
+ add_entry('my', 'PossessiveDeterminer', { 'PERSON' => enumeration(:first),
127
+ 'GENDER' => enumeration(:feminine, :masculine) })
125
128
  add_entry('near', 'Preposition')
126
129
  add_entry('near to', 'Preposition')
127
130
  add_entry('now', 'Adverb')
128
- add_entry('now', 'CommonNoun', {'NUMBER' => enumeration(:singular),
129
- 'PARADIGM' => [identifier, 'Singular_only']})
131
+ add_entry('now', 'CommonNoun', { 'NUMBER' => enumeration(:singular),
132
+ 'PARADIGM' => [identifier, 'Singular_only'] })
130
133
  add_entry('not', 'AdverbNot')
131
134
  add_entry('of', 'PrepositionOf')
132
135
  add_entry('on', 'Preposition')
@@ -136,10 +139,10 @@ unless defined?(Zenlish::Lang::Dictionary)
136
139
  add_entry('or', 'Coordinator')
137
140
  add_entry('other', 'Adjective')
138
141
  add_entry('part', 'CommonNoun')
139
- add_entry('people', 'CommonNoun', {'NUMBER' => enumeration(:plural),
140
- 'PARADIGM' => [identifier, 'Plural_only']})
141
- add_entry('person', 'CommonNoun', {'NUMBER' => enumeration(:singular),
142
- 'PARADIGM' => [identifier, 'Singular_only']})
142
+ add_entry('people', 'CommonNoun', { 'NUMBER' => enumeration(:plural),
143
+ 'PARADIGM' => [identifier, 'Plural_only'] })
144
+ add_entry('person', 'CommonNoun', { 'NUMBER' => enumeration(:singular),
145
+ 'PARADIGM' => [identifier, 'Singular_only'] })
143
146
  add_entry('place', 'CommonNoun')
144
147
  add_entry('same', 'Adjective')
145
148
  add_entry('same', 'Pronoun')
@@ -188,10 +191,10 @@ unless defined?(Zenlish::Lang::Dictionary)
188
191
  add_entry('word', 'CommonNoun')
189
192
  add_entry('you', 'PersonalPronoun', { 'PERSON' => enumeration(:second),
190
193
  'GENDER' => enumeration(:feminine, :masculine),
191
- 'PARADIGM' => [identifier, 'ppn_2nd_paradigm']})
194
+ 'PARADIGM' => [identifier, 'ppn_2nd_paradigm'] })
192
195
  add_entry('your', 'PossessiveDeterminer', { 'PERSON' => enumeration(:second),
193
196
  'GENDER' => enumeration(:feminine, :masculine),
194
- 'PARADIGM' => [identifier, 'possdet_2nd_paradigm']})
197
+ 'PARADIGM' => [identifier, 'possdet_2nd_paradigm'] })
195
198
 
196
199
  # Punctuation signs...
197
200
  add_entry(':', 'Colon')
@@ -200,4 +203,4 @@ unless defined?(Zenlish::Lang::Dictionary)
200
203
  add_entry('"', 'Quote')
201
204
  end # module
202
205
  end # module
203
- end # defined?
206
+ end # defined?
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../trie/trie'
4
+
5
+ module Zenlish
6
+ module Lang
7
+ class Lemmatizer
8
+ # @return [Trie:Trie] Trie (aka prefix tree) with all word forms from dictionary.
9
+ attr_reader :trie
10
+
11
+ def initialize(aLexicon)
12
+ @trie = Trie::Trie.new
13
+ initialize_trie(aLexicon)
14
+ end
15
+
16
+ def lemmatize(aWordForm, _hints = nil)
17
+ node = trie.search(aWordForm)
18
+ node&.value
19
+ end
20
+
21
+ private
22
+
23
+ def initialize_trie(aLexicon)
24
+ aLexicon.entries.each do |ent|
25
+ citation_form = ent.lemma
26
+ ent.lexemes.each do |lxm|
27
+ if lxm.wclass.kind_of?(Zenlish::WClasses::WordClass)
28
+ if lxm.wclass.invariable?
29
+ trie.add(citation_form, lxm)
30
+ else
31
+ w_forms = lxm.all_inflections
32
+ w_forms.each { |form| trie.add(form, lxm) }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end # class
39
+ end # module
40
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Grammar for a simple subset of English language
2
4
  # It is called Zenlish
3
5
 
@@ -6,7 +8,7 @@ require_relative 'dictionary'
6
8
 
7
9
  ########################################
8
10
  # Define a grammar for a highly English-like language
9
- builder = Rley::Syntax::GrammarBuilder.new do
11
+ builder = Rley::grammar_builder do
10
12
  add_terminals(*Zenlish::Lang::Dictionary.terminals)
11
13
 
12
14
  rule 'zenlish' => 'prose'
@@ -19,7 +21,7 @@ builder = Rley::Syntax::GrammarBuilder.new do
19
21
  #################
20
22
  # Simple sentence
21
23
  #################
22
- rule 'simple_sentence' => 'front_adverb simple_sentence'
24
+ rule 'simple_sentence' => 'front_adverb simple_sentence'
23
25
  rule 'front_adverb' => 'AdverbMaybe'
24
26
  rule 'front_adverb' => 'Adverb'
25
27
  rule 'simple_sentence' => 'declarative_simple_sentence'
@@ -107,7 +109,7 @@ builder = Rley::Syntax::GrammarBuilder.new do
107
109
  rule 'comparative_start' => 'ComparativeParticle'
108
110
  rule 'conjunctive_prefix' => 'ConjunctivePronoun noun_phrase verb_phrase'
109
111
  rule 'identifying_clause' => 'RelativePronoun tense_verb_phrase'
110
- rule 'relative_clause_opt' => 'relative_clause'
112
+ rule 'relative_clause_opt' => 'relative_clause'
111
113
  rule 'relative_clause_opt' => []
112
114
  rule 'relative_clause' => 'RelativePronoun tense_phrase'
113
115
  # Sentence 3-Bxa 'Lisa sees a living thing that is very big.
@@ -294,7 +296,7 @@ builder = Rley::Syntax::GrammarBuilder.new do
294
296
  # complementation by a verb: gerund -ing form...
295
297
  rule 'preposition_object' => 'noun_phrase_opt lexical_verb post_head_vp'
296
298
  # preposition_object => "a gerund (a verb form ending in "-ing") that acts as a noun # Example: He beat Lee without overly trying.
297
- rule 'preposition_object' => 'conjunctive_prefix' # It's obvious from _what he said_.
299
+ rule 'preposition_object' => 'conjunctive_prefix' # It's obvious from _what he said_.
298
300
  rule 'preposition_object' => []
299
301
 
300
302
  ######################
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../wclasses/all_word_classes'
2
4
  require_relative 'lexicon'
3
5
 
@@ -7,7 +9,7 @@ module Zenlish
7
9
  # Factory method. Helps in creating an "empty" lexicon.
8
10
  # It just contains the word classes of Zenlish but no headwords.
9
11
  # @return [Lexicon] the created lexicon object
10
- def create_empty_lexicon()
12
+ def create_empty_lexicon
11
13
  lexicon = Lexicon.new
12
14
 
13
15
  add_word_classes(lexicon)
@@ -73,7 +75,6 @@ module Zenlish
73
75
  def add_wclass(aLexicon, aClass)
74
76
  aLexicon.add_terminal(aClass.new.freeze)
75
77
  end
76
-
77
78
  end # module
78
79
  end # module
79
80
  end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../feature/feature_struct_def_bearer'
2
4
  module Zenlish
3
5
  module Lex
@@ -20,7 +22,7 @@ module Zenlish
20
22
  anEntry.add_lexeme(self)
21
23
  if aWClass.kind_of?(WClasses::WordClass)
22
24
  unless wclass.extension.nil?
23
- self.extend(wclass.extension)
25
+ extend(wclass.extension)
24
26
  init_extension(self)
25
27
  end
26
28
  p_struct = aWClass.kind_of?(WClasses::WordClass) ? aWClass.struct : nil
@@ -41,11 +43,11 @@ module Zenlish
41
43
  table = paradigm
42
44
  table.inflect(self, constraints)
43
45
  end
44
-
46
+
45
47
  def all_inflections
46
48
  table = paradigm
47
49
  table.all_inflections(self)
48
- end
50
+ end
49
51
 
50
52
  # @return [String] the base (dictionary) form.
51
53
  def lemma
@@ -62,4 +64,4 @@ module Zenlish
62
64
  alias base_form lemma
63
65
  end # class
64
66
  end # module
65
- end # module
67
+ end # module
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Lex
3
5
  # TODO: document
4
6
  class LexicalEntry
5
- #@return [String] the lemma (dictionary) form of a word.
7
+ # @return [String] the lemma (dictionary) form of a word.
6
8
  attr_reader :lemma
7
9
 
8
10
  # @return [Array<Lexeme, Rley::Syntax::Terminal>]
9
11
  attr_reader :lexemes
10
12
 
11
- # @param theLemma [String] lemma (= citation form), a word form used
13
+ # @param theLemma [String] lemma (= citation form), a word form used
12
14
  # conventionnaly to represent a lexeme.
13
15
  # @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
14
16
  def initialize(theLemma, aLexeme = nil)
@@ -17,10 +19,10 @@ module Zenlish
17
19
  add_lexeme(aLexeme)
18
20
  end
19
21
 
20
- # @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
22
+ # @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
21
23
  def add_lexeme(aLexeme)
22
24
  lexemes << aLexeme if aLexeme
23
25
  end
24
26
  end # class
25
27
  end # module
26
- end # module
28
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Lex
3
5
  # A lexicon is a collection of lexical entries.
@@ -5,7 +7,7 @@ module Zenlish
5
7
  class Lexicon
6
8
  # @return [Array<Lex::LexicalEntry>] entries in the lexicon
7
9
  attr_reader :entries
8
-
10
+
9
11
  # @return [Hash{String => Lex::LexicalEntry}] the lexical entry for the given lemma.
10
12
  attr_reader :lemma2entry
11
13
 
@@ -23,7 +25,7 @@ module Zenlish
23
25
  end
24
26
 
25
27
  # @param aLemma[String] retrieve the lexeme form the given "head word".
26
- # @param aWordClass [WordClasses::WordClass, NilClass] the word class of
28
+ # @param aWordClass [WordClasses::WordClass, NilClass] the word class of
27
29
  # the lexeme.
28
30
  # @return [Lex::Lexeme]
29
31
  def get_lexeme(aLemma, aWordClass = nil)
@@ -83,7 +85,6 @@ module Zenlish
83
85
  aHash[aKey] = aValue
84
86
  end
85
87
  end
86
-
87
88
  end # class
88
89
  end # module
89
90
  end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rley'
2
4
 
3
5
  module Zenlish
@@ -7,7 +9,7 @@ module Zenlish
7
9
  attr_reader :zlexeme
8
10
 
9
11
  # initialize(theLexeme, aTerminal, aPosition) ⇒ Token
10
- # @param literalText [String] the portion of input text that represents
12
+ # @param literalText [String] the portion of input text that represents
11
13
  # an occurence of the lexeme.
12
14
  # @param aLexeme [Lex::Lexeme] the lexeme matched by the literal text.
13
15
  # @param aPosition [Integer] the position of the literal in the input.