Skip to content

Commit dd6f57f

Browse files
committed
this is better encoded directly on the syntax tree
1 parent dc4338e commit dd6f57f

5 files changed

Lines changed: 28 additions & 32 deletions

File tree

src/parser/ast.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ export type Phrase =
4141
export type MultiplePhrases =
4242
| Readonly<{ type: "simple"; phrase: Phrase }>
4343
| Readonly<{
44-
type: "and";
44+
type: "and" | "anu";
45+
particle: string;
4546
phrases: ReadonlyArray<MultiplePhrases>;
46-
}>
47-
| Readonly<{ type: "anu"; phrases: ReadonlyArray<MultiplePhrases> }>;
47+
}>;
4848
export type Preposition = Readonly<{
4949
preposition: HeadedWordUnit;
5050
modifiers: ReadonlyArray<Modifier>;
@@ -59,8 +59,11 @@ export type Predicate =
5959
objects: null | MultiplePhrases;
6060
prepositions: ReadonlyArray<Preposition>;
6161
}>
62-
| Readonly<{ type: "and"; predicates: ReadonlyArray<Predicate> }>
63-
| Readonly<{ type: "anu"; predicates: ReadonlyArray<Predicate> }>;
62+
| Readonly<{
63+
type: "and" | "anu";
64+
particle: string;
65+
predicates: ReadonlyArray<Predicate>;
66+
}>;
6467
export type Clause =
6568
| Readonly<{ type: "phrases"; phrases: MultiplePhrases }>
6669
| Readonly<{ type: "o vocative"; phrases: MultiplePhrases }>

src/parser/composer.ts

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -90,82 +90,71 @@ export function phrase(value: Phrase): string {
9090
return preposition(value);
9191
}
9292
}
93-
function particle(type: "and" | "anu", particle: string) {
94-
if (type === "and") {
95-
return particle;
96-
} else {
97-
return "anu;";
98-
}
99-
}
100-
export function multiplePhrases(
101-
phrases: MultiplePhrases,
102-
andParticle: string,
103-
): string {
93+
export function multiplePhrases(phrases: MultiplePhrases): string {
10494
switch (phrases.type) {
10595
case "simple":
10696
return phrase(phrases.phrase);
10797
case "and":
10898
case "anu": {
10999
return phrases.phrases
110-
.map((phrases) => multiplePhrases(phrases, andParticle))
111-
.join(` ${particle(phrases.type, andParticle)} `);
100+
.map((phrases) => multiplePhrases(phrases))
101+
.join(` ${phrases.particle} `);
112102
}
113103
}
114104
}
115105
export function preposition(preposition: Preposition): string {
116106
return [
117107
wordUnit(preposition.preposition),
118108
...preposition.modifiers.map(modifier),
119-
multiplePhrases(preposition.phrases, ""),
109+
multiplePhrases(preposition.phrases),
120110
...emphasisAsArray(preposition.emphasis),
121111
]
122112
.join(" ");
123113
}
124114
export function multiplePredicates(
125115
predicates: Predicate,
126-
andParticle: string,
127116
): string {
128117
switch (predicates.type) {
129118
case "simple":
130119
return phrase(predicates.predicate);
131120
case "associated": {
132121
return [
133-
multiplePhrases(predicates.predicates, andParticle),
122+
multiplePhrases(predicates.predicates),
134123
...nullableAsArray(predicates.objects).map(() => "e"),
135124
...nullableAsArray(predicates.objects)
136-
.map((objects) => multiplePhrases(objects, "e")),
125+
.map((objects) => multiplePhrases(objects)),
137126
...predicates.prepositions.map(preposition),
138127
]
139128
.join(" ");
140129
}
141130
case "and":
142131
case "anu":
143132
return predicates.predicates
144-
.map((predicates) => multiplePredicates(predicates, andParticle))
145-
.join(` ${particle(predicates.type, andParticle)} `);
133+
.map((predicates) => multiplePredicates(predicates))
134+
.join(` ${predicates.particle} `);
146135
}
147136
}
148137
export function clause(clause: Clause): string {
149138
switch (clause.type) {
150139
case "phrases":
151-
return multiplePhrases(clause.phrases, "en");
140+
return multiplePhrases(clause.phrases);
152141
case "o vocative":
153-
return `${multiplePhrases(clause.phrases, "en")} o`;
142+
return `${multiplePhrases(clause.phrases)} o`;
154143
case "li clause": {
155144
const li = clause.explicitLi ? ["li"] : [];
156145
return [
157-
multiplePhrases(clause.subjects, "en"),
146+
multiplePhrases(clause.subjects),
158147
...li,
159-
multiplePredicates(clause.predicates, "li"),
148+
multiplePredicates(clause.predicates),
160149
]
161150
.join(" ");
162151
}
163152
case "o clause":
164153
return [
165154
...nullableAsArray(clause.subjects)
166-
.map((subjects) => multiplePhrases(subjects, "en")),
155+
.map((subjects) => multiplePhrases(subjects)),
167156
"o",
168-
multiplePredicates(clause.predicates, "o"),
157+
multiplePredicates(clause.predicates),
169158
]
170159
.join(" ");
171160
}

src/parser/parser.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ function nestedPhrasesOnly(
324324
const longAnuParser = type === "anu"
325325
? longAnu.map((phrases): MultiplePhrases => ({
326326
type: "anu",
327+
particle: "anu",
327328
phrases: phrases.map((phrase): MultiplePhrases => ({
328329
type: "simple",
329330
phrase,
@@ -342,6 +343,7 @@ function nestedPhrasesOnly(
342343
)
343344
.map(([group, moreGroups]): MultiplePhrases => ({
344345
type,
346+
particle: first,
345347
phrases: [group, ...moreGroups],
346348
})),
347349
);
@@ -494,6 +496,7 @@ function multiplePredicates(
494496
const longAnuParser: Parser<Predicate> = type === "anu"
495497
? longAnu.map((phrases): Predicate => ({
496498
type: "anu",
499+
particle: "anu",
497500
predicates: phrases.map((predicate): Predicate => ({
498501
type: "simple",
499502
predicate,
@@ -521,6 +524,7 @@ function multiplePredicates(
521524
)
522525
.map(([group, moreGroups]): Predicate => ({
523526
type,
527+
particle: first,
524528
predicates: [group, ...moreGroups],
525529
})),
526530
multiplePredicates(rest),

src/translator/phrase.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ export function multiplePhrases(
487487
}
488488
})
489489
.addErrorWhenNone(() =>
490-
new ExhaustedError(Composer.multiplePhrases(phrases, andParticle))
490+
new ExhaustedError(Composer.multiplePhrases(phrases))
491491
);
492492
}
493493
}

src/translator2/phrase.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ export function multiplePhrases(
454454
}
455455
})
456456
.addErrorWhenNone(() =>
457-
new ExhaustedError(Composer.multiplePhrases(phrases, "(and)"))
457+
new ExhaustedError(Composer.multiplePhrases(phrases))
458458
);
459459
}
460460
}

0 commit comments

Comments
 (0)