zenlish 0.2.01 → 0.2.02

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18b53b01ebe8e3f9a895026ae2b63c7753081ed12572a16d75dc35f943b479e9
4
- data.tar.gz: 74def3a1abe88f1fa457ee151bd2420c682aedbeecf36a62a857b5e0327e43ab
3
+ metadata.gz: 5a4f38ce593249cf97998ec7d51977400b6bb1445a368823b3c8db0f779aec41
4
+ data.tar.gz: 30e519af42ccf67586f3314892d63a8150200e671a4c42e5185154746ea2218d
5
5
  SHA512:
6
- metadata.gz: a7d8a33af3c91ab977a7f7ca9addd6ba0929e662c599dd0e5d3d5bbb3c3eb4ced11f765ce7e62c59e152600cccc94122e33066416faaab66c2893a207d89de6c
7
- data.tar.gz: 9649988e311bfaccd0ed8ca12b1c648eddec01b27f4b3549c7518cb62e725ed03ecfb1c2de1459434b0a481aaa68bff1a4f978cf4ae33f7a3983e35b3614efe7
6
+ metadata.gz: 007460f06685b5a84c239b70f14503d1420deffd8291b087bea657a966292e3c04be01f3dd973cbd7e6f543ba1e0daf86afad73d2085da2b7c23ad5c3e3e7624
7
+ data.tar.gz: 9a3a5904dfd78edbb50a7886d1d830e400619039bc736760356381c9845dd9ec2919089c0803c64ffef89b2d9d55fe0b061b4542e25a1371550c6863a7d4aafa
@@ -9,8 +9,9 @@ script:
9
9
  - bundle exec rake
10
10
 
11
11
  rvm:
12
- - 2.6.3
13
- - 2.5.5
12
+ - 2.7.0
13
+ - 2.6.5
14
+ - 2.5.7
14
15
  - 2.4.6
15
16
  - jruby-9.1.9.0
16
17
 
@@ -1,4 +1,19 @@
1
1
  # CHANGELOG
2
+ ## [0.2.02] - 2020-02-06
3
+ Extending the inflection model to irregular verbs. Zenlish can inflect all irregular verbs in its dictionary (except modals and be).
4
+
5
+ ### Added
6
+ - Module `WordClasses::IreegularVerbExtension` mix-in module for extending the lexeme for irregular verbs.
7
+
8
+ ### Changed
9
+ - File `dictionary.rb`: added past simple and past participles to most irregular verbs in lexicon.
10
+ - Class `Lex::Lexeme`: added capability of word class to add dynamically extension (specialization) to lexeme instances.
11
+ - Class `WordClass::IrregularVerb` added inflection table.
12
+ - File `.travis.yml` Added Ruby 2.7 and increased version number for other rubies.
13
+
14
+ ### Fixed
15
+ - Class `WordClass::RegularVerb` fixed rules for gerund spelling.
16
+
2
17
  ## [0.2.01] - 2020-02-02
3
18
  Extending the inflection table capabilities.
4
19
  Extending the inflection model to regular verbs. Zenlish can inflect all regular verbs in its dictionary.
@@ -26,7 +41,7 @@ This is WIP.
26
41
  ## [0.1.25] - 2019-12-06
27
42
  __Zenlish__ can parse all sentences in lesson 1, 2 and 3-A .. 3-G (352 sentences in total) from
28
43
  [Learn These Words First](http://learnthesewordsfirst.com/).
29
-
44
+
30
45
  ### Changed
31
46
  - File `lesson3_spec.rb`: tests include all sentences from lesson 3-A to 3-G.
32
47
  - `ZenlishGrammar`: refactoring of the predicative_sentence rules.
@@ -40,7 +55,7 @@ __Zenlish__ can parse all sentences in lesson 1, 2 and 3-A .. 3-F (323 sentences
40
55
  ### Added
41
56
  - Class `ModalVerbCould` to represent the auxiliary verb `could`.
42
57
  - Support module `Var2Word`: used to create variable names and assign them specific `Literal` objects.
43
-
58
+
44
59
  ### Changed
45
60
  - File `zparser_spec.rb` splitted. Lesson-specific test suites have their own spec file.
46
61
  - File `lesson3_spec.rb`: tests include all sentences from lesson 3-A .. 3-F.
@@ -73,7 +88,7 @@ __Zenlish__ can parse all sentences in lesson 1, 2 and 3-A .. 3-C from
73
88
  [Learn These Words First](http://learnthesewordsfirst.com/).
74
89
 
75
90
  ### Added
76
- - Class `DistributiveDeterminer` to represent the words `each`, `every`, `either`, `neither`.
91
+ - Class `DistributiveDeterminer` to represent the words `each`, `every`, `either`, `neither`.
77
92
  - Class `FrontingQuantifier` to represent the quantifiers `all` and `both`.
78
93
 
79
94
  ### Changed
@@ -140,7 +155,7 @@ __Zenlish__ can parse all sentences in lesson 1 and 2-A..2-H from
140
155
  ## [0.1.16] - 2019-11-23
141
156
  __Zenlish__ can parse all sentences in lesson 1 and 2-A..2-G from
142
157
  [Learn These Words First](http://learnthesewordsfirst.com/).
143
-
158
+
144
159
  ### Changed
145
160
  - `ZenlishGrammar`: Vast grammar reworking.
146
161
  - File `dictionary.rb`: `there` in lexicon has `ExistentialThere` as word class.
@@ -43,7 +43,9 @@ unless defined?(Zenlish::Lang::Dictionary)
43
43
  add_entry('be', 'AuxiliaryBe')
44
44
  add_entry('be', 'IrregularVerbBe')
45
45
  add_entry('because', 'SubordinatingConjunction')
46
- add_entry('become', 'IrregularLinkingVerb')
46
+ add_entry('become', 'IrregularLinkingVerb') do
47
+ forms past_simple: 'became', past_participle: 'become'
48
+ end
47
49
  add_entry('before', 'Adverb')
48
50
  add_entry('before', 'Adjective')
49
51
  add_entry('before', 'Preposition')
@@ -58,7 +60,9 @@ unless defined?(Zenlish::Lang::Dictionary)
58
60
  add_entry('can', 'ModalVerbCan')
59
61
  add_entry('cause', 'RegularVerb')
60
62
  add_entry('change', 'RegularVerb')
61
- add_entry('choose', 'IrregularVerb')
63
+ add_entry('choose', 'IrregularVerb') do
64
+ forms past_simple: 'chose', past_participle: 'chosen'
65
+ end
62
66
  add_entry('contain', 'RegularVerb')
63
67
  add_entry('container', 'CommonNoun')
64
68
  add_entry('could', 'ModalVerbCould')
@@ -67,14 +71,18 @@ unless defined?(Zenlish::Lang::Dictionary)
67
71
  add_entry('difficult', 'Adjective')
68
72
  add_entry('different', 'Adjective')
69
73
  add_entry('do', 'AuxiliaryDo')
70
- add_entry('do', 'IrregularVerbDo')
74
+ add_entry('do', 'IrregularVerbDo') do
75
+ forms past_simple: 'did', past_participle: 'done'
76
+ end
71
77
  add_entry('each', 'DistributiveDeterminer')
72
78
  add_entry('each', 'Pronoun')
73
79
  add_entry('exist', 'RegularVerb')
74
80
  add_entry('false', 'Adjective')
75
81
  add_entry('far', 'Adverb')
76
82
  add_entry('far from', 'Preposition')
77
- add_entry('feel', 'IrregularLinkingVerb')
83
+ add_entry('feel', 'IrregularLinkingVerb') do
84
+ forms past_simple: 'felt', past_participle: 'felt'
85
+ end
78
86
  add_entry('for', 'Preposition')
79
87
  add_entry('from', 'Preposition')
80
88
  add_entry('good', 'Adjective')
@@ -92,13 +100,17 @@ unless defined?(Zenlish::Lang::Dictionary)
92
100
  add_entry('it', 'PersonalPronoun')
93
101
  add_entry('its', 'PossessiveDeterminer')
94
102
  add_entry('kind', 'CommonNoun')
95
- add_entry('know', 'IrregularVerbKnow')
103
+ add_entry('know', 'IrregularVerbKnow') do
104
+ forms past_simple: 'knew', past_participle: 'known'
105
+ end
96
106
  add_entry('like', 'Preposition')
97
107
  add_entry('live', 'RegularVerb')
98
108
  add_entry('living', 'Adjective')
99
109
  add_entry('long', 'Adjective')
100
110
  add_entry('machine', 'CommonNoun')
101
- add_entry('make', 'IrregularVerb')
111
+ add_entry('make', 'IrregularVerb') do
112
+ forms past_simple: 'made', past_participle: 'made'
113
+ end
102
114
  add_entry('many', 'Quantifier')
103
115
  add_entry('maybe', 'AdverbMaybe')
104
116
  add_entry('me', 'PersonalPronoun')
@@ -129,8 +141,12 @@ unless defined?(Zenlish::Lang::Dictionary)
129
141
  add_entry('place', 'CommonNoun')
130
142
  add_entry('same', 'Adjective')
131
143
  add_entry('same', 'Pronoun')
132
- add_entry('say', 'IrregularVerbSay')
133
- add_entry('see', 'IrregularVerb')
144
+ add_entry('say', 'IrregularVerbSay') do
145
+ forms past_simple: 'said', past_participle: 'said'
146
+ end
147
+ add_entry('see', 'IrregularVerb') do
148
+ forms past_simple: 'saw', past_participle: 'seen'
149
+ end
134
150
  add_entry('short', 'Adjective')
135
151
  add_entry('side', 'CommonNoun')
136
152
  add_entry('small', 'Adjective')
@@ -148,7 +164,9 @@ unless defined?(Zenlish::Lang::Dictionary)
148
164
  add_entry('there', 'ExistentialThere')
149
165
  add_entry('they', 'PersonalPronoun')
150
166
  add_entry('thing', 'CommonNoun')
151
- add_entry('think', 'IrregularVerbThink')
167
+ add_entry('think', 'IrregularVerbThink') do
168
+ forms past_simple: 'thought', past_participle: 'thought'
169
+ end
152
170
  add_entry('this', 'DemonstrativeDeterminer')
153
171
  add_entry('this', 'DemonstrativePronoun')
154
172
  add_entry('this one', 'DemonstrativePronoun')
@@ -18,10 +18,15 @@ module Zenlish
18
18
  @wclass = aWClass
19
19
  @entry = anEntry.object_id
20
20
  anEntry.add_lexeme(self)
21
-
22
- p_struct = aWClass.kind_of?(WClasses::WordClass) ? aWClass.struct : nil
23
- overriding_struct_defs = aFeatureHash.nil? ? {} : aFeatureHash
24
- init_struct_def(p_struct, overriding_struct_defs)
21
+ if aWClass.kind_of?(WClasses::WordClass)
22
+ unless wclass.extension.nil?
23
+ self.extend(wclass.extension)
24
+ init_extension(self)
25
+ end
26
+ p_struct = aWClass.kind_of?(WClasses::WordClass) ? aWClass.struct : nil
27
+ overriding_struct_defs = aFeatureHash.nil? ? {} : aFeatureHash
28
+ init_struct_def(p_struct, overriding_struct_defs)
29
+ end
25
30
  end
26
31
 
27
32
  # @return [Zenlish::Lex::LexicalEntry] Link to its dictionary entry (headword)
@@ -2,18 +2,25 @@ module Zenlish
2
2
  module Lex
3
3
  # TODO: document
4
4
  class LexicalEntry
5
+ #@return [String] the lemma (dictionary) form of a word.
5
6
  attr_reader :lemma
7
+
8
+ # @return [Array<Lexeme, Rley::Syntax::Terminal>]
6
9
  attr_reader :lexemes
7
-
10
+
11
+ # @param theLemma [String] lemma (= citation form), a word form used
12
+ # conventionnaly to represent a lexeme.
13
+ # @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
8
14
  def initialize(theLemma, aLexeme = nil)
9
15
  @lemma = theLemma.dup
10
16
  @lexemes = []
11
17
  add_lexeme(aLexeme)
12
18
  end
13
-
19
+
20
+ # @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
14
21
  def add_lexeme(aLexeme)
15
22
  lexemes << aLexeme if aLexeme
16
23
  end
17
24
  end # class
18
- end # module
25
+ end # module
19
26
  end # module
@@ -5,6 +5,8 @@ module Zenlish
5
5
  class Lexicon
6
6
  # @return [Array<Lex::LexicalEntry>] entries in the lexicon
7
7
  attr_reader :entries
8
+
9
+ # @return [Hash{String => Lex::LexicalEntry}] the lexical entry for the given lemma.
8
10
  attr_reader :lemma2entry
9
11
 
10
12
  # The list of terminal symbols. Examples of terminal symbols:
@@ -23,6 +25,7 @@ module Zenlish
23
25
  # @param aLemma[String] retrieve the lexeme form the given "head word".
24
26
  # @param aWordClass [WordClasses::WordClass, NilClass] the word class of
25
27
  # the lexeme.
28
+ # @return [Lex::Lexeme]
26
29
  def get_lexeme(aLemma, aWordClass = nil)
27
30
  if aWordClass
28
31
  lexeme = nil
@@ -51,11 +54,13 @@ module Zenlish
51
54
  end
52
55
  end
53
56
 
57
+ # @param aTerminal [Rley::Syntax::Terminal]
54
58
  def add_terminal(aTerminal)
55
59
  terminals << aTerminal
56
60
  name2terminal[aTerminal.name] = aTerminal
57
61
  end
58
62
 
63
+ # @param anEntry [Lex::LexicalEntry]
59
64
  def add_entry(anEntry)
60
65
  entries << anEntry
61
66
  lemma = anEntry.lemma
@@ -1,3 +1,3 @@
1
1
  module Zenlish
2
- VERSION = '0.2.01'.freeze
2
+ VERSION = '0.2.02'.freeze
3
3
  end
@@ -4,6 +4,10 @@ module Zenlish
4
4
  module WClasses
5
5
  # TODO: document
6
6
  class Adjective < WordClass
7
+ # @return [FalseClass] Indicates that an adjective may inflect.
8
+ def invariable?
9
+ false
10
+ end
7
11
  end # class
8
12
  end # module
9
13
  end # module
@@ -3,7 +3,7 @@ require_relative 'word_class'
3
3
  module Zenlish
4
4
  module WClasses
5
5
  # TODO: document
6
- class Adverb < WordClass
6
+ class Adverb < WordClass
7
7
  end # class
8
8
  end # module
9
9
  end # module
@@ -4,7 +4,7 @@ module Zenlish
4
4
  module WClasses
5
5
  # TODO: document
6
6
  # Example: 'as' in 'same ... as'
7
- class ComparativeParticle < WordClass
7
+ class ComparativeParticle < WordClass
8
8
  end # class
9
9
  end # module
10
10
  end # module
@@ -6,7 +6,7 @@ module Zenlish
6
6
  # can join words, phrases, and clauses that share some logical relationhip
7
7
  # Common coordinators are enumerated in the FANBOYS acronym:
8
8
  # For, And, Nor, But, Or, Yet and So.
9
- class Coordinator < WordClass
9
+ class Coordinator < WordClass
10
10
  end # class
11
11
  end # module
12
12
  end # module
@@ -3,7 +3,7 @@ require_relative 'word_class'
3
3
  module Zenlish
4
4
  module WClasses
5
5
  # TODO: document
6
- class Determiner < WordClass
6
+ class Determiner < WordClass
7
7
  end # class
8
8
  end # module
9
9
  end # module
@@ -3,7 +3,7 @@ require_relative 'quantifier'
3
3
  module Zenlish
4
4
  module WClasses
5
5
  # Quantifiers that appear in front of determiners: all, both
6
- class FrontingQuantifier < Quantifier
6
+ class FrontingQuantifier < Quantifier
7
7
  end # class
8
8
  end # module
9
9
  end # module
@@ -1,4 +1,5 @@
1
1
  require_relative 'lexical_verb'
2
+ require_relative 'irregular_verb_extension'
2
3
 
3
4
  module Zenlish
4
5
  module WClasses
@@ -8,26 +9,51 @@ module Zenlish
8
9
 
9
10
  def initialize
10
11
  super()
12
+ @paradigms = {}
11
13
  init_feature_defs
14
+ init_paradigms
12
15
  end
13
-
14
- def past_simple
15
- raise StandardError
16
- end
17
-
18
- def past_participle
19
- raise StandardError
20
- end
16
+
17
+ # The mix-in module used to extend the lexeme
18
+ # @return [Module, NilClass]
19
+ def extension
20
+ IrregularVerbExtension
21
+ end
21
22
 
22
23
  private
23
-
24
+
24
25
  def init_feature_defs
25
- super()
26
- # Define standard feature definitions for irregular verbs.
27
- feature_def_dsl {
28
- feature_def 'PARADIGM' => [identifier, 'Irregular_form'] # 2nd item is default value
26
+ super
27
+ # Create standard feature definitions for irregular verbs.
28
+ feature_def_dsl {
29
+ feature_def 'PARADIGM' => [identifier, 'Irregular_inflection'] # 2nd item is default value
29
30
  }
30
31
  end
32
+
33
+ def init_paradigms
34
+ builder = Inflect::InflectionTableBuilder.new
35
+ table = builder.build('Irregular_inflection') do
36
+ feature_heading 'PERSON'
37
+ feature_heading 'NUMBER'
38
+ feature_heading 'TIME'
39
+ method_heading 'base_form'
40
+ # PERSON NUMBER TIME base_form
41
+ rule([not_equal(:third), dont_care, equals(:present), dont_care], col('base_form'))
42
+ rule([equals(:third), equals(:singular), equals(:present), matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies'))
43
+ rule([equals(:third), equals(:singular), equals(:present), matches(/(?:[osxz]|ch|sh)$/)], concat(col('base_form'), 'es'))
44
+ rule([equals(:third), equals(:singular), equals(:present), dont_care], concat(col('base_form'), 's'))
45
+ rule([dont_care, dont_care, equals(:progressive), matches(/ie$/)], sub(col('base_form'), /ie$/, 'ying'))
46
+ rule([dont_care, dont_care, equals(:progressive), matches(/[^e]e$/)], sub(col('base_form'), /e$/, 'ing'))
47
+ rule([dont_care, dont_care, equals(:progressive), dont_care], concat(col('base_form'), 'ing'))
48
+ rule([dont_care, dont_care, equals(:past_simple), dont_care], func('past_simple'))
49
+ rule([dont_care, dont_care, equals(:past_participle), dont_care], func('past_participle'))
50
+ end
51
+ add_paradigm(table)
52
+ end
53
+
54
+ def add_paradigm(anInflectionTable)
55
+ @paradigms[anInflectionTable.name] = anInflectionTable
56
+ end
31
57
  end # class
32
58
  end # module
33
59
  end # module
@@ -0,0 +1,39 @@
1
+ require_relative 'lexical_verb'
2
+ require_relative 'irregular_verb_extension'
3
+
4
+ module Zenlish
5
+ module WClasses
6
+ module IrregularVerbExtension
7
+ # This callback when the module is extending an object.
8
+ # Purpose: to inject a number of instance variables in the host
9
+ # def extended(host)
10
+ def init_extension(host)
11
+ host.instance_variable_set(:@forms, [])
12
+ end
13
+
14
+ # @param theForm [Hash{Symbol => String}]
15
+ def forms(theForms)
16
+ valid_symbols = [:past_simple, :past_participle]
17
+ actual_symbols = theForms.keys
18
+ actual_symbols.each do |symb|
19
+ raise StandardError, "Invalid verb form #{symb}" unless valid_symbols.include?(symb)
20
+ end
21
+ if actual_symbols.size < valid_symbols.size
22
+ missing = valid_symbols.find { |symb| !actual_symbols.include?(symb) }
23
+ raise StandardError, "Missing form #{missing}"
24
+ end
25
+ @forms = [nil, nil]
26
+ @forms[0] = theForms[valid_symbols[0]]
27
+ @forms[1] = theForms[valid_symbols[1]]
28
+ end
29
+
30
+ def past_simple
31
+ @forms.first
32
+ end
33
+
34
+ def past_participle
35
+ @forms.last
36
+ end
37
+ end # class
38
+ end # module
39
+ end # module
@@ -3,12 +3,7 @@ require_relative 'word_class'
3
3
  module Zenlish
4
4
  module WClasses
5
5
  # TODO: document
6
- class Preposition < WordClass
7
-
8
- # Prepositions do not inflect, so they're invariable.
9
- def invariable?
10
- true
11
- end
6
+ class Preposition < WordClass
12
7
  end # class
13
8
  end # module
14
9
  end # module
@@ -3,7 +3,7 @@ require_relative 'word_class'
3
3
  module Zenlish
4
4
  module WClasses
5
5
  # TODO: document
6
- class Pronoun < WordClass
6
+ class Pronoun < WordClass
7
7
  end # class
8
8
  end # module
9
9
  end # module
@@ -4,7 +4,7 @@ module Zenlish
4
4
  module WClasses
5
5
  # Quantifiers are used to indicate the number or quantity of the noun under consideration.
6
6
  # enough, few, little, many, more, most, much, none, several, some
7
- class Quantifier < Determiner
7
+ class Quantifier < Determiner
8
8
  end # class
9
9
  end # module
10
10
  end # module
@@ -2,7 +2,6 @@ require_relative 'lexical_verb'
2
2
 
3
3
  module Zenlish
4
4
  module WClasses
5
- # TODO: document 'touch'
6
5
  class RegularVerb < LexicalVerb
7
6
  def initialize
8
7
  super
@@ -24,8 +23,9 @@ module Zenlish
24
23
  rule([equals(:third), equals(:singular), equals(:present), matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies'))
25
24
  rule([equals(:third), equals(:singular), equals(:present), matches(/(?:[osxz]|ch|sh)$/)], concat(col('base_form'), 'es'))
26
25
  rule([equals(:third), equals(:singular), equals(:present), dont_care], concat(col('base_form'), 's'))
27
- rule([dont_care, dont_care, equals(:progressive), matches(/e$/)], sub(col('base_form'), /e$/, 'ing'))
28
- rule([dont_care, dont_care, equals(:progressive), dont_care], concat(col('base_form'), 'ing'))
26
+ rule([dont_care, dont_care, equals(:progressive), matches(/ie$/)], sub(col('base_form'), /ie$/, 'ying'))
27
+ rule([dont_care, dont_care, equals(:progressive), matches(/[^e]e$/)], sub(col('base_form'), /e$/, 'ing'))
28
+ rule([dont_care, dont_care, equals(:progressive), dont_care], concat(col('base_form'), 'ing'))
29
29
  rule([dont_care, dont_care, in?(:past_simple, :past_participle), matches(/e$/)], concat(col('base_form'), 'd'))
30
30
  rule([dont_care, dont_care, in?(:past_simple, :past_participle), matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ied'))
31
31
  rule([dont_care, dont_care, in?(:past_simple, :past_participle), dont_care], concat(col('base_form'), 'ed'))
@@ -10,7 +10,7 @@ module Zenlish
10
10
  # Common subordinating conjunctions: after, although, as, because, before,
11
11
  # how, if, once, since, than, that, though, till, until, when, where,
12
12
  # whether, while
13
- class SubordinatingConjunction < WordClass
13
+ class SubordinatingConjunction < WordClass
14
14
  end # class
15
15
  end # module
16
16
  end # module
@@ -27,8 +27,14 @@ module Zenlish
27
27
 
28
28
  # Indicates whether all words from the word class have a single (uninflected)
29
29
  # form.
30
+ # @return [FalseClass, TrueClass] true iff the words in the class are invariable.
30
31
  def invariable?
31
- raise NotImplementedError, "Missing implementation for #{self.class}."
32
+ return true
33
+ end
34
+
35
+ # @return [Module, NilClass]
36
+ def extension
37
+ nil
32
38
  end
33
39
  end # class
34
40
  end # module
@@ -174,33 +174,32 @@ module Zenlish
174
174
  expect(table.inflect(verb_4, [nil, nil, :past_participle, nil])).to eq('caused')
175
175
  end
176
176
 
177
- # MockIrregularVerb = Struct.new(:base_form, :PERSON, :NUMBER, :TIME)
178
- # it 'should build default paradigm for irregular verbs' do
179
- # table = subject.build('Irregular_form') do
180
- # feature_heading 'PERSON'
181
- # feature_heading 'NUMBER'
182
- # feature_heading 'TIME'
183
- # method_heading 'base_form'
184
- # # PERSON NUMBER TIME base_form
185
- # rule([not_equal(:third), dont_care, equals(:present), dont_care], col('base_form'))
186
- # rule([equals(:third), equals(:singular), equals(:present), matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies'))
187
- # rule([equals(:third), equals(:singular), equals(:present), matches(/(?:[osxz]|ch|sh)$/)], concat(col('base_form'), 'es'))
188
- # rule([equals(:third), equals(:singular), equals(:present), dont_care], concat(col('base_form'), 's'))
189
- # rule([dont_care, dont_care, equals(:progressive), matches(/e$/)], sub(col('base_form'), /e$/, 'ing'))
190
- # rule([dont_care, dont_care, equals(:progressive), dont_care], concat(col('base_form'), 'ing'))
191
- # rule([dont_care, dont_care, in?(:past_simple, :past_participle), matches(/e$/)], concat(col('base_form'), 'd'))
192
- # rule([dont_care, dont_care, in?(:past_simple, :past_participle), matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ied'))
193
- # rule([dont_care, dont_care, in?(:past_simple, :past_participle), dont_care], concat(col('base_form'), 'ed'))
194
- # end
195
-
196
- # verb_1 = MockIrregularVerb.new('choose', :first, :singular, :present)
197
- # expect(table.inflect(verb_1, [nil, nil, nil, nil] )).to eq('choose')
198
- # expect(table.inflect(verb_1, [:third, nil, nil, nil] )).to eq('chooses')
199
- # expect(table.inflect(verb_1, [nil, :plural, nil, nil] )).to eq('choose')
200
- # expect(table.inflect(verb_1, [nil, nil, :progressive, nil] )).to eq('choosing')
201
- # expect(table.inflect(verb_1, [nil, nil, :past_simple, nil] )).to eq('chose')
202
- # expect(table.inflect(verb_1, [nil, nil, :past_participle, nil])).to eq('chosen')
203
- # end
177
+ MockIrregularVerb = Struct.new(:base_form, :PERSON, :NUMBER, :TIME, :past_simple, :past_participle)
178
+ it 'should build default paradigm for irregular verbs' do
179
+ table = subject.build('Irregular_inflection') do
180
+ feature_heading 'PERSON'
181
+ feature_heading 'NUMBER'
182
+ feature_heading 'TIME'
183
+ method_heading 'base_form'
184
+ # PERSON NUMBER TIME base_form
185
+ rule([not_equal(:third), dont_care, equals(:present), dont_care], col('base_form'))
186
+ rule([equals(:third), equals(:singular), equals(:present), matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies'))
187
+ rule([equals(:third), equals(:singular), equals(:present), matches(/(?:[osxz]|ch|sh)$/)], concat(col('base_form'), 'es'))
188
+ rule([equals(:third), equals(:singular), equals(:present), dont_care], concat(col('base_form'), 's'))
189
+ rule([dont_care, dont_care, equals(:progressive), matches(/e$/)], sub(col('base_form'), /e$/, 'ing'))
190
+ rule([dont_care, dont_care, equals(:progressive), dont_care], concat(col('base_form'), 'ing'))
191
+ rule([dont_care, dont_care, equals(:past_simple), dont_care], func('past_simple'))
192
+ rule([dont_care, dont_care, equals(:past_participle), dont_care], func('past_participle'))
193
+ end
194
+
195
+ verb_1 = MockIrregularVerb.new('choose', :first, :singular, :present, 'chose', 'chosen')
196
+ expect(table.inflect(verb_1, [nil, nil, nil, nil] )).to eq('choose')
197
+ expect(table.inflect(verb_1, [:third, nil, nil, nil] )).to eq('chooses')
198
+ expect(table.inflect(verb_1, [nil, :plural, nil, nil] )).to eq('choose')
199
+ expect(table.inflect(verb_1, [nil, nil, :progressive, nil] )).to eq('choosing')
200
+ expect(table.inflect(verb_1, [nil, nil, :past_simple, nil] )).to eq('chose')
201
+ expect(table.inflect(verb_1, [nil, nil, :past_participle, nil])).to eq('chosen')
202
+ end
204
203
  end # context
205
204
  end # describe
206
205
  end # module
@@ -27,6 +27,42 @@ module Zenlish
27
27
  expect(common_nouns.all? { |c_n| lemmas.include?(c_n) }).to be_truthy
28
28
  end
29
29
 
30
+ let(:present_1sg) { [:first, :singular, :present, nil] }
31
+ let(:present_3sg) { [:third, :singular, :present, nil] }
32
+ let(:present_1pl) { [:first, :plural, :present, nil] }
33
+ let(:progressive) { [nil, nil, :progressive, nil] }
34
+ let(:past_simple) { [nil, nil, :past_simple, nil] }
35
+ let(:past_participle) { [nil, nil, :past_participle, nil] }
36
+
37
+ def test_inflection_of(verb_lexeme, pairs)
38
+ pairs.each do |(constraints, expected_form)|
39
+ expect(verb_lexeme.inflect(constraints)).to eq(expected_form)
40
+ end
41
+ end
42
+
43
+ it 'should know how to inflect an (irregular) verb' do
44
+ lexm = subject.get_lexeme('become')
45
+ expectations_1 = [
46
+ [present_1sg, 'become'],
47
+ [present_3sg, 'becomes'],
48
+ [present_1pl, 'become'],
49
+ [progressive, 'becoming'],
50
+ [past_simple, 'became'],
51
+ [past_participle, 'become']
52
+ ]
53
+ test_inflection_of(lexm, expectations_1)
54
+
55
+ lexm = subject.get_lexeme('do', WClasses::IrregularVerbDo)
56
+ expectations_2 = [
57
+ [present_1sg, 'do'],
58
+ [present_3sg, 'does'],
59
+ [present_1pl, 'do'],
60
+ [progressive, 'doing'],
61
+ [past_simple, 'did'],
62
+ [past_participle, 'done']
63
+ ]
64
+ test_inflection_of(lexm, expectations_2)
65
+ end
30
66
  end # context
31
67
  end # describe
32
68
  end # module
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../spec_helper' # Use the RSpec framework
4
+
5
+ # Load the class under test
6
+ require_relative '../../../lib/zenlish/wclasses/irregular_verb_extension'
7
+
8
+ module Zenlish
9
+ module WClasses
10
+ describe IrregularVerbExtension do
11
+ subject do
12
+ obj = Object.new
13
+ obj.extend(IrregularVerbExtension)
14
+ obj.init_extension(obj)
15
+ obj
16
+ end
17
+
18
+ context 'Initialization:' do
19
+ it 'should mix-in with a host object' do
20
+ expect { Object.new.extend(IrregularVerbExtension) }.not_to raise_error
21
+ end
22
+
23
+ it 'should inject an instance variable' do
24
+ expect(subject.instance_variable_get(:@forms)).to be_kind_of(Array)
25
+ end
26
+ end # context
27
+
28
+ context 'Provided services:' do
29
+ it 'should provide a write accessor' do
30
+ subject.forms past_simple: 'chose', past_participle: 'chosen'
31
+ expect(subject.past_simple).to eq('chose')
32
+ expect(subject.past_participle).to eq('chosen')
33
+ end
34
+ end # context
35
+ end # describe
36
+ end # module
37
+ end # module
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../../spec_helper' # Use the RSpec framework
4
- require_relative '../../../lib/zenlish/wclasses/irregular_verb' # Load the class under test
4
+ require_relative '../../../lib/zenlish/lex/lexical_entry'
5
+ require_relative '../../../lib/zenlish/lex/lexeme'
6
+
7
+ # Load the class under test
8
+ require_relative '../../../lib/zenlish/wclasses/irregular_verb'
5
9
 
6
10
  module Zenlish
7
11
  module WClasses
@@ -15,7 +19,54 @@ module Zenlish
15
19
  end # context
16
20
 
17
21
  context 'Provided services:' do
18
-
22
+ it 'should know its inherited feature definitions' do
23
+ expect(subject['NUMBER']).to be_kind_of(Feature::FeatureDef)
24
+ expect(subject['PERSON']).to be_kind_of(Feature::FeatureDef)
25
+ expect(subject['PARADIGM'].default.val).to eq('Irregular_inflection')
26
+ end
27
+
28
+ let(:present_1sg) { [:first, :singular, :present, nil] }
29
+ let(:present_3sg) { [:third, :singular, :present, nil] }
30
+ let(:present_1pl) { [:first, :plural, :present, nil] }
31
+ let(:progressive) { [nil, nil, :progressive, nil] }
32
+ let(:past_simple) { [nil, nil, :past_simple, nil] }
33
+ let(:past_participle) { [nil, nil, :past_participle, nil] }
34
+
35
+ def build_verb(aBaseForm, p_simple, p_participle)
36
+ entry = Zenlish::Lex::LexicalEntry.new(aBaseForm)
37
+ lexeme = Zenlish::Lex::Lexeme.new(subject, entry)
38
+ lexeme.forms past_simple: p_simple, past_participle: p_participle
39
+ lexeme
40
+ end
41
+
42
+ def test_inflection_of(verb_form, p_simple, p_participle, pairs)
43
+ verb = build_verb(verb_form, p_simple, p_participle)
44
+ pairs.each do |(constraints, expected_form)|
45
+ expect(verb.inflect(constraints)).to eq(expected_form)
46
+ end
47
+ end
48
+
49
+ it 'should know how to inflect irregular verbs' do
50
+ expectations_1 = [
51
+ [present_1sg, 'see'],
52
+ [present_3sg, 'sees'],
53
+ [present_1pl, 'see'],
54
+ [progressive, 'seeing'],
55
+ [past_simple, 'saw'],
56
+ [past_participle, 'seen']
57
+ ]
58
+ test_inflection_of('see', 'saw', 'seen', expectations_1)
59
+
60
+ expectations_2 = [
61
+ [present_1sg, 'make'],
62
+ [present_3sg, 'makes'],
63
+ [present_1pl, 'make'],
64
+ [progressive, 'making'],
65
+ [past_simple, 'made'],
66
+ [past_participle, 'made']
67
+ ]
68
+ test_inflection_of('make', 'made', 'made', expectations_2)
69
+ end
19
70
  end # context
20
71
  end # describe
21
72
  end # module
@@ -44,7 +44,7 @@ module Zenlish
44
44
  end
45
45
  end
46
46
 
47
- it 'should how to inflect regular verbs' do
47
+ it 'should know how to inflect regular verbs' do
48
48
  expectations_1 = [
49
49
  [present_1sg, 'exist'],
50
50
  [present_3sg, 'exists'],
@@ -83,7 +83,17 @@ module Zenlish
83
83
  [past_simple, 'touched'],
84
84
  [past_participle, 'touched']
85
85
  ]
86
- test_inflection_of('touch', expectations_4)
86
+ test_inflection_of('touch', expectations_4)
87
+
88
+ expectations_5 = [
89
+ [present_1sg, 'die'],
90
+ [present_3sg, 'dies'],
91
+ [present_1pl, 'die'],
92
+ [progressive, 'dying'],
93
+ [past_simple, 'died'],
94
+ [past_participle, 'died']
95
+ ]
96
+ test_inflection_of('die', expectations_5)
87
97
  end
88
98
  end # context
89
99
  end # describe
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zenlish
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.01
4
+ version: 0.2.02
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-02 00:00:00.000000000 Z
11
+ date: 2020-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rley
@@ -159,6 +159,7 @@ files:
159
159
  - lib/zenlish/wclasses/irregular_verb.rb
160
160
  - lib/zenlish/wclasses/irregular_verb_be.rb
161
161
  - lib/zenlish/wclasses/irregular_verb_do.rb
162
+ - lib/zenlish/wclasses/irregular_verb_extension.rb
162
163
  - lib/zenlish/wclasses/irregular_verb_have.rb
163
164
  - lib/zenlish/wclasses/irregular_verb_know.rb
164
165
  - lib/zenlish/wclasses/irregular_verb_say.rb
@@ -224,6 +225,7 @@ files:
224
225
  - spec/zenlish/support/minimal_lexicon.rb
225
226
  - spec/zenlish/support/var2word.rb
226
227
  - spec/zenlish/wclasses/common_noun_spec.rb
228
+ - spec/zenlish/wclasses/irregular_verb_extension_spec.rb
227
229
  - spec/zenlish/wclasses/irregular_verb_spec.rb
228
230
  - spec/zenlish/wclasses/lexical_verb_spec.rb
229
231
  - spec/zenlish/wclasses/noun_spec.rb
@@ -296,6 +298,7 @@ test_files:
296
298
  - spec/zenlish/parser/lesson3_spec.rb
297
299
  - spec/zenlish/parser/zparser_spec.rb
298
300
  - spec/zenlish/wclasses/common_noun_spec.rb
301
+ - spec/zenlish/wclasses/irregular_verb_extension_spec.rb
299
302
  - spec/zenlish/wclasses/irregular_verb_spec.rb
300
303
  - spec/zenlish/wclasses/lexical_verb_spec.rb
301
304
  - spec/zenlish/wclasses/noun_spec.rb