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.
- checksums.yaml +4 -4
- data/.rubocop.yml +228 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +5 -3
- data/LICENSE.txt +1 -1
- data/Rakefile +5 -3
- data/lib/zenlish/feature/boolean_domain.rb +6 -4
- data/lib/zenlish/feature/boolean_value.rb +3 -2
- data/lib/zenlish/feature/enumeration_domain.rb +5 -2
- data/lib/zenlish/feature/feature.rb +9 -7
- data/lib/zenlish/feature/feature_def.rb +9 -6
- data/lib/zenlish/feature/feature_domain.rb +4 -2
- data/lib/zenlish/feature/feature_struct.rb +3 -1
- data/lib/zenlish/feature/feature_struct_def.rb +5 -3
- data/lib/zenlish/feature/feature_struct_def_bearer.rb +6 -4
- data/lib/zenlish/feature/feature_value.rb +4 -2
- data/lib/zenlish/feature/identifier_domain.rb +5 -3
- data/lib/zenlish/feature/identifier_value.rb +3 -2
- data/lib/zenlish/feature/symbol_value.rb +3 -1
- data/lib/zenlish/inflect/atomic_o_expression.rb +2 -1
- data/lib/zenlish/inflect/composite_o_expression.rb +3 -1
- data/lib/zenlish/inflect/concatenation.rb +3 -2
- data/lib/zenlish/inflect/equals_literal.rb +3 -1
- data/lib/zenlish/inflect/feature_heading.rb +2 -5
- data/lib/zenlish/inflect/formal_argument.rb +3 -1
- data/lib/zenlish/inflect/function_call.rb +4 -1
- data/lib/zenlish/inflect/heading.rb +2 -0
- data/lib/zenlish/inflect/inflection_rule.rb +2 -0
- data/lib/zenlish/inflect/inflection_table.rb +6 -4
- data/lib/zenlish/inflect/inflection_table_builder.rb +21 -18
- data/lib/zenlish/inflect/input_asis.rb +3 -0
- data/lib/zenlish/inflect/input_expression.rb +4 -2
- data/lib/zenlish/inflect/literal_asis.rb +4 -1
- data/lib/zenlish/inflect/matches_pattern.rb +2 -0
- data/lib/zenlish/inflect/membership.rb +2 -0
- data/lib/zenlish/inflect/method_heading.rb +3 -6
- data/lib/zenlish/inflect/not_equals_literal.rb +2 -0
- data/lib/zenlish/inflect/nullary_input_expression.rb +3 -1
- data/lib/zenlish/inflect/output_expression.rb +6 -0
- data/lib/zenlish/inflect/substitution.rb +3 -1
- data/lib/zenlish/inflect/unary_input_expression.rb +4 -1
- data/lib/zenlish/inflect/unconditionally_true.rb +4 -2
- data/lib/zenlish/lang/dictionary.rb +19 -16
- data/lib/zenlish/lang/lemmatizer.rb +40 -0
- data/lib/zenlish/lang/zenlish_grammar.rb +6 -4
- data/lib/zenlish/lex/empty_lexicon_factory.rb +3 -2
- data/lib/zenlish/lex/lexeme.rb +6 -4
- data/lib/zenlish/lex/lexical_entry.rb +6 -4
- data/lib/zenlish/lex/lexicon.rb +4 -3
- data/lib/zenlish/lex/literal.rb +3 -1
- data/lib/zenlish/lexer/lexer.rb +144 -0
- data/lib/zenlish/trie/base_trie_node.rb +27 -0
- data/lib/zenlish/trie/trie.rb +132 -0
- data/lib/zenlish/trie/trie_node.rb +21 -0
- data/lib/zenlish/trie/trie_root.rb +10 -0
- data/lib/zenlish/version.rb +3 -1
- data/lib/zenlish/wclasses/adjective.rb +4 -2
- data/lib/zenlish/wclasses/adverb.rb +3 -1
- data/lib/zenlish/wclasses/adverb_maybe.rb +3 -1
- data/lib/zenlish/wclasses/adverb_not.rb +2 -0
- data/lib/zenlish/wclasses/all_word_classes.rb +3 -1
- data/lib/zenlish/wclasses/article.rb +2 -0
- data/lib/zenlish/wclasses/auxiliary.rb +2 -0
- data/lib/zenlish/wclasses/auxiliary_be.rb +7 -6
- data/lib/zenlish/wclasses/auxiliary_do.rb +6 -5
- data/lib/zenlish/wclasses/cardinal.rb +3 -1
- data/lib/zenlish/wclasses/common_noun.rb +2 -0
- data/lib/zenlish/wclasses/comparative_particle.rb +5 -3
- data/lib/zenlish/wclasses/conjunction.rb +2 -0
- data/lib/zenlish/wclasses/conjunctive_pronoun.rb +2 -0
- data/lib/zenlish/wclasses/coordinator.rb +4 -2
- data/lib/zenlish/wclasses/definite_article.rb +2 -0
- data/lib/zenlish/wclasses/degree_adverb.rb +2 -0
- data/lib/zenlish/wclasses/demonstrative_determiner.rb +6 -4
- data/lib/zenlish/wclasses/demonstrative_pronoun.rb +2 -0
- data/lib/zenlish/wclasses/determiner.rb +3 -1
- data/lib/zenlish/wclasses/distributive_determiner.rb +2 -0
- data/lib/zenlish/wclasses/existential_there.rb +2 -0
- data/lib/zenlish/wclasses/fronting_quantifier.rb +3 -1
- data/lib/zenlish/wclasses/indefinite_article.rb +2 -0
- data/lib/zenlish/wclasses/indefinite_pronoun.rb +3 -1
- data/lib/zenlish/wclasses/irregular_linking_verb.rb +3 -1
- data/lib/zenlish/wclasses/irregular_verb.rb +13 -15
- data/lib/zenlish/wclasses/irregular_verb_be.rb +8 -7
- data/lib/zenlish/wclasses/irregular_verb_can.rb +8 -7
- data/lib/zenlish/wclasses/irregular_verb_do.rb +7 -6
- data/lib/zenlish/wclasses/irregular_verb_extension.rb +8 -7
- data/lib/zenlish/wclasses/irregular_verb_have.rb +12 -11
- data/lib/zenlish/wclasses/irregular_verb_know.rb +3 -1
- data/lib/zenlish/wclasses/irregular_verb_say.rb +3 -1
- data/lib/zenlish/wclasses/irregular_verb_think.rb +3 -1
- data/lib/zenlish/wclasses/lexical_verb.rb +3 -4
- data/lib/zenlish/wclasses/linking_adverb.rb +2 -0
- data/lib/zenlish/wclasses/modal_verb_can.rb +7 -5
- data/lib/zenlish/wclasses/noun.rb +4 -2
- data/lib/zenlish/wclasses/numeral.rb +2 -0
- data/lib/zenlish/wclasses/personal_pronoun.rb +8 -6
- data/lib/zenlish/wclasses/possessive_determiner.rb +13 -12
- data/lib/zenlish/wclasses/preposition.rb +3 -1
- data/lib/zenlish/wclasses/preposition_of.rb +2 -0
- data/lib/zenlish/wclasses/preposition_than.rb +2 -0
- data/lib/zenlish/wclasses/pronoun.rb +3 -1
- data/lib/zenlish/wclasses/proper_noun.rb +10 -8
- data/lib/zenlish/wclasses/quantifier.rb +3 -1
- data/lib/zenlish/wclasses/regular_verb.rb +9 -9
- data/lib/zenlish/wclasses/regular_verb_want.rb +4 -2
- data/lib/zenlish/wclasses/relative_pronoun.rb +4 -2
- data/lib/zenlish/wclasses/subordinating_conjunction.rb +7 -5
- data/lib/zenlish/wclasses/verb.rb +5 -3
- data/lib/zenlish/wclasses/word_class.rb +7 -5
- data/lib/zenlish.rb +3 -3
- data/spec/spec_helper.rb +3 -1
- data/spec/zenlish/feature/boolean_domain_spec.rb +16 -16
- data/spec/zenlish/feature/boolean_value_spec.rb +7 -6
- data/spec/zenlish/feature/enumeration_domain_spec.rb +21 -21
- data/spec/zenlish/feature/feature_def_spec.rb +15 -14
- data/spec/zenlish/feature/feature_spec.rb +17 -17
- data/spec/zenlish/feature/feature_struct_def_bearer_spec.rb +23 -21
- data/spec/zenlish/feature/feature_struct_def_spec.rb +26 -25
- data/spec/zenlish/feature/identifier_domain_spec.rb +15 -15
- data/spec/zenlish/feature/identifier_value_spec.rb +10 -9
- data/spec/zenlish/feature/symbol_value_spec.rb +9 -8
- data/spec/zenlish/inflect/concatenation_spec.rb +14 -14
- data/spec/zenlish/inflect/equals_literal_spec.rb +17 -16
- data/spec/zenlish/inflect/feature_heading_spec.rb +22 -21
- data/spec/zenlish/inflect/formal_argument_spec.rb +7 -7
- data/spec/zenlish/inflect/function_call_spec.rb +11 -12
- data/spec/zenlish/inflect/inflection_rule_spec.rb +28 -24
- data/spec/zenlish/inflect/inflection_table_builder_spec.rb +62 -57
- data/spec/zenlish/inflect/inflection_table_spec.rb +49 -46
- data/spec/zenlish/inflect/input_asis_spec.rb +12 -15
- data/spec/zenlish/inflect/literal_asis_spec.rb +10 -10
- data/spec/zenlish/inflect/matches_pattern_spec.rb +16 -15
- data/spec/zenlish/inflect/membership_spec.rb +17 -16
- data/spec/zenlish/inflect/method_heading_spec.rb +15 -14
- data/spec/zenlish/inflect/not_equals_literal_spec.rb +17 -16
- data/spec/zenlish/inflect/substitution_spec.rb +10 -11
- data/spec/zenlish/inflect/unconditionally_true_spec.rb +8 -6
- data/spec/zenlish/lang/dictionary_spec.rb +28 -31
- data/spec/zenlish/lang/lemmatizer_spec.rb +43 -0
- data/spec/zenlish/lang/zenlish_grammar_spec.rb +5 -5
- data/spec/zenlish/lex/empty_lexicon_factory_spec.rb +8 -8
- data/spec/zenlish/lex/lexeme_spec.rb +27 -28
- data/spec/zenlish/lex/lexical_entry_spec.rb +15 -15
- data/spec/zenlish/lex/lexicon_spec.rb +52 -50
- data/spec/zenlish/lex/literal_spec.rb +8 -8
- data/spec/zenlish/lexer/lexer_spec.rb +52 -0
- data/spec/zenlish/parser/lesson1_spec.rb +81 -81
- data/spec/zenlish/parser/lesson2_spec.rb +133 -138
- data/spec/zenlish/parser/lesson3_spec.rb +186 -226
- data/spec/zenlish/parser/zparser_spec.rb +8 -7
- data/spec/zenlish/support/minimal_lexicon.rb +2 -0
- data/spec/zenlish/support/var2word.rb +16 -9
- data/spec/zenlish/trie/base_trie_node_spec.rb +33 -0
- data/spec/zenlish/trie/trie_spec.rb +108 -0
- data/spec/zenlish/wclasses/common_noun_spec.rb +15 -19
- data/spec/zenlish/wclasses/demonstrative_determiner_spec.rb +12 -12
- data/spec/zenlish/wclasses/irregular_verb_can_spec.rb +18 -18
- data/spec/zenlish/wclasses/irregular_verb_extension_spec.rb +10 -10
- data/spec/zenlish/wclasses/irregular_verb_spec.rb +28 -28
- data/spec/zenlish/wclasses/lexical_verb_spec.rb +9 -9
- data/spec/zenlish/wclasses/modal_verb_can_spec.rb +12 -12
- data/spec/zenlish/wclasses/noun_spec.rb +7 -7
- data/spec/zenlish/wclasses/personal_pronoun_spec.rb +20 -23
- data/spec/zenlish/wclasses/possessive_determiner_spec.rb +28 -31
- data/spec/zenlish/wclasses/preposition_spec.rb +5 -5
- data/spec/zenlish/wclasses/proper_noun_spec.rb +3 -3
- data/spec/zenlish/wclasses/regular_verb_spec.rb +30 -30
- data/spec/zenlish/wclasses/regular_verb_want_spec.rb +30 -0
- data/spec/zenlish/wclasses/verb_spec.rb +9 -9
- data/spec/zenlish_spec.rb +4 -2
- data/zenlish.gemspec +18 -14
- metadata +49 -16
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../lex/literal'
|
4
|
+
|
5
|
+
module Zenlish
|
6
|
+
module Lexer
|
7
|
+
class Lexer
|
8
|
+
# @return [StringScanner] Low-level scanner object.
|
9
|
+
attr_reader(:scanner)
|
10
|
+
|
11
|
+
# @return [Boolean] true, if lexer is currently busy to scan Zenlish.
|
12
|
+
attr_reader(:zenlish_mode)
|
13
|
+
|
14
|
+
# @return [Integer] Current line number (one-based)
|
15
|
+
attr_reader(:lineno)
|
16
|
+
|
17
|
+
# @return [Integer] Offset of start of current line within IO (one-based).
|
18
|
+
attr_reader(:line_start)
|
19
|
+
|
20
|
+
@@punct2name = {
|
21
|
+
':' => 'Colon',
|
22
|
+
',' => 'Comma',
|
23
|
+
'.' => 'Period',
|
24
|
+
'"' => 'Quote'
|
25
|
+
}.freeze
|
26
|
+
|
27
|
+
class ScanError < StandardError; end
|
28
|
+
|
29
|
+
# Constructor. Initialize a tokenizer for Skeem.
|
30
|
+
# @param source [String] Skeem text to tokenize.
|
31
|
+
def initialize(source)
|
32
|
+
@scanner = StringScanner.new('')
|
33
|
+
@zenlish_mode = true
|
34
|
+
reinitialize(source)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param source [String] Skeem text to tokenize.
|
38
|
+
def reinitialize(source)
|
39
|
+
@scanner.string = source
|
40
|
+
@lineno = 1
|
41
|
+
@line_start = 0
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Array<Token>] | Returns a sequence of tokens
|
45
|
+
def tokens
|
46
|
+
tok_sequence = []
|
47
|
+
until @scanner.eos?
|
48
|
+
token = _next_token
|
49
|
+
tok_sequence << token unless token.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
return tok_sequence
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def _next_token
|
58
|
+
skip_intertoken_spaces
|
59
|
+
if zenlish_mode
|
60
|
+
next_zenlish_token
|
61
|
+
else
|
62
|
+
next_json_token
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def next_zenlish_token
|
67
|
+
curr_ch = scanner.peek(1)
|
68
|
+
return nil if curr_ch.nil? || curr_ch.empty?
|
69
|
+
|
70
|
+
token = nil
|
71
|
+
|
72
|
+
if ':,."'.include? curr_ch
|
73
|
+
# Delimiters, separators => single character token
|
74
|
+
token = build_token(@@punct2name[curr_ch], scanner.getch)
|
75
|
+
elsif (literal = scanner.scan(/[^\s:;,."]+/))
|
76
|
+
token = build_token('WORD', literal)
|
77
|
+
else # Unknown token
|
78
|
+
erroneous = curr_ch.nil? ? '' : scanner.scan(/./)
|
79
|
+
sequel = scanner.scan(/.{1,20}/)
|
80
|
+
erroneous += sequel unless sequel.nil?
|
81
|
+
raise ScanError, "Unknown token #{erroneous} on line #{lineno}"
|
82
|
+
end
|
83
|
+
|
84
|
+
return token
|
85
|
+
end
|
86
|
+
|
87
|
+
def build_token(aSymbolName, aLiteral, _format = :default)
|
88
|
+
begin
|
89
|
+
col = scanner.pos - aLiteral.size - @line_start + 1
|
90
|
+
pos = Rley::Lexical::Position.new(@lineno, col)
|
91
|
+
token = Rley::Lexical::Token.new(aLiteral, aSymbolName, pos)
|
92
|
+
rescue StandardError => e
|
93
|
+
puts "Failing with '#{aSymbolName}' and '#{aLiteral}'"
|
94
|
+
raise e
|
95
|
+
end
|
96
|
+
|
97
|
+
return token
|
98
|
+
end
|
99
|
+
|
100
|
+
def next_json_token
|
101
|
+
curr_ch = scanner.peek(1)
|
102
|
+
return nil if curr_ch.nil? || curr_ch.empty?
|
103
|
+
|
104
|
+
token = nil
|
105
|
+
|
106
|
+
if ':,."'.include? curr_ch
|
107
|
+
# Delimiters, separators => single character token
|
108
|
+
token = build_token(@@punct2name[curr_ch], scanner.getch)
|
109
|
+
elsif (literal = scanner.scan(/[^\s:;,."]+/))
|
110
|
+
token = build_token('WORD', literal)
|
111
|
+
else # Unknown token
|
112
|
+
erroneous = curr_ch.nil? ? '' : scanner.scan(/./)
|
113
|
+
sequel = scanner.scan(/.{1,20}/)
|
114
|
+
erroneous += sequel unless sequel.nil?
|
115
|
+
raise ScanError, "Unknown token #{erroneous} on line #{lineno}"
|
116
|
+
end
|
117
|
+
|
118
|
+
return token
|
119
|
+
end
|
120
|
+
|
121
|
+
def skip_intertoken_spaces
|
122
|
+
pre_pos = scanner.pos
|
123
|
+
|
124
|
+
loop do
|
125
|
+
ws_found = scanner.skip(/[ \t\f]+/) ? true : false
|
126
|
+
nl_found = scanner.skip(/(?:\r\n)|\r|\n/)
|
127
|
+
if nl_found
|
128
|
+
ws_found = true
|
129
|
+
next_line
|
130
|
+
end
|
131
|
+
break unless ws_found
|
132
|
+
end
|
133
|
+
|
134
|
+
curr_pos = scanner.pos
|
135
|
+
return if curr_pos == pre_pos
|
136
|
+
end
|
137
|
+
|
138
|
+
def next_line
|
139
|
+
@lineno += 1
|
140
|
+
@line_start = scanner.pos
|
141
|
+
end
|
142
|
+
end # class
|
143
|
+
end # module
|
144
|
+
end # module
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zenlish
|
4
|
+
module Trie
|
5
|
+
# Abstract class for representing nodes in the trie data structure.
|
6
|
+
class BaseTrieNode
|
7
|
+
# @return [Hash{String => TrieNode}] the successor nodes
|
8
|
+
attr_reader :succ
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@succ = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def include?(aKey)
|
15
|
+
succ.include?(aKey)
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_succ(aKey, aNode)
|
19
|
+
succ[aKey] = aNode
|
20
|
+
end
|
21
|
+
|
22
|
+
def leaf?
|
23
|
+
succ.empty?
|
24
|
+
end
|
25
|
+
end # class
|
26
|
+
end # module
|
27
|
+
end # module
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'trie_root'
|
4
|
+
require_relative 'trie_node'
|
5
|
+
|
6
|
+
# https://raw.githubusercontent.com/first20hours/google-10000-english/master/20k.txt
|
7
|
+
# https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt
|
8
|
+
|
9
|
+
module Zenlish
|
10
|
+
module Trie
|
11
|
+
# A trie (aka prefix tree or digital tree) is a kind of search tree.
|
12
|
+
class Trie
|
13
|
+
# @return [TrieRoot] The root node of the trie data structure
|
14
|
+
attr_reader :root
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@root = TrieRoot.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def add(aWord, aValue)
|
21
|
+
append_node(root, aWord, 0, aValue)
|
22
|
+
end
|
23
|
+
|
24
|
+
def search(aWord)
|
25
|
+
search_node(root, aWord, 0)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def append_node(aNode, aText, anIndex, aValue)
|
31
|
+
key = aText[anIndex]
|
32
|
+
unless aNode.include?(key)
|
33
|
+
aNode.add_succ(key, TrieNode.new(key))
|
34
|
+
end
|
35
|
+
successor = aNode.succ[key]
|
36
|
+
|
37
|
+
if anIndex == aText.size - 1
|
38
|
+
current_value = successor.value
|
39
|
+
if current_value
|
40
|
+
if current_value.kind_of?(Array)
|
41
|
+
current_value << aValue
|
42
|
+
else
|
43
|
+
successor.value = [current_value, aValue]
|
44
|
+
end
|
45
|
+
else
|
46
|
+
successor.value = aValue
|
47
|
+
end
|
48
|
+
else
|
49
|
+
append_node(successor, aText, anIndex + 1, aValue)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def search_node(aNode, aText, anIndex)
|
54
|
+
key = aText[anIndex]
|
55
|
+
return nil unless aNode.include?(key)
|
56
|
+
|
57
|
+
successor = aNode.succ[key]
|
58
|
+
return successor if anIndex == aText.size - 1
|
59
|
+
|
60
|
+
search_node(successor, aText, anIndex + 1)
|
61
|
+
end
|
62
|
+
=begin
|
63
|
+
|
64
|
+
|
65
|
+
def include?(word)
|
66
|
+
find_word(word) { |found, base| return found && base.word }
|
67
|
+
end
|
68
|
+
|
69
|
+
def add_word(word)
|
70
|
+
letters = word.chars
|
71
|
+
base = @root
|
72
|
+
|
73
|
+
letters.each { |letter| base = add_character(letter, base.next) }
|
74
|
+
|
75
|
+
base.word = true
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_word(word)
|
79
|
+
letters = word.chars
|
80
|
+
base = @root
|
81
|
+
|
82
|
+
word_found =
|
83
|
+
letters.all? { |letter| base = find_character(letter, base.next) }
|
84
|
+
|
85
|
+
yield word_found, base if block_given?
|
86
|
+
|
87
|
+
base
|
88
|
+
end
|
89
|
+
|
90
|
+
def find_words_starting_with(prefix)
|
91
|
+
stack = []
|
92
|
+
words = []
|
93
|
+
prefix_stack = []
|
94
|
+
|
95
|
+
stack << find_word(prefix)
|
96
|
+
prefix_stack << prefix.chars.take(prefix.size-1)
|
97
|
+
|
98
|
+
return [] unless stack.first
|
99
|
+
|
100
|
+
until stack.empty?
|
101
|
+
node = stack.pop
|
102
|
+
|
103
|
+
prefix_stack.pop and next if node == :guard_node
|
104
|
+
|
105
|
+
prefix_stack << node.value
|
106
|
+
stack << :guard_node
|
107
|
+
|
108
|
+
words << prefix_stack.join if node.word
|
109
|
+
|
110
|
+
node.next.each { |n| stack << n }
|
111
|
+
end
|
112
|
+
|
113
|
+
words
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
def add_character(character, trie)
|
119
|
+
trie.find { |n| n.value == character } || add_node(character, trie)
|
120
|
+
end
|
121
|
+
|
122
|
+
def find_character(character, trie)
|
123
|
+
trie.find { |n| n.value == character }
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_node(character, trie)
|
127
|
+
TrieNode.new(character).tap { |new_node| trie << new_node }
|
128
|
+
end
|
129
|
+
=end
|
130
|
+
end # class
|
131
|
+
end # module
|
132
|
+
end # module
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base_trie_node'
|
4
|
+
|
5
|
+
module Zenlish
|
6
|
+
module Trie
|
7
|
+
class TrieNode < BaseTrieNode
|
8
|
+
# @return [String] the matching character
|
9
|
+
attr_reader :key
|
10
|
+
|
11
|
+
# @return [Object, NilClass] Result when this character matches end-of-word.
|
12
|
+
attr_accessor :value
|
13
|
+
|
14
|
+
def initialize(aChar)
|
15
|
+
super()
|
16
|
+
@key = aChar
|
17
|
+
@value = nil
|
18
|
+
end
|
19
|
+
end # class
|
20
|
+
end # module
|
21
|
+
end # module
|
data/lib/zenlish/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'word_class'
|
2
4
|
|
3
5
|
module Zenlish
|
@@ -7,8 +9,8 @@ module Zenlish
|
|
7
9
|
# @return [FalseClass] Indicates that an adjective may inflect.
|
8
10
|
def invariable?
|
9
11
|
# TODO: set to false once we introduce the degrees (basic, comparative, superlative)
|
10
|
-
true
|
11
|
-
end
|
12
|
+
true
|
13
|
+
end
|
12
14
|
end # class
|
13
15
|
end # module
|
14
16
|
end # module
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'adverb'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module WClasses
|
5
|
-
# The adverb maybe expresses uncertainty and is often placed in front
|
7
|
+
# The adverb maybe expresses uncertainty and is often placed in front
|
6
8
|
# of clauses.
|
7
9
|
class AdverbMaybe < Adverb
|
8
10
|
end # class
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Load the WordClass class hierarchy
|
2
4
|
# Algorithm: load the leaf classes from hierarchy
|
3
5
|
|
@@ -43,4 +45,4 @@ require_relative 'fronting_quantifier'
|
|
43
45
|
require_relative 'regular_verb'
|
44
46
|
require_relative 'regular_verb_want'
|
45
47
|
require_relative 'relative_pronoun'
|
46
|
-
require_relative 'subordinating_conjunction'
|
48
|
+
require_relative 'subordinating_conjunction'
|
@@ -1,20 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'auxiliary'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module WClasses
|
5
7
|
class AuxiliaryBe < Auxiliary
|
6
|
-
|
7
|
-
super()
|
8
|
-
end
|
8
|
+
# rubocop: disable Layout/SpaceInsideArrayLiteralBrackets
|
9
9
|
|
10
10
|
private
|
11
11
|
|
12
12
|
def init_feature_defs
|
13
13
|
super
|
14
14
|
# Create standard feature definitions for modal verb can.
|
15
|
-
feature_def_dsl
|
15
|
+
feature_def_dsl do
|
16
16
|
feature_def 'PARADIGM' => [identifier, 'Verb_be_inflection'] # 2nd item is default value
|
17
|
-
|
17
|
+
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def init_paradigms
|
@@ -35,7 +35,8 @@ module Zenlish
|
|
35
35
|
rule([dont_care, dont_care, equals(:past_participle)], literal('been'))
|
36
36
|
end
|
37
37
|
add_paradigm(table)
|
38
|
-
end
|
38
|
+
end
|
39
|
+
# rubocop: enable Layout/SpaceInsideArrayLiteralBrackets
|
39
40
|
end # class
|
40
41
|
end # module
|
41
42
|
end # module
|
@@ -1,21 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'auxiliary'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module WClasses
|
5
7
|
# TODO: document
|
6
8
|
class AuxiliaryDo < Auxiliary
|
7
|
-
|
8
|
-
super()
|
9
|
-
end
|
9
|
+
# rubocop: disable Layout/SpaceInsideArrayLiteralBrackets
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
13
|
def init_feature_defs
|
14
14
|
super
|
15
15
|
# Create standard feature definitions for modal verb can.
|
16
|
-
feature_def_dsl
|
16
|
+
feature_def_dsl do
|
17
17
|
feature_def 'PARADIGM' => [identifier, 'Verb_do_inflection'] # 2nd item is default value
|
18
|
-
|
18
|
+
end
|
19
19
|
end
|
20
20
|
|
21
21
|
def init_paradigms
|
@@ -34,6 +34,7 @@ module Zenlish
|
|
34
34
|
end
|
35
35
|
add_paradigm(table)
|
36
36
|
end
|
37
|
+
# rubocop: enable Layout/SpaceInsideArrayLiteralBrackets
|
37
38
|
end # class
|
38
39
|
end # module
|
39
40
|
end # module
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'word_class'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module WClasses
|
5
|
-
# TODO: document
|
7
|
+
# TODO: document
|
6
8
|
# Example: 'as' in 'same ... as'
|
7
|
-
class ComparativeParticle < WordClass
|
9
|
+
class ComparativeParticle < WordClass
|
8
10
|
end # class
|
9
11
|
end # module
|
10
|
-
end # module
|
12
|
+
end # module
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'conjunction'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module WClasses
|
5
|
-
# A coordinator (aka coordinating conjunction) is a word or phrase that
|
7
|
+
# A coordinator (aka coordinating conjunction) is a word or phrase that
|
6
8
|
# can join words, phrases, and clauses that share some logical relationhip
|
7
9
|
# Common coordinators are enumerated in the FANBOYS acronym:
|
8
10
|
# For, And, Nor, But, Or, Yet and So.
|
9
|
-
class Coordinator < WordClass
|
11
|
+
class Coordinator < WordClass
|
10
12
|
end # class
|
11
13
|
end # module
|
12
14
|
end # module
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'determiner'
|
2
4
|
require_relative '../inflect/inflection_table_builder'
|
3
5
|
|
@@ -10,7 +12,7 @@ module Zenlish
|
|
10
12
|
super()
|
11
13
|
init_feature_defs
|
12
14
|
init_paradigms
|
13
|
-
end
|
15
|
+
end
|
14
16
|
|
15
17
|
# @return [FalseClass] Indicates that demonstrative determiners inflects.
|
16
18
|
def invariable?
|
@@ -21,11 +23,11 @@ module Zenlish
|
|
21
23
|
|
22
24
|
def init_feature_defs
|
23
25
|
# Create standard feature definitions for irregular verbs.
|
24
|
-
feature_def_dsl
|
26
|
+
feature_def_dsl do
|
25
27
|
feature_def 'NUMBER' => enumeration(:singular, :plural)
|
26
28
|
feature_def 'DISTANCE' => enumeration(:near, :far)
|
27
29
|
feature_def 'PARADIGM' => [identifier, 'Demonstrative_det_paradigm'] # 2nd item is default value
|
28
|
-
|
30
|
+
end
|
29
31
|
end
|
30
32
|
|
31
33
|
def init_paradigms
|
@@ -37,7 +39,7 @@ module Zenlish
|
|
37
39
|
rule([equals(:singular), equals(:near)], func('base_form'))
|
38
40
|
rule([equals(:singular), equals(:far)], literal('that'))
|
39
41
|
rule([equals(:plural), equals(:near)], literal('these'))
|
40
|
-
rule([equals(:plural), equals(:far)
|
42
|
+
rule([equals(:plural), equals(:far)], literal('those'))
|
41
43
|
end
|
42
44
|
add_paradigm(table)
|
43
45
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'quantifier'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module WClasses
|
5
7
|
# Quantifiers that appear in front of determiners: all, both
|
6
|
-
class
|
8
|
+
class FrontingQuantifier < Quantifier
|
7
9
|
end # class
|
8
10
|
end # module
|
9
11
|
end # module
|