Skip to content

Commit 337b8f7

Browse files
committed
implement phrase translation
1 parent ae91a28 commit 337b8f7

1 file changed

Lines changed: 122 additions & 1 deletion

File tree

src/translator2/phrase.ts

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import * as English from "./ast.ts";
22
import { AdjectiveWithInWay } from "./adjective.ts";
33
import { AdjectivalModifier } from "./modifier.ts";
4-
import { ExhaustedError, FilteredError } from "./error.ts";
4+
import {
5+
ExhaustedError,
6+
FilteredError,
7+
TranslationTodoError,
8+
} from "./error.ts";
59
import { mapNullable, nullableAsArray } from "../../misc/misc.ts";
610
import { nounAsPreposition } from "./preposition.ts";
711
import { AdverbialModifier } from "./modifier.ts";
@@ -10,6 +14,8 @@ import { IterableResult } from "../compound.ts";
1014
import { wordUnit } from "./word_unit.ts";
1115
import { multipleModifiers } from "./modifier.ts";
1216
import * as Composer from "../parser/composer.ts";
17+
import { verb } from "./verb.ts";
18+
import { word } from "./word.ts";
1319

1420
export type PhraseTranslation =
1521
| Readonly<{ type: "noun"; noun: English.NounPhrase }>
@@ -186,3 +192,118 @@ function defaultPhrase(
186192
})
187193
.addErrorWhenNone(() => new ExhaustedError(Composer.phrase(phrase)));
188194
}
195+
function prepositionAsVerb(
196+
preposition: English.Preposition,
197+
): English.SimpleVerbPhrase {
198+
return {
199+
verb: [{
200+
preAdverbs: [],
201+
verb: {
202+
type: "non-modal",
203+
presentPlural: "are",
204+
presentSingular: "is",
205+
past: "were",
206+
reduplicationCount: 1,
207+
emphasis: false,
208+
},
209+
postAdverb: null,
210+
}],
211+
subjectComplement: null,
212+
contentClause: null,
213+
object: null,
214+
objectComplement: null,
215+
prepositions: [preposition],
216+
forObject: false,
217+
predicateType: null,
218+
emphasis: false,
219+
hideVerb: false,
220+
};
221+
}
222+
function preverb(
223+
preverb: TokiPona.Phrase & { type: "preverb" },
224+
): IterableResult<English.SimpleVerbPhrase> {
225+
const emphasis = preverb.emphasis != null;
226+
const verb = IterableResult.combine(
227+
wordUnit({
228+
wordUnit: preverb.preverb,
229+
includeGerund: false,
230+
}),
231+
multipleModifiers(preverb.modifiers),
232+
)
233+
.filterMap(([verb, modifier]) =>
234+
verb.type === "verb" && modifier.type === "adverbial"
235+
? verbPhrase({ verb, modifier, emphasis: false })
236+
: null
237+
);
238+
return IterableResult.combine(
239+
verb,
240+
translatePhrase({
241+
phrase: preverb.phrase,
242+
includeGerund: false,
243+
}),
244+
)
245+
.filterMap(([verb, predicate]): null | English.SimpleVerbPhrase => {
246+
if (
247+
verb.predicateType === "noun adjective" &&
248+
(predicate.type === "noun" || predicate.type === "adjective")
249+
) {
250+
let subjectComplement: English.Complement;
251+
switch (predicate.type) {
252+
case "noun":
253+
subjectComplement = { type: "noun", noun: predicate.noun };
254+
break;
255+
case "adjective":
256+
subjectComplement = {
257+
type: "adjective",
258+
adjective: predicate.adjective,
259+
};
260+
break;
261+
}
262+
return { ...verb, subjectComplement, emphasis };
263+
} else if (
264+
verb.predicateType === "verb" && predicate.type === "verb" &&
265+
predicate.verb.type === "simple"
266+
) {
267+
const first = predicate.verb.verb[0];
268+
// TODO: filter out modal verb when found in the middle
269+
const predicateVerb: English.AdverbVerb = {
270+
preAdverbs: first.preAdverbs,
271+
verb: first.verb,
272+
postAdverb: null,
273+
};
274+
return {
275+
...predicate.verb,
276+
verb: [
277+
...verb.verb,
278+
predicateVerb,
279+
...predicate.verb.verb.slice(1),
280+
],
281+
emphasis,
282+
};
283+
} else {
284+
return null;
285+
}
286+
})
287+
.addErrorWhenNone(() => new ExhaustedError(Composer.phrase(preverb)));
288+
}
289+
const translatePhrase = phrase;
290+
export function phrase(
291+
options: Readonly<{
292+
phrase: TokiPona.Phrase;
293+
includeGerund: boolean;
294+
}>,
295+
): IterableResult<PhraseTranslation> {
296+
const { phrase } = options;
297+
switch (phrase.type) {
298+
case "simple":
299+
return defaultPhrase({ ...options, phrase });
300+
case "preposition":
301+
return IterableResult.errors([new TranslationTodoError("preposition")]);
302+
case "preverb":
303+
return preverb(phrase)
304+
.map((verb): PhraseTranslation => ({
305+
type: "verb",
306+
verb: { ...verb, type: "simple" },
307+
}));
308+
}
309+
}

0 commit comments

Comments
 (0)