Skip to content

Instantly share code, notes, and snippets.

@tlinkowski
Last active October 7, 2018 18:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tlinkowski/ca99e78498b877504fec2b70f294b2f4 to your computer and use it in GitHub Desktop.
Save tlinkowski/ca99e78498b877504fec2b70f294b2f4 to your computer and use it in GitHub Desktop.
Two ways of modeling a Natural Language Processing subdomain: 1) using subtype hierarchies in both dimensions, 2) using a subtype hierarchy in one dimension and a parametrized hierarchy in another dimension
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;
/* ****************************************
* 1) CORE LANGUAGE-SPECIFIC TYPES (AXIS Z)
******************************************/
/*
* 1.A) PART OF SPEECH
* https://en.wikipedia.org/wiki/Part_of_speech
*/
//
// 1.A.I) ENGLISH PART OF SPEECH
//
/**
* Implementing classes consist of one or more part-of-speech tags (each tag provided by a different tagger).
*/
interface PartOfSpeech {
}
class EnglishPartOfSpeech implements PartOfSpeech {
private final Type1EnglishTag type1Tag = Type1EnglishTag.TO; // SIMPLIFICATION
private final Type2EnglishTag type2Tag = Type2EnglishTag.GENERAL_PREPOSITION; // SIMPLIFICATION
boolean isInfinitiveMarker() {
return type1Tag == Type1EnglishTag.TO && type2Tag == Type2EnglishTag.INFINITIVE_MARKER;
}
}
enum Type1EnglishTag {
// SIMPLIFICATION (partial content)
TO // "to" as a preposition or an infinitive marker
}
enum Type2EnglishTag {
// SIMPLIFICATION (partial content)
GENERAL_PREPOSITION, // e.g. "to" in "I said to him that..."
INFINITIVE_MARKER // "to", e.g. in "I want to ask."
}
//
// 1.A.II) GERMAN PART OF SPEECH
//
class GermanPartOfSpeech implements PartOfSpeech {
private final Type1GermanTag type1Tag = Type1GermanTag.POSTPOSITION; // SIMPLIFICATION
boolean isPostposition() {
return type1Tag == Type1GermanTag.POSTPOSITION;
}
}
enum Type1GermanTag {
// SIMPLIFICATION (partial content)
POSTPOSITION, // e.g. "zufolge"
}
/*
* 1.B) CONSTITUENT
* https://en.wikipedia.org/wiki/Phrase_structure_grammar
*/
interface ConstituentType {
}
enum EnglishConstituentType implements ConstituentType {
// SIMPLIFICATION (partial content)
VERB_PHRASE, // e.g. "is doing nice"
WH_WORD_NOUN_PHRASE // e.g. "whose daughter"
}
// enum GermanConstituentType missing as of yet
/*
* 1.C) DEPENDENCY
* https://en.wikipedia.org/wiki/Dependency_grammar
*/
interface DependencyType {
}
enum EnglishDependencyType implements DependencyType {
// SIMPLIFICATION (partial content)
NOMINAL_SUBJECT, // e.g. "he" <- "walks" in "He walks."
PHRASAL_VERB_PARTICLE // e.g. "shut" -> "down" in "It was shut down."
}
// enum GermanDependencyType missing as of yet
/* ***************
* 2) HELPER TYPES
*****************/
interface TextualRange {
String text();
int startOffset(); // inclusive
int endOffset(); // exclusive
}
interface Seq {
/**
* Stub for <a href="https://www.jooq.org/products/jOOλ/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.stream.Stream-java.lang.Class-">Seq.ofType()</a>.
*/
@SuppressWarnings("unchecked")
static <T, U> Stream<U> ofType(Stream<? extends T> stream, Class<? extends U> type) {
return stream.filter(type::isInstance).map(t -> (U) t);
}
}
/**
* Defines the stage of text processing (AXIS Y).
*/
enum Stage {
UNPROCESSED,
TOKENIZED, // tokens present
SENTENCIZED, // sentences present
TAGGED, // parts of speech present
PARSED // syntax present
}
/* ***************************
* 3) SOLUTION USING SUBTYPING
*****************************/
/*
* 3.A) GENERIC HIERARCHY (AXIS Y OVER X)
*/
//
// 3.A.I) UNPROCESSED
//
interface LocalizedText extends TextualRange {
Locale locale();
default Stage maxStage() {
return Stage.UNPROCESSED;
}
}
//
// 3.A.II) WITH TOKENS
//
enum TokenType {
WORD, NUMERIC // SIMPLIFICATION
}
interface Token extends TextualRange {
TokenType tokenType();
}
interface TokenizedText extends LocalizedText {
Stream<? extends Token> tokenStream();
int tokenCount();
@Override
default Stage maxStage() {
return Stage.TOKENIZED;
}
}
//
// 3.A.III) WITH SENTENCES
//
interface Sentence extends TextualRange {
List<? extends Token> tokens();
default Stage stage() {
return Stage.SENTENCIZED;
}
}
interface SentencizedText extends TokenizedText {
List<? extends Sentence> sentences();
@Override
default Stage maxStage() {
return Stage.SENTENCIZED;
}
}
//
// 3.A.IV) WITH PARTS OF SPEECH
//
interface TaggedToken<P extends PartOfSpeech> extends Token {
P partOfSpeech(); // see section 1.A above
}
interface TaggedSentence<P extends PartOfSpeech> extends Sentence {
@Override
List<? extends TaggedToken<P>> tokens();
@Override
default Stage stage() {
return Stage.TAGGED;
}
}
interface TaggedText<P extends PartOfSpeech> extends SentencizedText {
// some (or even all) sentences may remain untagged
Stream<? extends TaggedSentence<P>> taggedSentenceStream();
@Override
default Stage maxStage() {
return Stage.TAGGED;
}
}
//
// 3.A.V) WITH SYNTAX
//
interface Constituent<C extends ConstituentType, P extends PartOfSpeech> {
Stream<? extends Constituent<C, P>> childStream();
}
interface ConstituentBranch<C extends ConstituentType, P extends PartOfSpeech> extends Constituent<C, P> {
C type(); // see section 1.B above
}
interface ConstituentLeaf<C extends ConstituentType, P extends PartOfSpeech> extends Constituent<C, P> {
TaggedToken<P> token();
@Override
default Stream<? extends Constituent<C, P>> childStream() {
return Stream.empty();
}
}
interface Dependency<D extends DependencyType, P extends PartOfSpeech> {
D type(); // see section 1.C above
TaggedToken<P> governor();
TaggedToken<P> dependent();
}
interface SentenceSyntax<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> {
ConstituentBranch<C, P> constituentTree();
List<? extends Dependency<D, P>> dependencies();
}
interface ParsedSentence<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> extends TaggedSentence<P> {
SentenceSyntax<C, D, P> syntax();
@Override
default Stage stage() {
return Stage.PARSED;
}
}
interface ParsedText<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> extends TaggedText<P> {
// some (or even all) sentences may remain unparsed
Stream<? extends ParsedSentence<C, D, P>> parsedSentenceStream();
@Override
default Stage maxStage() {
return Stage.PARSED;
}
}
/* ***********************
* 4) PRODUCERS OF THE API
*************************/
interface TextProcessingRequest { // SIMPLIFICATION
Locale locale();
String text();
Stage targetStage();
}
interface TextProcessor {
LocalizedText processText(TextProcessingRequest request);
}
/* ***********************
* 5) CONSUMERS OF THE API
*************************/
/*
* 5.A) DIRECT CONSUMERS
*/
class GermanPostpositionChecker {
void checkTaggedText(TaggedText<GermanPartOfSpeech> text) {
text.taggedSentenceStream().forEach(this::checkTaggedSentence);
}
private void checkTaggedSentence(TaggedSentence<GermanPartOfSpeech> sentence) {
sentence.tokens().stream()
.filter(this::isPostposition)
.forEach(this::checkPostposition);
}
private boolean isPostposition(TaggedToken<GermanPartOfSpeech> token) {
return token.partOfSpeech().isPostposition();
}
private void checkPostposition(TaggedToken<GermanPartOfSpeech> token) {
// logic
}
}
class EnglishNominalSubjectChecker {
void checkNominalSubjects(ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech> text) {
text.parsedSentenceStream().forEach(this::checkNominalSubjects);
}
private void checkNominalSubjects(ParsedSentence<?, EnglishDependencyType, EnglishPartOfSpeech> sentence) {
sentence.syntax().dependencies().stream()
.filter(this::isCertainTypeOfNominalSubjectDependency)
.forEach(this::checkNominalSubject);
}
private boolean isCertainTypeOfNominalSubjectDependency(Dependency<EnglishDependencyType, EnglishPartOfSpeech> dependency) {
return dependency.type() == EnglishDependencyType.NOMINAL_SUBJECT && true; // SIMPLIFICATION
}
private void checkNominalSubject(Dependency<EnglishDependencyType, EnglishPartOfSpeech> dependency) {
checkNominalGovernor(dependency.governor());
checkNominalDependent(dependency.dependent());
}
private void checkNominalGovernor(TaggedToken<EnglishPartOfSpeech> governor) {
if (checkGovernorPartOfSpeech(governor.partOfSpeech())) {
// logic
}
}
private void checkNominalDependent(TaggedToken<EnglishPartOfSpeech> dependent) {
if (checkDependentPartOfSpeech(dependent.partOfSpeech())) {
// logic
}
}
private boolean checkGovernorPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {
return true; // SIMPLIFICATION
}
private boolean checkDependentPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {
return true; // SIMPLIFICATION
}
}
class EnglishRelevantConstituentHandler {
void handleRelevantConstituents(ParsedText<EnglishConstituentType, ?, EnglishPartOfSpeech> text) {
text.parsedSentenceStream().forEach(this::handleRelevantConstiuents);
}
private void handleRelevantConstiuents(ParsedSentence<EnglishConstituentType, ?, EnglishPartOfSpeech> sentence) {
Constituents.flatConstituentStream(sentence.syntax().constituentTree())
.filter(this::isRelevantConstituent)
.forEach(this::handleRelevantConstituent);
}
private boolean isRelevantConstituent(Constituent<EnglishConstituentType, EnglishPartOfSpeech> constituent) {
return true; // SIMPLIFICATION
}
private void handleRelevantConstituent(Constituent<EnglishConstituentType, EnglishPartOfSpeech> constituent) {
// logic
}
}
class Constituents {
/**
* Returns the constituent and all its descendants as a flattended Stream.
*/
static <C extends ConstituentType, P extends PartOfSpeech> Stream<Constituent<C, P>> flatConstituentStream(Constituent<C, P> constituent) {
return Stream.concat(
Stream.of(constituent),
constituent.childStream().flatMap(Constituents::flatConstituentStream)
);
}
}
/*
* 5.B) INDIRECT CONSUMERS
*/
interface ProcessedTextConsumer { // SIMPLIFICATION
Locale supportedLocale();
Stage requiredStage();
void consume(LocalizedText text);
}
class SampleUniversalTokenizedTextConsumer implements ProcessedTextConsumer {
@Override
public Locale supportedLocale() {
return Locale.ROOT;
}
@Override
public Stage requiredStage() {
return Stage.TOKENIZED;
}
@Override
public void consume(LocalizedText text) {
handleTokenizedText((TokenizedText) text);
}
private void handleTokenizedText(TokenizedText tokenizedText) {
// logic
}
}
class SampleGermanTaggedConsumer implements ProcessedTextConsumer {
@Override
public Locale supportedLocale() {
return Locale.GERMAN;
}
@Override
public Stage requiredStage() {
return Stage.TAGGED;
}
@Override
public void consume(LocalizedText text) {
// UNSAFE UNCHECKED CAST!
TaggedText<GermanPartOfSpeech> germanTaggedText = (TaggedText<GermanPartOfSpeech>) text;
new GermanPostpositionChecker().checkTaggedText(germanTaggedText);
}
}
class SampleEnglishParsedTextConsumer implements ProcessedTextConsumer {
@Override
public Locale supportedLocale() {
return Locale.ENGLISH;
}
@Override
public Stage requiredStage() {
return Stage.PARSED;
}
@Override
public void consume(LocalizedText text) {
// UNSAFE UNCHECKED CAST!
ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech> englishParsedText
= (ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech>) text;
new EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText);
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>File Compare</title>
<style type="text/css">
#page {
font-family: sans-serif;
}
table {
border-collapse: collapse;
}
td {
white-space: nowrap;
font-family: monospace;
font-size: x-small;
vertical-align: top;
}
td.fileName {
background: #E6E6E6;
font-family: sans-serif;
font-size: small;
}
td.lineNumber {
text-align: right;
background: #FFC800;
}
td.added {
background: #BEF0BE;
}
td.removed {
background: #C8C8FF;
}
td.changed {
background: #FFC8C8;
}
td.equal {
background: #FFFFFF;
}
td.empty {
background: #F2F2F2;
}
</style>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<table>
<tr>
<td colspan="2" class="filename">Parametrization-for-Z-Axis-Solution.java</td>
<td colspan="2" class="filename">Subtyping-for-Z-Axis-Solution.java</td>
</tr>
<tr>
<td class="lineNumber">1</td><td class="equal">import&nbsp;java.util.List;</td><td class="lineNumber">1</td><td class="equal">import&nbsp;java.util.List;</td>
</tr>
<tr>
<td class="lineNumber">2</td><td class="equal">import&nbsp;java.util.Locale;</td><td class="lineNumber">2</td><td class="equal">import&nbsp;java.util.Locale;</td>
</tr>
<tr>
<td class="lineNumber">3</td><td class="equal">import&nbsp;java.util.stream.Stream;</td><td class="lineNumber">3</td><td class="equal">import&nbsp;java.util.stream.Stream;</td>
</tr>
<tr>
<td class="lineNumber">4</td><td class="equal"></td><td class="lineNumber">4</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">5</td><td class="equal">/*&nbsp;****************************************</td><td class="lineNumber">5</td><td class="equal">/*&nbsp;****************************************</td>
</tr>
<tr>
<td class="lineNumber">6</td><td class="equal">&nbsp;*&nbsp;1)&nbsp;CORE&nbsp;LANGUAGE-SPECIFIC&nbsp;TYPES&nbsp;(AXIS&nbsp;Z)</td><td class="lineNumber">6</td><td class="equal">&nbsp;*&nbsp;1)&nbsp;CORE&nbsp;LANGUAGE-SPECIFIC&nbsp;TYPES&nbsp;(AXIS&nbsp;Z)</td>
</tr>
<tr>
<td class="lineNumber">7</td><td class="equal">&nbsp;******************************************/</td><td class="lineNumber">7</td><td class="equal">&nbsp;******************************************/</td>
</tr>
<tr>
<td class="lineNumber">8</td><td class="equal"></td><td class="lineNumber">8</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">9</td><td class="equal">/*</td><td class="lineNumber">9</td><td class="equal">/*</td>
</tr>
<tr>
<td class="lineNumber">10</td><td class="equal">&nbsp;*&nbsp;1.A)&nbsp;PART&nbsp;OF&nbsp;SPEECH</td><td class="lineNumber">10</td><td class="equal">&nbsp;*&nbsp;1.A)&nbsp;PART&nbsp;OF&nbsp;SPEECH</td>
</tr>
<tr>
<td class="lineNumber">11</td><td class="equal">&nbsp;*&nbsp;https://en.wikipedia.org/wiki/Part_of_speech</td><td class="lineNumber">11</td><td class="equal">&nbsp;*&nbsp;https://en.wikipedia.org/wiki/Part_of_speech</td>
</tr>
<tr>
<td class="lineNumber">12</td><td class="equal">&nbsp;*/</td><td class="lineNumber">12</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">13</td><td class="equal"></td><td class="lineNumber">13</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">14</td><td class="equal">//</td><td class="lineNumber">14</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">15</td><td class="equal">//&nbsp;1.A.I)&nbsp;ENGLISH&nbsp;PART&nbsp;OF&nbsp;SPEECH</td><td class="lineNumber">15</td><td class="equal">//&nbsp;1.A.I)&nbsp;ENGLISH&nbsp;PART&nbsp;OF&nbsp;SPEECH</td>
</tr>
<tr>
<td class="lineNumber">16</td><td class="equal">//</td><td class="lineNumber">16</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">17</td><td class="equal"></td><td class="lineNumber">17</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">18</td><td class="equal">/**</td><td class="lineNumber">18</td><td class="equal">/**</td>
</tr>
<tr>
<td class="lineNumber">19</td><td class="equal">&nbsp;*&nbsp;Implementing&nbsp;classes&nbsp;consist&nbsp;of&nbsp;one&nbsp;or&nbsp;more&nbsp;part-of-speech&nbsp;tags&nbsp;(each&nbsp;tag&nbsp;provided&nbsp;by&nbsp;a&nbsp;different&nbsp;tagger).</td><td class="lineNumber">19</td><td class="equal">&nbsp;*&nbsp;Implementing&nbsp;classes&nbsp;consist&nbsp;of&nbsp;one&nbsp;or&nbsp;more&nbsp;part-of-speech&nbsp;tags&nbsp;(each&nbsp;tag&nbsp;provided&nbsp;by&nbsp;a&nbsp;different&nbsp;tagger).</td>
</tr>
<tr>
<td class="lineNumber">20</td><td class="equal">&nbsp;*/</td><td class="lineNumber">20</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">21</td><td class="equal">interface&nbsp;PartOfSpeech&nbsp;{</td><td class="lineNumber">21</td><td class="equal">interface&nbsp;PartOfSpeech&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">22</td><td class="equal">}</td><td class="lineNumber">22</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">23</td><td class="equal"></td><td class="lineNumber">23</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">24</td><td class="equal">class&nbsp;EnglishPartOfSpeech&nbsp;implements&nbsp;PartOfSpeech&nbsp;{</td><td class="lineNumber">24</td><td class="equal">class&nbsp;EnglishPartOfSpeech&nbsp;implements&nbsp;PartOfSpeech&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">25</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Type1EnglishTag&nbsp;type1Tag&nbsp;=&nbsp;Type1EnglishTag.TO;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">25</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Type1EnglishTag&nbsp;type1Tag&nbsp;=&nbsp;Type1EnglishTag.TO;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">26</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Type2EnglishTag&nbsp;type2Tag&nbsp;=&nbsp;Type2EnglishTag.GENERAL_PREPOSITION;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">26</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Type2EnglishTag&nbsp;type2Tag&nbsp;=&nbsp;Type2EnglishTag.GENERAL_PREPOSITION;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">27</td><td class="equal"></td><td class="lineNumber">27</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">28</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isInfinitiveMarker()&nbsp;{</td><td class="lineNumber">28</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isInfinitiveMarker()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">29</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type1Tag&nbsp;==&nbsp;Type1EnglishTag.TO&nbsp;&amp;&amp;&nbsp;type2Tag&nbsp;==&nbsp;Type2EnglishTag.INFINITIVE_MARKER;</td><td class="lineNumber">29</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type1Tag&nbsp;==&nbsp;Type1EnglishTag.TO&nbsp;&amp;&amp;&nbsp;type2Tag&nbsp;==&nbsp;Type2EnglishTag.INFINITIVE_MARKER;</td>
</tr>
<tr>
<td class="lineNumber">30</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">30</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">31</td><td class="equal">}</td><td class="lineNumber">31</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">32</td><td class="equal"></td><td class="lineNumber">32</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">33</td><td class="equal">enum&nbsp;Type1EnglishTag&nbsp;{</td><td class="lineNumber">33</td><td class="equal">enum&nbsp;Type1EnglishTag&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">34</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td><td class="lineNumber">34</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td>
</tr>
<tr>
<td class="lineNumber">35</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TO&nbsp;//&nbsp;&quot;to&quot;&nbsp;as&nbsp;a&nbsp;preposition&nbsp;or&nbsp;an&nbsp;infinitive&nbsp;marker</td><td class="lineNumber">35</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TO&nbsp;//&nbsp;&quot;to&quot;&nbsp;as&nbsp;a&nbsp;preposition&nbsp;or&nbsp;an&nbsp;infinitive&nbsp;marker</td>
</tr>
<tr>
<td class="lineNumber">36</td><td class="equal">}</td><td class="lineNumber">36</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">37</td><td class="equal"></td><td class="lineNumber">37</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">38</td><td class="equal">enum&nbsp;Type2EnglishTag&nbsp;{</td><td class="lineNumber">38</td><td class="equal">enum&nbsp;Type2EnglishTag&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">39</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td><td class="lineNumber">39</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td>
</tr>
<tr>
<td class="lineNumber">40</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;GENERAL_PREPOSITION,&nbsp;//&nbsp;e.g.&nbsp;&quot;to&quot;&nbsp;in&nbsp;&quot;I&nbsp;said&nbsp;to&nbsp;him&nbsp;that...&quot;</td><td class="lineNumber">40</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;GENERAL_PREPOSITION,&nbsp;//&nbsp;e.g.&nbsp;&quot;to&quot;&nbsp;in&nbsp;&quot;I&nbsp;said&nbsp;to&nbsp;him&nbsp;that...&quot;</td>
</tr>
<tr>
<td class="lineNumber">41</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;INFINITIVE_MARKER&nbsp;//&nbsp;&quot;to&quot;,&nbsp;e.g.&nbsp;in&nbsp;&quot;I&nbsp;want&nbsp;to&nbsp;ask.&quot;</td><td class="lineNumber">41</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;INFINITIVE_MARKER&nbsp;//&nbsp;&quot;to&quot;,&nbsp;e.g.&nbsp;in&nbsp;&quot;I&nbsp;want&nbsp;to&nbsp;ask.&quot;</td>
</tr>
<tr>
<td class="lineNumber">42</td><td class="equal">}</td><td class="lineNumber">42</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">43</td><td class="equal"></td><td class="lineNumber">43</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">44</td><td class="equal">//</td><td class="lineNumber">44</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">45</td><td class="equal">//&nbsp;1.A.II)&nbsp;GERMAN&nbsp;PART&nbsp;OF&nbsp;SPEECH</td><td class="lineNumber">45</td><td class="equal">//&nbsp;1.A.II)&nbsp;GERMAN&nbsp;PART&nbsp;OF&nbsp;SPEECH</td>
</tr>
<tr>
<td class="lineNumber">46</td><td class="equal">//</td><td class="lineNumber">46</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">47</td><td class="equal"></td><td class="lineNumber">47</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">48</td><td class="equal">class&nbsp;GermanPartOfSpeech&nbsp;implements&nbsp;PartOfSpeech&nbsp;{</td><td class="lineNumber">48</td><td class="equal">class&nbsp;GermanPartOfSpeech&nbsp;implements&nbsp;PartOfSpeech&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">49</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Type1GermanTag&nbsp;type1Tag&nbsp;=&nbsp;Type1GermanTag.POSTPOSITION;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">49</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Type1GermanTag&nbsp;type1Tag&nbsp;=&nbsp;Type1GermanTag.POSTPOSITION;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">50</td><td class="equal"></td><td class="lineNumber">50</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">51</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isPostposition()&nbsp;{</td><td class="lineNumber">51</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isPostposition()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">52</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type1Tag&nbsp;==&nbsp;Type1GermanTag.POSTPOSITION;</td><td class="lineNumber">52</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type1Tag&nbsp;==&nbsp;Type1GermanTag.POSTPOSITION;</td>
</tr>
<tr>
<td class="lineNumber">53</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">53</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">54</td><td class="equal">}</td><td class="lineNumber">54</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">55</td><td class="equal"></td><td class="lineNumber">55</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">56</td><td class="equal">enum&nbsp;Type1GermanTag&nbsp;{</td><td class="lineNumber">56</td><td class="equal">enum&nbsp;Type1GermanTag&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">57</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td><td class="lineNumber">57</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td>
</tr>
<tr>
<td class="lineNumber">58</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;POSTPOSITION,&nbsp;//&nbsp;e.g.&nbsp;&quot;zufolge&quot;</td><td class="lineNumber">58</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;POSTPOSITION,&nbsp;//&nbsp;e.g.&nbsp;&quot;zufolge&quot;</td>
</tr>
<tr>
<td class="lineNumber">59</td><td class="equal">}</td><td class="lineNumber">59</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">60</td><td class="equal"></td><td class="lineNumber">60</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">61</td><td class="equal">/*</td><td class="lineNumber">61</td><td class="equal">/*</td>
</tr>
<tr>
<td class="lineNumber">62</td><td class="equal">&nbsp;*&nbsp;1.B)&nbsp;CONSTITUENT</td><td class="lineNumber">62</td><td class="equal">&nbsp;*&nbsp;1.B)&nbsp;CONSTITUENT</td>
</tr>
<tr>
<td class="lineNumber">63</td><td class="equal">&nbsp;*&nbsp;https://en.wikipedia.org/wiki/Phrase_structure_grammar</td><td class="lineNumber">63</td><td class="equal">&nbsp;*&nbsp;https://en.wikipedia.org/wiki/Phrase_structure_grammar</td>
</tr>
<tr>
<td class="lineNumber">64</td><td class="equal">&nbsp;*/</td><td class="lineNumber">64</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">65</td><td class="equal">interface&nbsp;ConstituentType&nbsp;{</td><td class="lineNumber">65</td><td class="equal">interface&nbsp;ConstituentType&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">66</td><td class="equal">}</td><td class="lineNumber">66</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">67</td><td class="equal"></td><td class="lineNumber">67</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">68</td><td class="equal">enum&nbsp;EnglishConstituentType&nbsp;implements&nbsp;ConstituentType&nbsp;{</td><td class="lineNumber">68</td><td class="equal">enum&nbsp;EnglishConstituentType&nbsp;implements&nbsp;ConstituentType&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">69</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td><td class="lineNumber">69</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td>
</tr>
<tr>
<td class="lineNumber">70</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;VERB_PHRASE,&nbsp;//&nbsp;e.g.&nbsp;&quot;is&nbsp;doing&nbsp;nice&quot;</td><td class="lineNumber">70</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;VERB_PHRASE,&nbsp;//&nbsp;e.g.&nbsp;&quot;is&nbsp;doing&nbsp;nice&quot;</td>
</tr>
<tr>
<td class="lineNumber">71</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;WH_WORD_NOUN_PHRASE&nbsp;//&nbsp;e.g.&nbsp;&quot;whose&nbsp;daughter&quot;</td><td class="lineNumber">71</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;WH_WORD_NOUN_PHRASE&nbsp;//&nbsp;e.g.&nbsp;&quot;whose&nbsp;daughter&quot;</td>
</tr>
<tr>
<td class="lineNumber">72</td><td class="equal">}</td><td class="lineNumber">72</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">73</td><td class="equal"></td><td class="lineNumber">73</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">74</td><td class="equal">//&nbsp;enum&nbsp;GermanConstituentType&nbsp;missing&nbsp;as&nbsp;of&nbsp;yet</td><td class="lineNumber">74</td><td class="equal">//&nbsp;enum&nbsp;GermanConstituentType&nbsp;missing&nbsp;as&nbsp;of&nbsp;yet</td>
</tr>
<tr>
<td class="lineNumber">75</td><td class="equal"></td><td class="lineNumber">75</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">76</td><td class="equal">/*</td><td class="lineNumber">76</td><td class="equal">/*</td>
</tr>
<tr>
<td class="lineNumber">77</td><td class="equal">&nbsp;*&nbsp;1.C)&nbsp;DEPENDENCY</td><td class="lineNumber">77</td><td class="equal">&nbsp;*&nbsp;1.C)&nbsp;DEPENDENCY</td>
</tr>
<tr>
<td class="lineNumber">78</td><td class="equal">&nbsp;*&nbsp;https://en.wikipedia.org/wiki/Dependency_grammar</td><td class="lineNumber">78</td><td class="equal">&nbsp;*&nbsp;https://en.wikipedia.org/wiki/Dependency_grammar</td>
</tr>
<tr>
<td class="lineNumber">79</td><td class="equal">&nbsp;*/</td><td class="lineNumber">79</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">80</td><td class="equal">interface&nbsp;DependencyType&nbsp;{</td><td class="lineNumber">80</td><td class="equal">interface&nbsp;DependencyType&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">81</td><td class="equal">}</td><td class="lineNumber">81</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">82</td><td class="equal"></td><td class="lineNumber">82</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">83</td><td class="equal">enum&nbsp;EnglishDependencyType&nbsp;implements&nbsp;DependencyType&nbsp;{</td><td class="lineNumber">83</td><td class="equal">enum&nbsp;EnglishDependencyType&nbsp;implements&nbsp;DependencyType&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">84</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td><td class="lineNumber">84</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SIMPLIFICATION&nbsp;(partial&nbsp;content)</td>
</tr>
<tr>
<td class="lineNumber">85</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;NOMINAL_SUBJECT,&nbsp;//&nbsp;e.g.&nbsp;&quot;he&quot;&nbsp;&lt;-&nbsp;&quot;walks&quot;&nbsp;in&nbsp;&quot;He&nbsp;walks.&quot;</td><td class="lineNumber">85</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;NOMINAL_SUBJECT,&nbsp;//&nbsp;e.g.&nbsp;&quot;he&quot;&nbsp;&lt;-&nbsp;&quot;walks&quot;&nbsp;in&nbsp;&quot;He&nbsp;walks.&quot;</td>
</tr>
<tr>
<td class="lineNumber">86</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;PHRASAL_VERB_PARTICLE&nbsp;//&nbsp;e.g.&nbsp;&quot;shut&quot;&nbsp;-&gt;&nbsp;&quot;down&quot;&nbsp;in&nbsp;&quot;It&nbsp;was&nbsp;shut&nbsp;down.&quot;</td><td class="lineNumber">86</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;PHRASAL_VERB_PARTICLE&nbsp;//&nbsp;e.g.&nbsp;&quot;shut&quot;&nbsp;-&gt;&nbsp;&quot;down&quot;&nbsp;in&nbsp;&quot;It&nbsp;was&nbsp;shut&nbsp;down.&quot;</td>
</tr>
<tr>
<td class="lineNumber">87</td><td class="equal">}</td><td class="lineNumber">87</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">88</td><td class="equal"></td><td class="lineNumber">88</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">89</td><td class="equal">//&nbsp;enum&nbsp;GermanDependencyType&nbsp;missing&nbsp;as&nbsp;of&nbsp;yet</td><td class="lineNumber">89</td><td class="equal">//&nbsp;enum&nbsp;GermanDependencyType&nbsp;missing&nbsp;as&nbsp;of&nbsp;yet</td>
</tr>
<tr>
<td class="lineNumber">90</td><td class="equal"></td><td class="lineNumber">90</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">91</td><td class="equal">/*&nbsp;***************</td><td class="lineNumber">91</td><td class="equal">/*&nbsp;***************</td>
</tr>
<tr>
<td class="lineNumber">92</td><td class="equal">&nbsp;*&nbsp;2)&nbsp;HELPER&nbsp;TYPES</td><td class="lineNumber">92</td><td class="equal">&nbsp;*&nbsp;2)&nbsp;HELPER&nbsp;TYPES</td>
</tr>
<tr>
<td class="lineNumber">93</td><td class="equal">&nbsp;*****************/</td><td class="lineNumber">93</td><td class="equal">&nbsp;*****************/</td>
</tr>
<tr>
<td class="lineNumber">94</td><td class="equal">interface&nbsp;TextualRange&nbsp;{</td><td class="lineNumber">94</td><td class="equal">interface&nbsp;TextualRange&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">95</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text();</td><td class="lineNumber">95</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text();</td>
</tr>
<tr>
<td class="lineNumber">96</td><td class="equal"></td><td class="lineNumber">96</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">97</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;startOffset();&nbsp;//&nbsp;inclusive</td><td class="lineNumber">97</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;startOffset();&nbsp;//&nbsp;inclusive</td>
</tr>
<tr>
<td class="lineNumber">98</td><td class="equal"></td><td class="lineNumber">98</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">99</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;endOffset();&nbsp;//&nbsp;exclusive</td><td class="lineNumber">99</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;endOffset();&nbsp;//&nbsp;exclusive</td>
</tr>
<tr>
<td class="lineNumber">100</td><td class="equal">}</td><td class="lineNumber">100</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">101</td><td class="equal"></td><td class="lineNumber">101</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">102</td><td class="equal">interface&nbsp;Seq&nbsp;{</td><td class="lineNumber">102</td><td class="equal">interface&nbsp;Seq&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">103</td><td class="equal"></td><td class="lineNumber">103</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">104</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;/**</td><td class="lineNumber">104</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;/**</td>
</tr>
<tr>
<td class="lineNumber">105</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Stub&nbsp;for&nbsp;&lt;a&nbsp;href=&quot;https://www.jooq.org/products/jOO&#955;/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.str<br>eam.Stream-java.lang.Class-&quot;&gt;Seq.ofType()&lt;/a&gt;.</td><td class="lineNumber">105</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Stub&nbsp;for&nbsp;&lt;a&nbsp;href=&quot;https://www.jooq.org/products/jOO&#955;/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.str<br>eam.Stream-java.lang.Class-&quot;&gt;Seq.ofType()&lt;/a&gt;.</td>
</tr>
<tr>
<td class="lineNumber">106</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</td><td class="lineNumber">106</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">107</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(&quot;unchecked&quot;)</td><td class="lineNumber">107</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(&quot;unchecked&quot;)</td>
</tr>
<tr>
<td class="lineNumber">108</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;&lt;T,&nbsp;U&gt;&nbsp;Stream&lt;U&gt;&nbsp;ofType(Stream&lt;?&nbsp;extends&nbsp;T&gt;&nbsp;stream,&nbsp;Class&lt;?&nbsp;extends&nbsp;U&gt;&nbsp;type)&nbsp;{</td><td class="lineNumber">108</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;&lt;T,&nbsp;U&gt;&nbsp;Stream&lt;U&gt;&nbsp;ofType(Stream&lt;?&nbsp;extends&nbsp;T&gt;&nbsp;stream,&nbsp;Class&lt;?&nbsp;extends&nbsp;U&gt;&nbsp;type)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">109</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stream.filter(type::isInstance).map(t&nbsp;-&gt;&nbsp;(U)&nbsp;t);</td><td class="lineNumber">109</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stream.filter(type::isInstance).map(t&nbsp;-&gt;&nbsp;(U)&nbsp;t);</td>
</tr>
<tr>
<td class="lineNumber">110</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">110</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">111</td><td class="equal">}</td><td class="lineNumber">111</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">112</td><td class="equal"></td><td class="lineNumber">112</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">113</td><td class="equal">/**</td><td class="lineNumber">113</td><td class="equal">/**</td>
</tr>
<tr>
<td class="lineNumber">114</td><td class="equal">&nbsp;*&nbsp;Defines&nbsp;the&nbsp;stage&nbsp;of&nbsp;text&nbsp;processing&nbsp;(AXIS&nbsp;Y).</td><td class="lineNumber">114</td><td class="equal">&nbsp;*&nbsp;Defines&nbsp;the&nbsp;stage&nbsp;of&nbsp;text&nbsp;processing&nbsp;(AXIS&nbsp;Y).</td>
</tr>
<tr>
<td class="lineNumber">115</td><td class="equal">&nbsp;*/</td><td class="lineNumber">115</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">116</td><td class="equal">enum&nbsp;Stage&nbsp;{</td><td class="lineNumber">116</td><td class="equal">enum&nbsp;Stage&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">117</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;UNPROCESSED,</td><td class="lineNumber">117</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;UNPROCESSED,</td>
</tr>
<tr>
<td class="lineNumber">118</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TOKENIZED,&nbsp;//&nbsp;tokens&nbsp;present</td><td class="lineNumber">118</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TOKENIZED,&nbsp;//&nbsp;tokens&nbsp;present</td>
</tr>
<tr>
<td class="lineNumber">119</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;SENTENCIZED,&nbsp;//&nbsp;sentences&nbsp;present</td><td class="lineNumber">119</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;SENTENCIZED,&nbsp;//&nbsp;sentences&nbsp;present</td>
</tr>
<tr>
<td class="lineNumber">120</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TAGGED,&nbsp;//&nbsp;parts&nbsp;of&nbsp;speech&nbsp;present</td><td class="lineNumber">120</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TAGGED,&nbsp;//&nbsp;parts&nbsp;of&nbsp;speech&nbsp;present</td>
</tr>
<tr>
<td class="lineNumber">121</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;PARSED&nbsp;//&nbsp;syntax&nbsp;present</td><td class="lineNumber">121</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;PARSED&nbsp;//&nbsp;syntax&nbsp;present</td>
</tr>
<tr>
<td class="lineNumber">122</td><td class="equal">}</td><td class="lineNumber">122</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">123</td><td class="equal"></td><td class="lineNumber">123</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">124</td><td class="equal">/*&nbsp;***************************</td><td class="lineNumber">124</td><td class="equal">/*&nbsp;***************************</td>
</tr>
<tr>
<td class="lineNumber">125</td><td class="equal">&nbsp;*&nbsp;3)&nbsp;SOLUTION&nbsp;USING&nbsp;SUBTYPING</td><td class="lineNumber">125</td><td class="equal">&nbsp;*&nbsp;3)&nbsp;SOLUTION&nbsp;USING&nbsp;SUBTYPING</td>
</tr>
<tr>
<td class="lineNumber">126</td><td class="equal">&nbsp;*****************************/</td><td class="lineNumber">126</td><td class="equal">&nbsp;*****************************/</td>
</tr>
<tr>
<td class="lineNumber">127</td><td class="equal"></td><td class="lineNumber">127</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">128</td><td class="equal">/*</td><td class="lineNumber">128</td><td class="equal">/*</td>
</tr>
<tr>
<td class="lineNumber">129</td><td class="equal">&nbsp;*&nbsp;3.A)&nbsp;GENERIC&nbsp;HIERARCHY&nbsp;(AXIS&nbsp;Y&nbsp;OVER&nbsp;X)</td><td class="lineNumber">129</td><td class="equal">&nbsp;*&nbsp;3.A)&nbsp;GENERIC&nbsp;HIERARCHY&nbsp;(AXIS&nbsp;Y&nbsp;OVER&nbsp;X)</td>
</tr>
<tr>
<td class="lineNumber">130</td><td class="equal">&nbsp;*/</td><td class="lineNumber">130</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">131</td><td class="equal"></td><td class="lineNumber">131</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">132</td><td class="equal">//</td><td class="lineNumber">132</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">133</td><td class="equal">//&nbsp;3.A.I)&nbsp;UNPROCESSED</td><td class="lineNumber">133</td><td class="equal">//&nbsp;3.A.I)&nbsp;UNPROCESSED</td>
</tr>
<tr>
<td class="lineNumber">134</td><td class="equal">//</td><td class="lineNumber">134</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">135</td><td class="equal">interface&nbsp;LocalizedText&nbsp;extends&nbsp;TextualRange&nbsp;{</td><td class="lineNumber">135</td><td class="equal">interface&nbsp;LocalizedText&nbsp;extends&nbsp;TextualRange&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">136</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;locale();</td><td class="lineNumber">136</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;locale();</td>
</tr>
<tr>
<td class="lineNumber">137</td><td class="equal"></td><td class="lineNumber">137</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">138</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td><td class="lineNumber">138</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">139</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.UNPROCESSED;</td><td class="lineNumber">139</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.UNPROCESSED;</td>
</tr>
<tr>
<td class="lineNumber">140</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">140</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">141</td><td class="equal">}</td><td class="lineNumber">141</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">142</td><td class="equal"></td><td class="lineNumber">142</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">143</td><td class="equal">//</td><td class="lineNumber">143</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">144</td><td class="equal">//&nbsp;3.A.II)&nbsp;WITH&nbsp;TOKENS</td><td class="lineNumber">144</td><td class="equal">//&nbsp;3.A.II)&nbsp;WITH&nbsp;TOKENS</td>
</tr>
<tr>
<td class="lineNumber">145</td><td class="equal">//</td><td class="lineNumber">145</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">146</td><td class="equal">enum&nbsp;TokenType&nbsp;{</td><td class="lineNumber">146</td><td class="equal">enum&nbsp;TokenType&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">147</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;WORD,&nbsp;NUMERIC&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">147</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;WORD,&nbsp;NUMERIC&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">148</td><td class="equal">}</td><td class="lineNumber">148</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">149</td><td class="equal"></td><td class="lineNumber">149</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">150</td><td class="equal">interface&nbsp;Token&nbsp;extends&nbsp;TextualRange&nbsp;{</td><td class="lineNumber">150</td><td class="equal">interface&nbsp;Token&nbsp;extends&nbsp;TextualRange&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">151</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TokenType&nbsp;tokenType();</td><td class="lineNumber">151</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;TokenType&nbsp;tokenType();</td>
</tr>
<tr>
<td class="lineNumber">152</td><td class="equal">}</td><td class="lineNumber">152</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">153</td><td class="equal"></td><td class="lineNumber">153</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">154</td><td class="equal">interface&nbsp;TokenizedText&nbsp;extends&nbsp;LocalizedText&nbsp;{</td><td class="lineNumber">154</td><td class="equal">interface&nbsp;TokenizedText&nbsp;extends&nbsp;LocalizedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">155</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;Token&gt;&nbsp;tokenStream();</td><td class="lineNumber">155</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;Token&gt;&nbsp;tokenStream();</td>
</tr>
<tr>
<td class="lineNumber">156</td><td class="equal"></td><td class="lineNumber">156</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">157</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tokenCount();</td><td class="lineNumber">157</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tokenCount();</td>
</tr>
<tr>
<td class="lineNumber">158</td><td class="equal"></td><td class="lineNumber">158</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">159</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">159</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">160</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td><td class="lineNumber">160</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">161</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TOKENIZED;</td><td class="lineNumber">161</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TOKENIZED;</td>
</tr>
<tr>
<td class="lineNumber">162</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">162</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">163</td><td class="equal">}</td><td class="lineNumber">163</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">164</td><td class="equal"></td><td class="lineNumber">164</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">165</td><td class="equal">//</td><td class="lineNumber">165</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">166</td><td class="equal">//&nbsp;3.A.III)&nbsp;WITH&nbsp;SENTENCES</td><td class="lineNumber">166</td><td class="equal">//&nbsp;3.A.III)&nbsp;WITH&nbsp;SENTENCES</td>
</tr>
<tr>
<td class="lineNumber">167</td><td class="equal">//</td><td class="lineNumber">167</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">168</td><td class="equal">interface&nbsp;Sentence&nbsp;extends&nbsp;TextualRange&nbsp;{</td><td class="lineNumber">168</td><td class="equal">interface&nbsp;Sentence&nbsp;extends&nbsp;TextualRange&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">169</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;Token&gt;&nbsp;tokens();</td><td class="lineNumber">169</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;Token&gt;&nbsp;tokens();</td>
</tr>
<tr>
<td class="lineNumber">170</td><td class="equal"></td><td class="lineNumber">170</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">171</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;stage()&nbsp;{</td><td class="lineNumber">171</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;stage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">172</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.SENTENCIZED;</td><td class="lineNumber">172</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.SENTENCIZED;</td>
</tr>
<tr>
<td class="lineNumber">173</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">173</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">174</td><td class="equal">}</td><td class="lineNumber">174</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">175</td><td class="equal"></td><td class="lineNumber">175</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">176</td><td class="equal">interface&nbsp;SentencizedText&nbsp;extends&nbsp;TokenizedText&nbsp;{</td><td class="lineNumber">176</td><td class="equal">interface&nbsp;SentencizedText&nbsp;extends&nbsp;TokenizedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">177</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;Sentence&gt;&nbsp;sentences();</td><td class="lineNumber">177</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;Sentence&gt;&nbsp;sentences();</td>
</tr>
<tr>
<td class="lineNumber">178</td><td class="equal"></td><td class="lineNumber">178</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">179</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">179</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">180</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td><td class="lineNumber">180</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">181</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.SENTENCIZED;</td><td class="lineNumber">181</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.SENTENCIZED;</td>
</tr>
<tr>
<td class="lineNumber">182</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">182</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">183</td><td class="equal">}</td><td class="lineNumber">183</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">184</td><td class="equal"></td><td class="lineNumber">184</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">185</td><td class="equal">//</td><td class="lineNumber">185</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">186</td><td class="equal">//&nbsp;3.A.IV)&nbsp;WITH&nbsp;PARTS&nbsp;OF&nbsp;SPEECH</td><td class="lineNumber">186</td><td class="equal">//&nbsp;3.A.IV)&nbsp;WITH&nbsp;PARTS&nbsp;OF&nbsp;SPEECH</td>
</tr>
<tr>
<td class="lineNumber">187</td><td class="equal">//</td><td class="lineNumber">187</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">188</td><td class="changed">interface&nbsp;TaggedToken&lt;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;Token&nbsp;{</td><td class="lineNumber">188</td><td class="changed">interface&nbsp;TaggedToken&nbsp;extends&nbsp;Token&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">189</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;P&nbsp;partOfSpeech();&nbsp;//&nbsp;see&nbsp;section&nbsp;1.A&nbsp;above</td><td class="lineNumber">189</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;PartOfSpeech&nbsp;partOfSpeech();&nbsp;//&nbsp;see&nbsp;section&nbsp;1.A&nbsp;above</td>
</tr>
<tr>
<td class="lineNumber">190</td><td class="equal">}</td><td class="lineNumber">190</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">191</td><td class="equal"></td><td class="lineNumber">191</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">192</td><td class="changed">interface&nbsp;TaggedSentence&lt;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;Sentence&nbsp;{</td><td class="lineNumber">192</td><td class="changed">interface&nbsp;TaggedSentence&nbsp;extends&nbsp;Sentence&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">193</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">193</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">194</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;TaggedToken&lt;P&gt;&gt;&nbsp;tokens();</td><td class="lineNumber">194</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;TaggedToken&gt;&nbsp;tokens();</td>
</tr>
<tr>
<td class="lineNumber">195</td><td class="equal"></td><td class="lineNumber">195</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">196</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">196</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">197</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;stage()&nbsp;{</td><td class="lineNumber">197</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;stage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">198</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TAGGED;</td><td class="lineNumber">198</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TAGGED;</td>
</tr>
<tr>
<td class="lineNumber">199</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">199</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">200</td><td class="equal">}</td><td class="lineNumber">200</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">201</td><td class="equal"></td><td class="lineNumber">201</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">202</td><td class="changed">interface&nbsp;TaggedText&lt;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;SentencizedText&nbsp;{</td><td class="lineNumber">202</td><td class="changed">interface&nbsp;TaggedText&nbsp;extends&nbsp;SentencizedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">203</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;some&nbsp;(or&nbsp;even&nbsp;all)&nbsp;sentences&nbsp;may&nbsp;remain&nbsp;untagged</td><td class="lineNumber">203</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;some&nbsp;(or&nbsp;even&nbsp;all)&nbsp;sentences&nbsp;may&nbsp;remain&nbsp;untagged</td>
</tr>
<tr>
<td class="lineNumber">204</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;TaggedSentence&lt;P&gt;&gt;&nbsp;taggedSentenceStream();</td><td class="lineNumber">204</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;TaggedSentence&gt;&nbsp;taggedSentenceStream();</td>
</tr>
<tr>
<td class="lineNumber">205</td><td class="equal"></td><td class="lineNumber">205</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">206</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">206</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">207</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td><td class="lineNumber">207</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">208</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TAGGED;</td><td class="lineNumber">208</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TAGGED;</td>
</tr>
<tr>
<td class="lineNumber">209</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">209</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">210</td><td class="equal">}</td><td class="lineNumber">210</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">211</td><td class="equal"></td><td class="lineNumber">211</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">212</td><td class="equal">//</td><td class="lineNumber">212</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">213</td><td class="equal">//&nbsp;3.A.V)&nbsp;WITH&nbsp;SYNTAX</td><td class="lineNumber">213</td><td class="equal">//&nbsp;3.A.V)&nbsp;WITH&nbsp;SYNTAX</td>
</tr>
<tr>
<td class="lineNumber">214</td><td class="equal">//</td><td class="lineNumber">214</td><td class="equal">//</td>
</tr>
<tr>
<td class="lineNumber">215</td><td class="changed">interface&nbsp;Constituent&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;{</td><td class="lineNumber">215</td><td class="changed">interface&nbsp;Constituent&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">216</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;Constituent&lt;C,&nbsp;P&gt;&gt;&nbsp;childStream();</td><td class="lineNumber">216</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;Constituent&gt;&nbsp;childStream();</td>
</tr>
<tr>
<td class="lineNumber">217</td><td class="equal">}</td><td class="lineNumber">217</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">218</td><td class="equal"></td><td class="lineNumber">218</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">219</td><td class="changed">interface&nbsp;ConstituentBranch&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;Constituent&lt;C,&nbsp;P&gt;&nbsp;{</td><td class="lineNumber">219</td><td class="changed">interface&nbsp;ConstituentBranch&nbsp;extends&nbsp;Constituent&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">220</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;type();&nbsp;//&nbsp;see&nbsp;section&nbsp;1.B&nbsp;above</td><td class="lineNumber">220</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;ConstituentType&nbsp;type();&nbsp;//&nbsp;see&nbsp;section&nbsp;1.B&nbsp;above</td>
</tr>
<tr>
<td class="lineNumber">221</td><td class="equal">}</td><td class="lineNumber">221</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">222</td><td class="equal"></td><td class="lineNumber">222</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">223</td><td class="changed">interface&nbsp;ConstituentLeaf&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;Constituent&lt;C,&nbsp;P&gt;&nbsp;{</td><td class="lineNumber">223</td><td class="changed">interface&nbsp;ConstituentLeaf&nbsp;extends&nbsp;Constituent&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">224</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;TaggedToken&lt;P&gt;&nbsp;token();</td><td class="lineNumber">224</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;TaggedToken&nbsp;token();</td>
</tr>
<tr>
<td class="lineNumber">225</td><td class="equal"></td><td class="lineNumber">225</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">226</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">226</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">227</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stream&lt;?&nbsp;extends&nbsp;Constituent&lt;C,&nbsp;P&gt;&gt;&nbsp;childStream()&nbsp;{</td><td class="lineNumber">227</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stream&lt;?&nbsp;extends&nbsp;Constituent&gt;&nbsp;childStream()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">228</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stream.empty();</td><td class="lineNumber">228</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stream.empty();</td>
</tr>
<tr>
<td class="lineNumber">229</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">229</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">230</td><td class="equal">}</td><td class="lineNumber">230</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">231</td><td class="equal"></td><td class="lineNumber">231</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">232</td><td class="changed">interface&nbsp;Dependency&lt;D&nbsp;extends&nbsp;DependencyType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;{</td><td class="lineNumber">232</td><td class="changed">interface&nbsp;Dependency&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">233</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;D&nbsp;type();&nbsp;//&nbsp;see&nbsp;section&nbsp;1.C&nbsp;above</td><td class="lineNumber">233</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;DependencyType&nbsp;type();&nbsp;//&nbsp;see&nbsp;section&nbsp;1.C&nbsp;above</td>
</tr>
<tr>
<td class="lineNumber">234</td><td class="changed"></td><td class="lineNumber">234</td><td class="changed"></td>
</tr>
<tr>
<td class="lineNumber">235</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;TaggedToken&lt;P&gt;&nbsp;governor();</td><td class="lineNumber">235</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;TaggedToken&nbsp;governor();</td>
</tr>
<tr>
<td class="lineNumber">236</td><td class="changed"></td><td class="lineNumber">236</td><td class="changed"></td>
</tr>
<tr>
<td class="lineNumber">237</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;TaggedToken&lt;P&gt;&nbsp;dependent();</td><td class="lineNumber">237</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;TaggedToken&nbsp;dependent();</td>
</tr>
<tr>
<td class="lineNumber">238</td><td class="equal">}</td><td class="lineNumber">238</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">239</td><td class="equal"></td><td class="lineNumber">239</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">240</td><td class="changed">interface&nbsp;SentenceSyntax&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;D&nbsp;extends&nbsp;DependencyType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;{</td><td class="lineNumber">240</td><td class="changed">interface&nbsp;SentenceSyntax&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">241</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;ConstituentBranch&lt;C,&nbsp;P&gt;&nbsp;constituentTree();</td><td class="lineNumber">241</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;ConstituentBranch&nbsp;constituentTree();</td>
</tr>
<tr>
<td class="lineNumber">242</td><td class="changed"></td><td class="lineNumber">242</td><td class="changed"></td>
</tr>
<tr>
<td class="lineNumber">243</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;Dependency&lt;D,&nbsp;P&gt;&gt;&nbsp;dependencies();</td><td class="lineNumber">243</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;Dependency&gt;&nbsp;dependencies();</td>
</tr>
<tr>
<td class="lineNumber">244</td><td class="equal">}</td><td class="lineNumber">244</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">245</td><td class="equal"></td><td class="lineNumber">245</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">246</td><td class="changed">interface&nbsp;ParsedSentence&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;D&nbsp;extends&nbsp;DependencyType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;TaggedSent<br>ence&lt;P&gt;&nbsp;{</td><td class="lineNumber">246</td><td class="changed">interface&nbsp;ParsedSentence&nbsp;extends&nbsp;TaggedSentence&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">247</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;SentenceSyntax&lt;C,&nbsp;D,&nbsp;P&gt;&nbsp;syntax();</td><td class="lineNumber">247</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;SentenceSyntax&nbsp;syntax();</td>
</tr>
<tr>
<td class="lineNumber">248</td><td class="equal"></td><td class="lineNumber">248</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">249</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">249</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">250</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;stage()&nbsp;{</td><td class="lineNumber">250</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;stage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">251</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.PARSED;</td><td class="lineNumber">251</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.PARSED;</td>
</tr>
<tr>
<td class="lineNumber">252</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">252</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">253</td><td class="equal">}</td><td class="lineNumber">253</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">254</td><td class="equal"></td><td class="lineNumber">254</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">255</td><td class="changed">interface&nbsp;ParsedText&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;D&nbsp;extends&nbsp;DependencyType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;extends&nbsp;TaggedText&lt;P&gt;&nbsp;<br>{</td><td class="lineNumber">255</td><td class="changed">interface&nbsp;ParsedText&nbsp;extends&nbsp;TaggedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">256</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;some&nbsp;(or&nbsp;even&nbsp;all)&nbsp;sentences&nbsp;may&nbsp;remain&nbsp;unparsed</td><td class="lineNumber">256</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;some&nbsp;(or&nbsp;even&nbsp;all)&nbsp;sentences&nbsp;may&nbsp;remain&nbsp;unparsed</td>
</tr>
<tr>
<td class="lineNumber">257</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;ParsedSentence&lt;C,&nbsp;D,&nbsp;P&gt;&gt;&nbsp;parsedSentenceStream();</td><td class="lineNumber">257</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;ParsedSentence&gt;&nbsp;parsedSentenceStream();</td>
</tr>
<tr>
<td class="lineNumber">258</td><td class="equal"></td><td class="lineNumber">258</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">259</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">259</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">260</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td><td class="lineNumber">260</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stage&nbsp;maxStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">261</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.PARSED;</td><td class="lineNumber">261</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.PARSED;</td>
</tr>
<tr>
<td class="lineNumber">262</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">262</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">263</td><td class="equal">}</td><td class="lineNumber">263</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">264</td><td class="equal"></td><td class="lineNumber">264</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">265</td><td class="added">/*</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">266</td><td class="added">&nbsp;*&nbsp;3.B)&nbsp;LANGUAGE-SPECIFIC&nbsp;HIERARCHY&nbsp;(AXIS&nbsp;Z&nbsp;OVER&nbsp;Y&nbsp;OVER&nbsp;X)</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">267</td><td class="added">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">268</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">269</td><td class="added">//</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">270</td><td class="added">//&nbsp;3.B.I)&nbsp;ENGLISH</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">271</td><td class="added">//</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">272</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">273</td><td class="added">//&nbsp;3.B.I.a)&nbsp;ENGLISH&nbsp;PARTS&nbsp;OF&nbsp;SPEECH</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">274</td><td class="added">interface&nbsp;EnglishTaggedToken&nbsp;extends&nbsp;TaggedToken&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">275</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">276</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishPartOfSpeech&nbsp;partOfSpeech();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">277</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">278</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">279</td><td class="added">interface&nbsp;EnglishTaggedSentence&nbsp;extends&nbsp;TaggedSentence&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">280</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">281</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;EnglishTaggedToken&gt;&nbsp;tokens();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">282</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">283</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">284</td><td class="added">interface&nbsp;EnglishTaggedText&nbsp;extends&nbsp;TaggedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">285</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;//&nbsp;some&nbsp;(or&nbsp;even&nbsp;all)&nbsp;sentences&nbsp;may&nbsp;remain&nbsp;untagged</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">286</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stream&lt;?&nbsp;extends&nbsp;EnglishTaggedSentence&gt;&nbsp;taggedSentenceStream()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">287</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Seq.ofType(sentences().stream(),&nbsp;EnglishTaggedSentence.class);</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">288</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">289</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">290</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">291</td><td class="added">//&nbsp;3.B.I.b)&nbsp;ENGLISH&nbsp;SYNTAX</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">292</td><td class="added">interface&nbsp;EnglishConstituent&nbsp;extends&nbsp;Constituent&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">293</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">294</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;Stream&lt;?&nbsp;extends&nbsp;EnglishConstituent&gt;&nbsp;childStream();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">295</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">296</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">297</td><td class="added">interface&nbsp;EnglishConstituentBranch&nbsp;extends&nbsp;EnglishConstituent,&nbsp;ConstituentBranch&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">298</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">299</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishConstituentType&nbsp;type();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">300</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">301</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">302</td><td class="added">interface&nbsp;EnglishConstituentLeaf&nbsp;extends&nbsp;EnglishConstituent,&nbsp;ConstituentLeaf&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">303</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">304</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishTaggedToken&nbsp;token();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">305</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">306</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">307</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stream&lt;?&nbsp;extends&nbsp;EnglishConstituent&gt;&nbsp;childStream()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">308</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stream.empty();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">309</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">310</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">311</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">312</td><td class="added">interface&nbsp;EnglishDependency&nbsp;extends&nbsp;Dependency&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">313</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">314</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishDependencyType&nbsp;type();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">315</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">316</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">317</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishTaggedToken&nbsp;governor();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">318</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">319</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">320</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishTaggedToken&nbsp;dependent();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">321</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">322</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">323</td><td class="added">interface&nbsp;EnglishSentenceSyntax&nbsp;extends&nbsp;SentenceSyntax&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">324</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">325</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishConstituentBranch&nbsp;constituentTree();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">326</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">327</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">328</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;EnglishDependency&gt;&nbsp;dependencies();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">329</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">330</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">331</td><td class="added">interface&nbsp;EnglishParsedSentence&nbsp;extends&nbsp;EnglishTaggedSentence,&nbsp;ParsedSentence&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">332</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">333</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;EnglishSentenceSyntax&nbsp;syntax();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">334</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">335</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">336</td><td class="added">interface&nbsp;EnglishParsedText&nbsp;extends&nbsp;EnglishTaggedText,&nbsp;ParsedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">337</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;//&nbsp;some&nbsp;(or&nbsp;even&nbsp;all)&nbsp;sentences&nbsp;may&nbsp;remain&nbsp;unparsed</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">338</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stream&lt;?&nbsp;extends&nbsp;EnglishParsedSentence&gt;&nbsp;parsedSentenceStream()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">339</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Seq.ofType(sentences().stream(),&nbsp;EnglishParsedSentence.class);</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">340</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">341</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">342</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">343</td><td class="added">//</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">344</td><td class="added">//&nbsp;3.B.II)&nbsp;GERMAN</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">345</td><td class="added">//</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">346</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">347</td><td class="added">//&nbsp;3.B.II.a)&nbsp;GERMAN&nbsp;PARTS&nbsp;OF&nbsp;SPEECH</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">348</td><td class="added">interface&nbsp;GermanTaggedToken&nbsp;extends&nbsp;TaggedToken&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">349</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">350</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;GermanPartOfSpeech&nbsp;partOfSpeech();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">351</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">352</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">353</td><td class="added">interface&nbsp;GermanTaggedSentence&nbsp;extends&nbsp;TaggedSentence&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">354</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">355</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;List&lt;?&nbsp;extends&nbsp;GermanTaggedToken&gt;&nbsp;tokens();</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">356</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">357</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">358</td><td class="added">interface&nbsp;GermanTaggedText&nbsp;extends&nbsp;TaggedText&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">359</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">360</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;Stream&lt;?&nbsp;extends&nbsp;GermanTaggedSentence&gt;&nbsp;taggedSentenceStream()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">361</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Seq.ofType(sentences().stream(),&nbsp;GermanTaggedSentence.class);</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">362</td><td class="added">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">363</td><td class="added">}</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">364</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">365</td><td class="added">//&nbsp;3.B.II.b)&nbsp;GERMAN&nbsp;SYNTAX&nbsp;(missing&nbsp;as&nbsp;of&nbsp;yet)</td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">366</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">367</td><td class="added"></td>
</tr>
<tr>
<td class="lineNumber">265</td><td class="equal">/*&nbsp;***********************</td><td class="lineNumber">368</td><td class="equal">/*&nbsp;***********************</td>
</tr>
<tr>
<td class="lineNumber">266</td><td class="equal">&nbsp;*&nbsp;4)&nbsp;PRODUCERS&nbsp;OF&nbsp;THE&nbsp;API</td><td class="lineNumber">369</td><td class="equal">&nbsp;*&nbsp;4)&nbsp;PRODUCERS&nbsp;OF&nbsp;THE&nbsp;API</td>
</tr>
<tr>
<td class="lineNumber">267</td><td class="equal">&nbsp;*************************/</td><td class="lineNumber">370</td><td class="equal">&nbsp;*************************/</td>
</tr>
<tr>
<td class="lineNumber">268</td><td class="equal"></td><td class="lineNumber">371</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">269</td><td class="equal">interface&nbsp;TextProcessingRequest&nbsp;{&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">372</td><td class="equal">interface&nbsp;TextProcessingRequest&nbsp;{&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">270</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;locale();</td><td class="lineNumber">373</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;locale();</td>
</tr>
<tr>
<td class="lineNumber">271</td><td class="equal"></td><td class="lineNumber">374</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">272</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text();</td><td class="lineNumber">375</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text();</td>
</tr>
<tr>
<td class="lineNumber">273</td><td class="equal"></td><td class="lineNumber">376</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">274</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Stage&nbsp;targetStage();</td><td class="lineNumber">377</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Stage&nbsp;targetStage();</td>
</tr>
<tr>
<td class="lineNumber">275</td><td class="equal">}</td><td class="lineNumber">378</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">276</td><td class="equal"></td><td class="lineNumber">379</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">277</td><td class="equal">interface&nbsp;TextProcessor&nbsp;{</td><td class="lineNumber">380</td><td class="equal">interface&nbsp;TextProcessor&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">278</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;LocalizedText&nbsp;processText(TextProcessingRequest&nbsp;request);</td><td class="lineNumber">381</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;LocalizedText&nbsp;processText(TextProcessingRequest&nbsp;request);</td>
</tr>
<tr>
<td class="lineNumber">279</td><td class="equal">}</td><td class="lineNumber">382</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">280</td><td class="equal"></td><td class="lineNumber">383</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">281</td><td class="equal">/*&nbsp;***********************</td><td class="lineNumber">384</td><td class="equal">/*&nbsp;***********************</td>
</tr>
<tr>
<td class="lineNumber">282</td><td class="equal">&nbsp;*&nbsp;5)&nbsp;CONSUMERS&nbsp;OF&nbsp;THE&nbsp;API</td><td class="lineNumber">385</td><td class="equal">&nbsp;*&nbsp;5)&nbsp;CONSUMERS&nbsp;OF&nbsp;THE&nbsp;API</td>
</tr>
<tr>
<td class="lineNumber">283</td><td class="equal">&nbsp;*************************/</td><td class="lineNumber">386</td><td class="equal">&nbsp;*************************/</td>
</tr>
<tr>
<td class="lineNumber">284</td><td class="equal"></td><td class="lineNumber">387</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">285</td><td class="equal">/*</td><td class="lineNumber">388</td><td class="equal">/*</td>
</tr>
<tr>
<td class="lineNumber">286</td><td class="equal">&nbsp;*&nbsp;5.A)&nbsp;DIRECT&nbsp;CONSUMERS</td><td class="lineNumber">389</td><td class="equal">&nbsp;*&nbsp;5.A)&nbsp;DIRECT&nbsp;CONSUMERS</td>
</tr>
<tr>
<td class="lineNumber">287</td><td class="equal">&nbsp;*/</td><td class="lineNumber">390</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">288</td><td class="equal"></td><td class="lineNumber">391</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">289</td><td class="equal">class&nbsp;GermanPostpositionChecker&nbsp;{</td><td class="lineNumber">392</td><td class="equal">class&nbsp;GermanPostpositionChecker&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">290</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;checkTaggedText(TaggedText&lt;GermanPartOfSpeech&gt;&nbsp;text)&nbsp;{</td><td class="lineNumber">393</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;checkTaggedText(GermanTaggedText&nbsp;text)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">291</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.taggedSentenceStream().forEach(this::checkTaggedSentence);</td><td class="lineNumber">394</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.taggedSentenceStream().forEach(this::checkTaggedSentence);</td>
</tr>
<tr>
<td class="lineNumber">292</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">395</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">293</td><td class="equal"></td><td class="lineNumber">396</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">294</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkTaggedSentence(TaggedSentence&lt;GermanPartOfSpeech&gt;&nbsp;sentence)&nbsp;{</td><td class="lineNumber">397</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkTaggedSentence(GermanTaggedSentence&nbsp;sentence)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">295</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sentence.tokens().stream()</td><td class="lineNumber">398</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sentence.tokens().stream()</td>
</tr>
<tr>
<td class="lineNumber">296</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(this::isPostposition)</td><td class="lineNumber">399</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(this::isPostposition)</td>
</tr>
<tr>
<td class="lineNumber">297</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(this::checkPostposition);</td><td class="lineNumber">400</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(this::checkPostposition);</td>
</tr>
<tr>
<td class="lineNumber">298</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">401</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">299</td><td class="equal"></td><td class="lineNumber">402</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">300</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isPostposition(TaggedToken&lt;GermanPartOfSpeech&gt;&nbsp;token)&nbsp;{</td><td class="lineNumber">403</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isPostposition(GermanTaggedToken&nbsp;token)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">301</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;token.partOfSpeech().isPostposition();</td><td class="lineNumber">404</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;token.partOfSpeech().isPostposition();</td>
</tr>
<tr>
<td class="lineNumber">302</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">405</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">303</td><td class="equal"></td><td class="lineNumber">406</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">304</td><td class="equal"></td><td class="lineNumber">407</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">305</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkPostposition(TaggedToken&lt;GermanPartOfSpeech&gt;&nbsp;token)&nbsp;{</td><td class="lineNumber">408</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkPostposition(GermanTaggedToken&nbsp;token)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">306</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td><td class="lineNumber">409</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td>
</tr>
<tr>
<td class="lineNumber">307</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">410</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">308</td><td class="equal">}</td><td class="lineNumber">411</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">309</td><td class="equal"></td><td class="lineNumber">412</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">310</td><td class="equal">class&nbsp;EnglishNominalSubjectChecker&nbsp;{</td><td class="lineNumber">413</td><td class="equal">class&nbsp;EnglishNominalSubjectChecker&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">311</td><td class="equal"></td><td class="lineNumber">414</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">312</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;checkNominalSubjects(ParsedText&lt;?,&nbsp;EnglishDependencyType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;text)&nbsp;{</td><td class="lineNumber">415</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;checkNominalSubjects(EnglishParsedText&nbsp;text)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">313</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.parsedSentenceStream().forEach(this::checkNominalSubjects);</td><td class="lineNumber">416</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.parsedSentenceStream().forEach(this::checkNominalSubjects);</td>
</tr>
<tr>
<td class="lineNumber">314</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">417</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">315</td><td class="equal"></td><td class="lineNumber">418</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">316</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalSubjects(ParsedSentence&lt;?,&nbsp;EnglishDependencyType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;sentence)&nbsp;{</td><td class="lineNumber">419</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalSubjects(EnglishParsedSentence&nbsp;sentence)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">317</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sentence.syntax().dependencies().stream()</td><td class="lineNumber">420</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sentence.syntax().dependencies().stream()</td>
</tr>
<tr>
<td class="lineNumber">318</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(this::isCertainTypeOfNominalSubjectDependency)</td><td class="lineNumber">421</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(this::isCertainTypeOfNominalSubjectDependency)</td>
</tr>
<tr>
<td class="lineNumber">319</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(this::checkNominalSubject);</td><td class="lineNumber">422</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(this::checkNominalSubject);</td>
</tr>
<tr>
<td class="lineNumber">320</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">423</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">321</td><td class="equal"></td><td class="lineNumber">424</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">322</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isCertainTypeOfNominalSubjectDependency(Dependency&lt;EnglishDependencyType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;depen<br>dency)&nbsp;{</td><td class="lineNumber">425</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isCertainTypeOfNominalSubjectDependency(EnglishDependency&nbsp;dependency)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">323</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dependency.type()&nbsp;==&nbsp;EnglishDependencyType.NOMINAL_SUBJECT&nbsp;&amp;&amp;&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">426</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dependency.type()&nbsp;==&nbsp;EnglishDependencyType.NOMINAL_SUBJECT&nbsp;&amp;&amp;&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">324</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">427</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">325</td><td class="equal"></td><td class="lineNumber">428</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">326</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalSubject(Dependency&lt;EnglishDependencyType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;dependency)&nbsp;{</td><td class="lineNumber">429</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalSubject(EnglishDependency&nbsp;dependency)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">327</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNominalGovernor(dependency.governor());</td><td class="lineNumber">430</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNominalGovernor(dependency.governor());</td>
</tr>
<tr>
<td class="lineNumber">328</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNominalDependent(dependency.dependent());</td><td class="lineNumber">431</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNominalDependent(dependency.dependent());</td>
</tr>
<tr>
<td class="lineNumber">329</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">432</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">330</td><td class="equal"></td><td class="lineNumber">433</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">331</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalGovernor(TaggedToken&lt;EnglishPartOfSpeech&gt;&nbsp;governor)&nbsp;{</td><td class="lineNumber">434</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalGovernor(EnglishTaggedToken&nbsp;governor)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">332</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(checkGovernorPartOfSpeech(governor.partOfSpeech()))&nbsp;{</td><td class="lineNumber">435</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(checkGovernorPartOfSpeech(governor.partOfSpeech()))&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">333</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td><td class="lineNumber">436</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td>
</tr>
<tr>
<td class="lineNumber">334</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">437</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">335</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">438</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">336</td><td class="equal"></td><td class="lineNumber">439</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">337</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalDependent(TaggedToken&lt;EnglishPartOfSpeech&gt;&nbsp;dependent)&nbsp;{</td><td class="lineNumber">440</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;checkNominalDependent(EnglishTaggedToken&nbsp;dependent)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">338</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(checkDependentPartOfSpeech(dependent.partOfSpeech()))&nbsp;{</td><td class="lineNumber">441</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(checkDependentPartOfSpeech(dependent.partOfSpeech()))&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">339</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td><td class="lineNumber">442</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td>
</tr>
<tr>
<td class="lineNumber">340</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">443</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">341</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">444</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">342</td><td class="equal"></td><td class="lineNumber">445</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">343</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;checkGovernorPartOfSpeech(EnglishPartOfSpeech&nbsp;partOfSpeech)&nbsp;{</td><td class="lineNumber">446</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;checkGovernorPartOfSpeech(EnglishPartOfSpeech&nbsp;partOfSpeech)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">344</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">447</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">345</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">448</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">346</td><td class="equal"></td><td class="lineNumber">449</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">347</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;checkDependentPartOfSpeech(EnglishPartOfSpeech&nbsp;partOfSpeech)&nbsp;{</td><td class="lineNumber">450</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;checkDependentPartOfSpeech(EnglishPartOfSpeech&nbsp;partOfSpeech)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">348</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">451</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">349</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">452</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">350</td><td class="equal">}</td><td class="lineNumber">453</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">351</td><td class="equal"></td><td class="lineNumber">454</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">352</td><td class="equal">class&nbsp;EnglishRelevantConstituentHandler&nbsp;{</td><td class="lineNumber">455</td><td class="equal">class&nbsp;EnglishRelevantConstituentHandler&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">353</td><td class="equal"></td><td class="lineNumber">456</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">354</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;handleRelevantConstituents(ParsedText&lt;EnglishConstituentType,&nbsp;?,&nbsp;EnglishPartOfSpeech&gt;&nbsp;text)&nbsp;{</td><td class="lineNumber">457</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;handleRelevantConstituents(EnglishParsedText&nbsp;text)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">355</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.parsedSentenceStream().forEach(this::handleRelevantConstiuents);</td><td class="lineNumber">458</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.parsedSentenceStream().forEach(this::handleRelevantConstiuents);</td>
</tr>
<tr>
<td class="lineNumber">356</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">459</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">357</td><td class="equal"></td><td class="lineNumber">460</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">358</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleRelevantConstiuents(ParsedSentence&lt;EnglishConstituentType,&nbsp;?,&nbsp;EnglishPartOfSpeech&gt;&nbsp;sentence)&nbsp;{</td><td class="lineNumber">461</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleRelevantConstiuents(EnglishParsedSentence&nbsp;sentence)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">359</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constituents.flatConstituentStream(sentence.syntax().constituentTree())</td><td class="lineNumber">462</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnglishConstituents.flatConstituentStream(sentence.syntax().constituentTree())</td>
</tr>
<tr>
<td class="lineNumber">360</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(this::isRelevantConstituent)</td><td class="lineNumber">463</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(this::isRelevantConstituent)</td>
</tr>
<tr>
<td class="lineNumber">361</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(this::handleRelevantConstituent);</td><td class="lineNumber">464</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(this::handleRelevantConstituent);</td>
</tr>
<tr>
<td class="lineNumber">362</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">465</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">363</td><td class="equal"></td><td class="lineNumber">466</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">364</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isRelevantConstituent(Constituent&lt;EnglishConstituentType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;constituent)&nbsp;{</td><td class="lineNumber">467</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isRelevantConstituent(EnglishConstituent&nbsp;constituent)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">365</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">468</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">366</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">469</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">367</td><td class="equal"></td><td class="lineNumber">470</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">368</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleRelevantConstituent(Constituent&lt;EnglishConstituentType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;constituent)&nbsp;{</td><td class="lineNumber">471</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleRelevantConstituent(EnglishConstituent&nbsp;constituent)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">369</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td><td class="lineNumber">472</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td>
</tr>
<tr>
<td class="lineNumber">370</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">473</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">371</td><td class="equal">}</td><td class="lineNumber">474</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">372</td><td class="equal"></td><td class="lineNumber">475</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">373</td><td class="changed">class&nbsp;Constituents&nbsp;{</td><td class="lineNumber">476</td><td class="changed">class&nbsp;EnglishConstituents&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">374</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;/**</td><td class="lineNumber">477</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;/**</td>
</tr>
<tr>
<td class="lineNumber">375</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;the&nbsp;constituent&nbsp;and&nbsp;all&nbsp;its&nbsp;descendants&nbsp;as&nbsp;a&nbsp;flattended&nbsp;Stream.</td><td class="lineNumber">478</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;the&nbsp;constituent&nbsp;and&nbsp;all&nbsp;its&nbsp;descendants&nbsp;as&nbsp;a&nbsp;flattended&nbsp;Stream.</td>
</tr>
<tr>
<td class="lineNumber">376</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</td><td class="lineNumber">479</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">377</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;&lt;C&nbsp;extends&nbsp;ConstituentType,&nbsp;P&nbsp;extends&nbsp;PartOfSpeech&gt;&nbsp;Stream&lt;Constituent&lt;C,&nbsp;P&gt;&gt;&nbsp;flatConstituentStream(Constitue<br>nt&lt;C,&nbsp;P&gt;&nbsp;constituent)&nbsp;{</td><td class="lineNumber">480</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;Stream&lt;EnglishConstituent&gt;&nbsp;flatConstituentStream(EnglishConstituent&nbsp;constituent)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">378</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stream.concat(</td><td class="lineNumber">481</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stream.concat(</td>
</tr>
<tr>
<td class="lineNumber">379</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream.of(constituent),</td><td class="lineNumber">482</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream.of(constituent),</td>
</tr>
<tr>
<td class="lineNumber">380</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constituent.childStream().flatMap(Constituents::flatConstituentStream)</td><td class="lineNumber">483</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constituent.childStream().flatMap(EnglishConstituents::flatConstituentStream)</td>
</tr>
<tr>
<td class="lineNumber">381</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</td><td class="lineNumber">484</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</td>
</tr>
<tr>
<td class="lineNumber">382</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">485</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">383</td><td class="equal">}</td><td class="lineNumber">486</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">384</td><td class="equal"></td><td class="lineNumber">487</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">385</td><td class="equal"></td><td class="lineNumber">488</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">386</td><td class="equal">/*</td><td class="lineNumber">489</td><td class="equal">/*</td>
</tr>
<tr>
<td class="lineNumber">387</td><td class="equal">&nbsp;*&nbsp;5.B)&nbsp;INDIRECT&nbsp;CONSUMERS</td><td class="lineNumber">490</td><td class="equal">&nbsp;*&nbsp;5.B)&nbsp;INDIRECT&nbsp;CONSUMERS</td>
</tr>
<tr>
<td class="lineNumber">388</td><td class="equal">&nbsp;*/</td><td class="lineNumber">491</td><td class="equal">&nbsp;*/</td>
</tr>
<tr>
<td class="lineNumber">389</td><td class="equal">interface&nbsp;ProcessedTextConsumer&nbsp;{&nbsp;//&nbsp;SIMPLIFICATION</td><td class="lineNumber">492</td><td class="equal">interface&nbsp;ProcessedTextConsumer&nbsp;{&nbsp;//&nbsp;SIMPLIFICATION</td>
</tr>
<tr>
<td class="lineNumber">390</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;supportedLocale();</td><td class="lineNumber">493</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;supportedLocale();</td>
</tr>
<tr>
<td class="lineNumber">391</td><td class="equal"></td><td class="lineNumber">494</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">392</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Stage&nbsp;requiredStage();</td><td class="lineNumber">495</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;Stage&nbsp;requiredStage();</td>
</tr>
<tr>
<td class="lineNumber">393</td><td class="equal"></td><td class="lineNumber">496</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">394</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;consume(LocalizedText&nbsp;text);</td><td class="lineNumber">497</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;consume(LocalizedText&nbsp;text);</td>
</tr>
<tr>
<td class="lineNumber">395</td><td class="equal">}</td><td class="lineNumber">498</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">396</td><td class="equal"></td><td class="lineNumber">499</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">397</td><td class="equal">class&nbsp;SampleUniversalTokenizedTextConsumer&nbsp;implements&nbsp;ProcessedTextConsumer&nbsp;{</td><td class="lineNumber">500</td><td class="equal">class&nbsp;SampleUniversalTokenizedTextConsumer&nbsp;implements&nbsp;ProcessedTextConsumer&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">398</td><td class="equal"></td><td class="lineNumber">501</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">399</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">502</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">400</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Locale&nbsp;supportedLocale()&nbsp;{</td><td class="lineNumber">503</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Locale&nbsp;supportedLocale()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">401</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Locale.ROOT;</td><td class="lineNumber">504</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Locale.ROOT;</td>
</tr>
<tr>
<td class="lineNumber">402</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">505</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">403</td><td class="equal"></td><td class="lineNumber">506</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">404</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">507</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">405</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stage&nbsp;requiredStage()&nbsp;{</td><td class="lineNumber">508</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stage&nbsp;requiredStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">406</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TOKENIZED;</td><td class="lineNumber">509</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TOKENIZED;</td>
</tr>
<tr>
<td class="lineNumber">407</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">510</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">408</td><td class="equal"></td><td class="lineNumber">511</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">409</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">512</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">410</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;consume(LocalizedText&nbsp;text)&nbsp;{</td><td class="lineNumber">513</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;consume(LocalizedText&nbsp;text)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">411</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleTokenizedText((TokenizedText)&nbsp;text);</td><td class="lineNumber">514</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleTokenizedText((TokenizedText)&nbsp;text);</td>
</tr>
<tr>
<td class="lineNumber">412</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">515</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">413</td><td class="equal"></td><td class="lineNumber">516</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">414</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleTokenizedText(TokenizedText&nbsp;tokenizedText)&nbsp;{</td><td class="lineNumber">517</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleTokenizedText(TokenizedText&nbsp;tokenizedText)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">415</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td><td class="lineNumber">518</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;logic</td>
</tr>
<tr>
<td class="lineNumber">416</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">519</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">417</td><td class="equal">}</td><td class="lineNumber">520</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">418</td><td class="equal"></td><td class="lineNumber">521</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">419</td><td class="equal">class&nbsp;SampleGermanTaggedConsumer&nbsp;implements&nbsp;ProcessedTextConsumer&nbsp;{</td><td class="lineNumber">522</td><td class="equal">class&nbsp;SampleGermanTaggedConsumer&nbsp;implements&nbsp;ProcessedTextConsumer&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">420</td><td class="equal"></td><td class="lineNumber">523</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">421</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">524</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">422</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Locale&nbsp;supportedLocale()&nbsp;{</td><td class="lineNumber">525</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Locale&nbsp;supportedLocale()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">423</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Locale.GERMAN;</td><td class="lineNumber">526</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Locale.GERMAN;</td>
</tr>
<tr>
<td class="lineNumber">424</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">527</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">425</td><td class="equal"></td><td class="lineNumber">528</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">426</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">529</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">427</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stage&nbsp;requiredStage()&nbsp;{</td><td class="lineNumber">530</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stage&nbsp;requiredStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">428</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TAGGED;</td><td class="lineNumber">531</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.TAGGED;</td>
</tr>
<tr>
<td class="lineNumber">429</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">532</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">430</td><td class="equal"></td><td class="lineNumber">533</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">431</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">534</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">432</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;consume(LocalizedText&nbsp;text)&nbsp;{</td><td class="lineNumber">535</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;consume(LocalizedText&nbsp;text)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">433</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UNSAFE&nbsp;UNCHECKED&nbsp;CAST!</td><td class="lineNumber">536</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GermanTaggedText&nbsp;germanTaggedText&nbsp;=&nbsp;(GermanTaggedText)&nbsp;text;&nbsp;//&nbsp;SAFE&nbsp;CAST</td>
</tr>
<tr>
<td class="lineNumber">434</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TaggedText&lt;GermanPartOfSpeech&gt;&nbsp;germanTaggedText&nbsp;=&nbsp;(TaggedText&lt;GermanPartOfSpeech&gt;)&nbsp;text;</td><td class="lineNumber"></td><td class="changed"></td>
</tr>
<tr>
<td class="lineNumber">435</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;GermanPostpositionChecker().checkTaggedText(germanTaggedText);</td><td class="lineNumber">537</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;GermanPostpositionChecker().checkTaggedText(germanTaggedText);</td>
</tr>
<tr>
<td class="lineNumber">436</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">538</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">437</td><td class="equal">}</td><td class="lineNumber">539</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">438</td><td class="equal"></td><td class="lineNumber">540</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">439</td><td class="equal">class&nbsp;SampleEnglishParsedTextConsumer&nbsp;implements&nbsp;ProcessedTextConsumer&nbsp;{</td><td class="lineNumber">541</td><td class="equal">class&nbsp;SampleEnglishParsedTextConsumer&nbsp;implements&nbsp;ProcessedTextConsumer&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">440</td><td class="equal"></td><td class="lineNumber">542</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">441</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">543</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">442</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Locale&nbsp;supportedLocale()&nbsp;{</td><td class="lineNumber">544</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Locale&nbsp;supportedLocale()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">443</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Locale.ENGLISH;</td><td class="lineNumber">545</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Locale.ENGLISH;</td>
</tr>
<tr>
<td class="lineNumber">444</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">546</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">445</td><td class="equal"></td><td class="lineNumber">547</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">446</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">548</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">447</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stage&nbsp;requiredStage()&nbsp;{</td><td class="lineNumber">549</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Stage&nbsp;requiredStage()&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">448</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.PARSED;</td><td class="lineNumber">550</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Stage.PARSED;</td>
</tr>
<tr>
<td class="lineNumber">449</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">551</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">450</td><td class="equal"></td><td class="lineNumber">552</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">451</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td><td class="lineNumber">553</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;@Override</td>
</tr>
<tr>
<td class="lineNumber">452</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;consume(LocalizedText&nbsp;text)&nbsp;{</td><td class="lineNumber">554</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;consume(LocalizedText&nbsp;text)&nbsp;{</td>
</tr>
<tr>
<td class="lineNumber">453</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UNSAFE&nbsp;UNCHECKED&nbsp;CAST!</td><td class="lineNumber">555</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnglishParsedText&nbsp;englishParsedText&nbsp;=&nbsp;(EnglishParsedText)&nbsp;text;&nbsp;//&nbsp;SAFE&nbsp;CAST</td>
</tr>
<tr>
<td class="lineNumber">454</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParsedText&lt;?,&nbsp;EnglishDependencyType,&nbsp;EnglishPartOfSpeech&gt;&nbsp;englishParsedText</td><td class="lineNumber"></td><td class="changed"></td>
</tr>
<tr>
<td class="lineNumber">455</td><td class="changed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(ParsedText&lt;?,&nbsp;EnglishDependencyType,&nbsp;EnglishPartOfSpeech&gt;)&nbsp;text;</td><td class="lineNumber"></td><td class="changed"></td>
</tr>
<tr>
<td class="lineNumber">456</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText);</td><td class="lineNumber">556</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText);</td>
</tr>
<tr>
<td class="lineNumber">457</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td><td class="lineNumber">557</td><td class="equal">&nbsp;&nbsp;&nbsp;&nbsp;}</td>
</tr>
<tr>
<td class="lineNumber">458</td><td class="equal">}</td><td class="lineNumber">558</td><td class="equal">}</td>
</tr>
<tr>
<td class="lineNumber">459</td><td class="equal"></td><td class="lineNumber">559</td><td class="equal"></td>
</tr>
<tr>
<td class="lineNumber">460</td><td class="equal"></td><td class="lineNumber">560</td><td class="equal"></td>
</tr>
</table>
</body>
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;
/* ****************************************
* 1) CORE LANGUAGE-SPECIFIC TYPES (AXIS Z)
******************************************/
/*
* 1.A) PART OF SPEECH
* https://en.wikipedia.org/wiki/Part_of_speech
*/
//
// 1.A.I) ENGLISH PART OF SPEECH
//
/**
* Implementing classes consist of one or more part-of-speech tags (each tag provided by a different tagger).
*/
interface PartOfSpeech {
}
class EnglishPartOfSpeech implements PartOfSpeech {
private final Type1EnglishTag type1Tag = Type1EnglishTag.TO; // SIMPLIFICATION
private final Type2EnglishTag type2Tag = Type2EnglishTag.GENERAL_PREPOSITION; // SIMPLIFICATION
boolean isInfinitiveMarker() {
return type1Tag == Type1EnglishTag.TO && type2Tag == Type2EnglishTag.INFINITIVE_MARKER;
}
}
enum Type1EnglishTag {
// SIMPLIFICATION (partial content)
TO // "to" as a preposition or an infinitive marker
}
enum Type2EnglishTag {
// SIMPLIFICATION (partial content)
GENERAL_PREPOSITION, // e.g. "to" in "I said to him that..."
INFINITIVE_MARKER // "to", e.g. in "I want to ask."
}
//
// 1.A.II) GERMAN PART OF SPEECH
//
class GermanPartOfSpeech implements PartOfSpeech {
private final Type1GermanTag type1Tag = Type1GermanTag.POSTPOSITION; // SIMPLIFICATION
boolean isPostposition() {
return type1Tag == Type1GermanTag.POSTPOSITION;
}
}
enum Type1GermanTag {
// SIMPLIFICATION (partial content)
POSTPOSITION, // e.g. "zufolge"
}
/*
* 1.B) CONSTITUENT
* https://en.wikipedia.org/wiki/Phrase_structure_grammar
*/
interface ConstituentType {
}
enum EnglishConstituentType implements ConstituentType {
// SIMPLIFICATION (partial content)
VERB_PHRASE, // e.g. "is doing nice"
WH_WORD_NOUN_PHRASE // e.g. "whose daughter"
}
// enum GermanConstituentType missing as of yet
/*
* 1.C) DEPENDENCY
* https://en.wikipedia.org/wiki/Dependency_grammar
*/
interface DependencyType {
}
enum EnglishDependencyType implements DependencyType {
// SIMPLIFICATION (partial content)
NOMINAL_SUBJECT, // e.g. "he" <- "walks" in "He walks."
PHRASAL_VERB_PARTICLE // e.g. "shut" -> "down" in "It was shut down."
}
// enum GermanDependencyType missing as of yet
/* ***************
* 2) HELPER TYPES
*****************/
interface TextualRange {
String text();
int startOffset(); // inclusive
int endOffset(); // exclusive
}
interface Seq {
/**
* Stub for <a href="https://www.jooq.org/products/jOOλ/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.stream.Stream-java.lang.Class-">Seq.ofType()</a>.
*/
@SuppressWarnings("unchecked")
static <T, U> Stream<U> ofType(Stream<? extends T> stream, Class<? extends U> type) {
return stream.filter(type::isInstance).map(t -> (U) t);
}
}
/**
* Defines the stage of text processing (AXIS Y).
*/
enum Stage {
UNPROCESSED,
TOKENIZED, // tokens present
SENTENCIZED, // sentences present
TAGGED, // parts of speech present
PARSED // syntax present
}
/* ***************************
* 3) SOLUTION USING SUBTYPING
*****************************/
/*
* 3.A) GENERIC HIERARCHY (AXIS Y OVER X)
*/
//
// 3.A.I) UNPROCESSED
//
interface LocalizedText extends TextualRange {
Locale locale();
default Stage maxStage() {
return Stage.UNPROCESSED;
}
}
//
// 3.A.II) WITH TOKENS
//
enum TokenType {
WORD, NUMERIC // SIMPLIFICATION
}
interface Token extends TextualRange {
TokenType tokenType();
}
interface TokenizedText extends LocalizedText {
Stream<? extends Token> tokenStream();
int tokenCount();
@Override
default Stage maxStage() {
return Stage.TOKENIZED;
}
}
//
// 3.A.III) WITH SENTENCES
//
interface Sentence extends TextualRange {
List<? extends Token> tokens();
default Stage stage() {
return Stage.SENTENCIZED;
}
}
interface SentencizedText extends TokenizedText {
List<? extends Sentence> sentences();
@Override
default Stage maxStage() {
return Stage.SENTENCIZED;
}
}
//
// 3.A.IV) WITH PARTS OF SPEECH
//
interface TaggedToken extends Token {
PartOfSpeech partOfSpeech(); // see section 1.A above
}
interface TaggedSentence extends Sentence {
@Override
List<? extends TaggedToken> tokens();
@Override
default Stage stage() {
return Stage.TAGGED;
}
}
interface TaggedText extends SentencizedText {
// some (or even all) sentences may remain untagged
Stream<? extends TaggedSentence> taggedSentenceStream();
@Override
default Stage maxStage() {
return Stage.TAGGED;
}
}
//
// 3.A.V) WITH SYNTAX
//
interface Constituent {
Stream<? extends Constituent> childStream();
}
interface ConstituentBranch extends Constituent {
ConstituentType type(); // see section 1.B above
}
interface ConstituentLeaf extends Constituent {
TaggedToken token();
@Override
default Stream<? extends Constituent> childStream() {
return Stream.empty();
}
}
interface Dependency {
DependencyType type(); // see section 1.C above
TaggedToken governor();
TaggedToken dependent();
}
interface SentenceSyntax {
ConstituentBranch constituentTree();
List<? extends Dependency> dependencies();
}
interface ParsedSentence extends TaggedSentence {
SentenceSyntax syntax();
@Override
default Stage stage() {
return Stage.PARSED;
}
}
interface ParsedText extends TaggedText {
// some (or even all) sentences may remain unparsed
Stream<? extends ParsedSentence> parsedSentenceStream();
@Override
default Stage maxStage() {
return Stage.PARSED;
}
}
/*
* 3.B) LANGUAGE-SPECIFIC HIERARCHY (AXIS Z OVER Y OVER X)
*/
//
// 3.B.I) ENGLISH
//
// 3.B.I.a) ENGLISH PARTS OF SPEECH
interface EnglishTaggedToken extends TaggedToken {
@Override
EnglishPartOfSpeech partOfSpeech();
}
interface EnglishTaggedSentence extends TaggedSentence {
@Override
List<? extends EnglishTaggedToken> tokens();
}
interface EnglishTaggedText extends TaggedText {
@Override // some (or even all) sentences may remain untagged
default Stream<? extends EnglishTaggedSentence> taggedSentenceStream() {
return Seq.ofType(sentences().stream(), EnglishTaggedSentence.class);
}
}
// 3.B.I.b) ENGLISH SYNTAX
interface EnglishConstituent extends Constituent {
@Override
Stream<? extends EnglishConstituent> childStream();
}
interface EnglishConstituentBranch extends EnglishConstituent, ConstituentBranch {
@Override
EnglishConstituentType type();
}
interface EnglishConstituentLeaf extends EnglishConstituent, ConstituentLeaf {
@Override
EnglishTaggedToken token();
@Override
default Stream<? extends EnglishConstituent> childStream() {
return Stream.empty();
}
}
interface EnglishDependency extends Dependency {
@Override
EnglishDependencyType type();
@Override
EnglishTaggedToken governor();
@Override
EnglishTaggedToken dependent();
}
interface EnglishSentenceSyntax extends SentenceSyntax {
@Override
EnglishConstituentBranch constituentTree();
@Override
List<? extends EnglishDependency> dependencies();
}
interface EnglishParsedSentence extends EnglishTaggedSentence, ParsedSentence {
@Override
EnglishSentenceSyntax syntax();
}
interface EnglishParsedText extends EnglishTaggedText, ParsedText {
@Override // some (or even all) sentences may remain unparsed
default Stream<? extends EnglishParsedSentence> parsedSentenceStream() {
return Seq.ofType(sentences().stream(), EnglishParsedSentence.class);
}
}
//
// 3.B.II) GERMAN
//
// 3.B.II.a) GERMAN PARTS OF SPEECH
interface GermanTaggedToken extends TaggedToken {
@Override
GermanPartOfSpeech partOfSpeech();
}
interface GermanTaggedSentence extends TaggedSentence {
@Override
List<? extends GermanTaggedToken> tokens();
}
interface GermanTaggedText extends TaggedText {
@Override
default Stream<? extends GermanTaggedSentence> taggedSentenceStream() {
return Seq.ofType(sentences().stream(), GermanTaggedSentence.class);
}
}
// 3.B.II.b) GERMAN SYNTAX (missing as of yet)
/* ***********************
* 4) PRODUCERS OF THE API
*************************/
interface TextProcessingRequest { // SIMPLIFICATION
Locale locale();
String text();
Stage targetStage();
}
interface TextProcessor {
LocalizedText processText(TextProcessingRequest request);
}
/* ***********************
* 5) CONSUMERS OF THE API
*************************/
/*
* 5.A) DIRECT CONSUMERS
*/
class GermanPostpositionChecker {
void checkTaggedText(GermanTaggedText text) {
text.taggedSentenceStream().forEach(this::checkTaggedSentence);
}
private void checkTaggedSentence(GermanTaggedSentence sentence) {
sentence.tokens().stream()
.filter(this::isPostposition)
.forEach(this::checkPostposition);
}
private boolean isPostposition(GermanTaggedToken token) {
return token.partOfSpeech().isPostposition();
}
private void checkPostposition(GermanTaggedToken token) {
// logic
}
}
class EnglishNominalSubjectChecker {
void checkNominalSubjects(EnglishParsedText text) {
text.parsedSentenceStream().forEach(this::checkNominalSubjects);
}
private void checkNominalSubjects(EnglishParsedSentence sentence) {
sentence.syntax().dependencies().stream()
.filter(this::isCertainTypeOfNominalSubjectDependency)
.forEach(this::checkNominalSubject);
}
private boolean isCertainTypeOfNominalSubjectDependency(EnglishDependency dependency) {
return dependency.type() == EnglishDependencyType.NOMINAL_SUBJECT && true; // SIMPLIFICATION
}
private void checkNominalSubject(EnglishDependency dependency) {
checkNominalGovernor(dependency.governor());
checkNominalDependent(dependency.dependent());
}
private void checkNominalGovernor(EnglishTaggedToken governor) {
if (checkGovernorPartOfSpeech(governor.partOfSpeech())) {
// logic
}
}
private void checkNominalDependent(EnglishTaggedToken dependent) {
if (checkDependentPartOfSpeech(dependent.partOfSpeech())) {
// logic
}
}
private boolean checkGovernorPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {
return true; // SIMPLIFICATION
}
private boolean checkDependentPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {
return true; // SIMPLIFICATION
}
}
class EnglishRelevantConstituentHandler {
void handleRelevantConstituents(EnglishParsedText text) {
text.parsedSentenceStream().forEach(this::handleRelevantConstiuents);
}
private void handleRelevantConstiuents(EnglishParsedSentence sentence) {
EnglishConstituents.flatConstituentStream(sentence.syntax().constituentTree())
.filter(this::isRelevantConstituent)
.forEach(this::handleRelevantConstituent);
}
private boolean isRelevantConstituent(EnglishConstituent constituent) {
return true; // SIMPLIFICATION
}
private void handleRelevantConstituent(EnglishConstituent constituent) {
// logic
}
}
class EnglishConstituents {
/**
* Returns the constituent and all its descendants as a flattended Stream.
*/
static Stream<EnglishConstituent> flatConstituentStream(EnglishConstituent constituent) {
return Stream.concat(
Stream.of(constituent),
constituent.childStream().flatMap(EnglishConstituents::flatConstituentStream)
);
}
}
/*
* 5.B) INDIRECT CONSUMERS
*/
interface ProcessedTextConsumer { // SIMPLIFICATION
Locale supportedLocale();
Stage requiredStage();
void consume(LocalizedText text);
}
class SampleUniversalTokenizedTextConsumer implements ProcessedTextConsumer {
@Override
public Locale supportedLocale() {
return Locale.ROOT;
}
@Override
public Stage requiredStage() {
return Stage.TOKENIZED;
}
@Override
public void consume(LocalizedText text) {
handleTokenizedText((TokenizedText) text);
}
private void handleTokenizedText(TokenizedText tokenizedText) {
// logic
}
}
class SampleGermanTaggedConsumer implements ProcessedTextConsumer {
@Override
public Locale supportedLocale() {
return Locale.GERMAN;
}
@Override
public Stage requiredStage() {
return Stage.TAGGED;
}
@Override
public void consume(LocalizedText text) {
GermanTaggedText germanTaggedText = (GermanTaggedText) text; // SAFE CAST
new GermanPostpositionChecker().checkTaggedText(germanTaggedText);
}
}
class SampleEnglishParsedTextConsumer implements ProcessedTextConsumer {
@Override
public Locale supportedLocale() {
return Locale.ENGLISH;
}
@Override
public Stage requiredStage() {
return Stage.PARSED;
}
@Override
public void consume(LocalizedText text) {
EnglishParsedText englishParsedText = (EnglishParsedText) text; // SAFE CAST
new EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment