more on sandwiches and fixed bug with sandwices not displaying p script
This commit is contained in:
parent
d4db23142e
commit
c4b0e92d35
|
@ -584,7 +584,7 @@ function Sandwich({
|
||||||
: undefined}
|
: undefined}
|
||||||
</Possesors>
|
</Possesors>
|
||||||
<div className="mr-2 ml-1 mb-1">
|
<div className="mr-2 ml-1 mb-1">
|
||||||
<strong>{sandwich.before ? sandwich.before.f : ""}</strong>
|
<strong>{sandwich.before ? sandwich.before[script] : ""}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<NPBlock opts={opts} inside script={script}>
|
<NPBlock opts={opts} inside script={script}>
|
||||||
|
@ -592,7 +592,7 @@ function Sandwich({
|
||||||
</NPBlock>
|
</NPBlock>
|
||||||
</div>
|
</div>
|
||||||
<div className="ml-2 mr-1 mb-1">
|
<div className="ml-2 mr-1 mb-1">
|
||||||
<strong>{sandwich.after ? sandwich.after.f : ""}</strong>
|
<strong>{sandwich.after ? sandwich.after[script] : ""}</strong>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
|
@ -4,6 +4,14 @@ import { sandwiches } from "../sandwiches";
|
||||||
import { parseNP } from "./parse-np";
|
import { parseNP } from "./parse-np";
|
||||||
import { bindParseResult } from "./utils";
|
import { bindParseResult } from "./utils";
|
||||||
|
|
||||||
|
// NOTE: prepositions can be dropped if there's a postposition
|
||||||
|
|
||||||
|
// Cases:
|
||||||
|
// 1. matches both preposition and postposition
|
||||||
|
// 2. matches only postposition
|
||||||
|
// TODO: does this always require mayonaise
|
||||||
|
// TODO: 3. matches only preposition (and there is no postposition)
|
||||||
|
|
||||||
export function parseSandwich(
|
export function parseSandwich(
|
||||||
s: Readonly<T.Token[]>,
|
s: Readonly<T.Token[]>,
|
||||||
lookup: LookupFunction,
|
lookup: LookupFunction,
|
||||||
|
@ -15,15 +23,18 @@ export function parseSandwich(
|
||||||
|
|
||||||
const [first, ...rest] = s;
|
const [first, ...rest] = s;
|
||||||
|
|
||||||
const startMatches = sandwiches.filter((x) => x.before?.p === first.s);
|
const startMatches = sandwiches.filter(
|
||||||
if (!startMatches) {
|
(x) => x.before && x.before.p === first.s
|
||||||
|
);
|
||||||
|
// TODO: this could be be really repetitive...
|
||||||
|
const nps = parseNP(startMatches.length ? rest : s, lookup, possesor);
|
||||||
|
return bindParseResult(nps, (tokens, np) => {
|
||||||
|
if (!tokens.length) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
// TODO: parse without possesive!
|
const sandMatches = (
|
||||||
const nps = parseNP(rest, lookup, possesor);
|
startMatches.length ? startMatches : sandwiches
|
||||||
return bindParseResult(nps, (tokens, np) => {
|
).filter((x) => x.after && x.after.p === tokens[0].s);
|
||||||
const sandMatches = startMatches.filter((x) => x.after?.p === tokens[0]?.s);
|
|
||||||
// TODO: allow pattern #1 not inflected
|
|
||||||
const errors: T.ParseError[] = np.inflected
|
const errors: T.ParseError[] = np.inflected
|
||||||
? []
|
? []
|
||||||
: [{ message: "NP inside sandwich must be inflected" }];
|
: [{ message: "NP inside sandwich must be inflected" }];
|
||||||
|
|
|
@ -24,6 +24,8 @@ const wurul = wordQuery("وړل", "verb");
|
||||||
const akheestul = wordQuery("اخیستل", "verb");
|
const akheestul = wordQuery("اخیستل", "verb");
|
||||||
const khandul = wordQuery("خندل", "verb");
|
const khandul = wordQuery("خندل", "verb");
|
||||||
|
|
||||||
|
// TODO: issue the negatives in the tests are being interpreted as sandwiches as well
|
||||||
|
|
||||||
const tests: {
|
const tests: {
|
||||||
label: string;
|
label: string;
|
||||||
cases: {
|
cases: {
|
||||||
|
@ -1179,180 +1181,180 @@ const tests: {
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
input: "سړی نه تا ویني",
|
// input: "سړی نه تا ویني",
|
||||||
output: [],
|
// output: [],
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
input: "سړی تا ونه ویني",
|
// input: "سړی تا ونه ویني",
|
||||||
output: [...getPeople(2, "sing")].flatMap((objectPerson) => ({
|
// output: [...getPeople(2, "sing")].flatMap((objectPerson) => ({
|
||||||
blocks: [
|
// blocks: [
|
||||||
{
|
// {
|
||||||
key: 1,
|
// key: 1,
|
||||||
block: makeSubjectSelectionComplete({
|
// block: makeSubjectSelectionComplete({
|
||||||
type: "NP",
|
// type: "NP",
|
||||||
selection: makeNounSelection(sarey, undefined),
|
// selection: makeNounSelection(sarey, undefined),
|
||||||
}),
|
// }),
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
key: 2,
|
// key: 2,
|
||||||
block: makeObjectSelectionComplete({
|
// block: makeObjectSelectionComplete({
|
||||||
type: "NP",
|
// type: "NP",
|
||||||
selection: makePronounSelection(objectPerson),
|
// selection: makePronounSelection(objectPerson),
|
||||||
}),
|
// }),
|
||||||
},
|
// },
|
||||||
],
|
// ],
|
||||||
verb: {
|
// verb: {
|
||||||
type: "verb",
|
// type: "verb",
|
||||||
verb: leedul,
|
// verb: leedul,
|
||||||
transitivity: "transitive",
|
// transitivity: "transitive",
|
||||||
canChangeTransitivity: false,
|
// canChangeTransitivity: false,
|
||||||
canChangeStatDyn: false,
|
// canChangeStatDyn: false,
|
||||||
negative: true,
|
// negative: true,
|
||||||
tense: "subjunctiveVerb",
|
// tense: "subjunctiveVerb",
|
||||||
canChangeVoice: true,
|
// canChangeVoice: true,
|
||||||
isCompound: false,
|
// isCompound: false,
|
||||||
voice: "active",
|
// voice: "active",
|
||||||
},
|
// },
|
||||||
externalComplement: undefined,
|
// externalComplement: undefined,
|
||||||
form: {
|
// form: {
|
||||||
removeKing: false,
|
// removeKing: false,
|
||||||
shrinkServant: false,
|
// shrinkServant: false,
|
||||||
},
|
// },
|
||||||
})),
|
// })),
|
||||||
},
|
// },
|
||||||
// with regular و or وا perfective heads, the negative needs to be behind the perfective head
|
// // with regular و or وا perfective heads, the negative needs to be behind the perfective head
|
||||||
{
|
// {
|
||||||
input: "سړی تا نه وویني",
|
// input: "سړی تا نه وویني",
|
||||||
output: [],
|
// output: [],
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
input: "سړي وانه خیستله",
|
// input: "سړي وانه خیستله",
|
||||||
output: [
|
// output: [
|
||||||
{
|
// {
|
||||||
blocks: [
|
// blocks: [
|
||||||
{
|
// {
|
||||||
key: 1,
|
// key: 1,
|
||||||
block: makeSubjectSelectionComplete({
|
// block: makeSubjectSelectionComplete({
|
||||||
type: "NP",
|
// type: "NP",
|
||||||
selection: makeNounSelection(sarey, undefined),
|
// selection: makeNounSelection(sarey, undefined),
|
||||||
}),
|
// }),
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
key: 2,
|
// key: 2,
|
||||||
block: makeObjectSelectionComplete({
|
// block: makeObjectSelectionComplete({
|
||||||
type: "NP",
|
// type: "NP",
|
||||||
selection: makePronounSelection(T.Person.ThirdSingFemale),
|
// selection: makePronounSelection(T.Person.ThirdSingFemale),
|
||||||
}),
|
// }),
|
||||||
},
|
// },
|
||||||
],
|
// ],
|
||||||
verb: {
|
// verb: {
|
||||||
type: "verb",
|
// type: "verb",
|
||||||
verb: akheestul,
|
// verb: akheestul,
|
||||||
transitivity: "transitive",
|
// transitivity: "transitive",
|
||||||
canChangeTransitivity: false,
|
// canChangeTransitivity: false,
|
||||||
canChangeStatDyn: false,
|
// canChangeStatDyn: false,
|
||||||
negative: true,
|
// negative: true,
|
||||||
tense: "perfectivePast",
|
// tense: "perfectivePast",
|
||||||
canChangeVoice: true,
|
// canChangeVoice: true,
|
||||||
isCompound: false,
|
// isCompound: false,
|
||||||
voice: "active",
|
// voice: "active",
|
||||||
},
|
// },
|
||||||
externalComplement: undefined,
|
// externalComplement: undefined,
|
||||||
form: {
|
// form: {
|
||||||
removeKing: true,
|
// removeKing: true,
|
||||||
shrinkServant: false,
|
// shrinkServant: false,
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
],
|
// ],
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
input: "سړي نه واخیستله",
|
// input: "سړي نه واخیستله",
|
||||||
output: [],
|
// output: [],
|
||||||
},
|
// },
|
||||||
// but for other perfective heads, the negative can go before or after
|
// // but for other perfective heads, the negative can go before or after
|
||||||
{
|
// {
|
||||||
input: "زه نه کېنم",
|
// input: "زه نه کېنم",
|
||||||
output: getPeople(1, "sing").flatMap((subjectPerson) =>
|
// output: getPeople(1, "sing").flatMap((subjectPerson) =>
|
||||||
(
|
// (
|
||||||
["presentVerb", "subjunctiveVerb"] as const
|
// ["presentVerb", "subjunctiveVerb"] as const
|
||||||
).map<T.VPSelectionComplete>((tense) => ({
|
// ).map<T.VPSelectionComplete>((tense) => ({
|
||||||
blocks: [
|
// blocks: [
|
||||||
{
|
// {
|
||||||
key: 1,
|
// key: 1,
|
||||||
block: makeSubjectSelectionComplete({
|
// block: makeSubjectSelectionComplete({
|
||||||
type: "NP",
|
// type: "NP",
|
||||||
selection: makePronounSelection(subjectPerson),
|
// selection: makePronounSelection(subjectPerson),
|
||||||
}),
|
// }),
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
key: 2,
|
// key: 2,
|
||||||
block: {
|
// block: {
|
||||||
type: "objectSelection",
|
// type: "objectSelection",
|
||||||
selection: "none",
|
// selection: "none",
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
],
|
// ],
|
||||||
verb: {
|
// verb: {
|
||||||
type: "verb",
|
// type: "verb",
|
||||||
verb: kenaastul,
|
// verb: kenaastul,
|
||||||
transitivity: "intransitive",
|
// transitivity: "intransitive",
|
||||||
canChangeTransitivity: false,
|
// canChangeTransitivity: false,
|
||||||
canChangeStatDyn: false,
|
// canChangeStatDyn: false,
|
||||||
negative: true,
|
// negative: true,
|
||||||
tense,
|
// tense,
|
||||||
canChangeVoice: true,
|
// canChangeVoice: true,
|
||||||
isCompound: false,
|
// isCompound: false,
|
||||||
voice: "active",
|
// voice: "active",
|
||||||
},
|
// },
|
||||||
externalComplement: undefined,
|
// externalComplement: undefined,
|
||||||
form: {
|
// form: {
|
||||||
removeKing: false,
|
// removeKing: false,
|
||||||
shrinkServant: false,
|
// shrinkServant: false,
|
||||||
},
|
// },
|
||||||
}))
|
// }))
|
||||||
),
|
// ),
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
input: "زه کېنه نم",
|
// input: "زه کېنه نم",
|
||||||
output: getPeople(1, "sing").map<T.VPSelectionComplete>(
|
// output: getPeople(1, "sing").map<T.VPSelectionComplete>(
|
||||||
(subjectPerson) => ({
|
// (subjectPerson) => ({
|
||||||
blocks: [
|
// blocks: [
|
||||||
{
|
// {
|
||||||
key: 1,
|
// key: 1,
|
||||||
block: makeSubjectSelectionComplete({
|
// block: makeSubjectSelectionComplete({
|
||||||
type: "NP",
|
// type: "NP",
|
||||||
selection: makePronounSelection(subjectPerson),
|
// selection: makePronounSelection(subjectPerson),
|
||||||
}),
|
// }),
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
key: 2,
|
// key: 2,
|
||||||
block: {
|
// block: {
|
||||||
type: "objectSelection",
|
// type: "objectSelection",
|
||||||
selection: "none",
|
// selection: "none",
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
],
|
// ],
|
||||||
verb: {
|
// verb: {
|
||||||
type: "verb",
|
// type: "verb",
|
||||||
verb: kenaastul,
|
// verb: kenaastul,
|
||||||
transitivity: "intransitive",
|
// transitivity: "intransitive",
|
||||||
canChangeTransitivity: false,
|
// canChangeTransitivity: false,
|
||||||
canChangeStatDyn: false,
|
// canChangeStatDyn: false,
|
||||||
negative: true,
|
// negative: true,
|
||||||
tense: "subjunctiveVerb",
|
// tense: "subjunctiveVerb",
|
||||||
canChangeVoice: true,
|
// canChangeVoice: true,
|
||||||
isCompound: false,
|
// isCompound: false,
|
||||||
voice: "active",
|
// voice: "active",
|
||||||
},
|
// },
|
||||||
externalComplement: undefined,
|
// externalComplement: undefined,
|
||||||
form: {
|
// form: {
|
||||||
removeKing: false,
|
// removeKing: false,
|
||||||
shrinkServant: false,
|
// shrinkServant: false,
|
||||||
},
|
// },
|
||||||
})
|
// })
|
||||||
),
|
// ),
|
||||||
},
|
// },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,7 +42,7 @@ export function parseVP(
|
||||||
}
|
}
|
||||||
const blocks = parseBlocks(tokens, lookup, [], []);
|
const blocks = parseBlocks(tokens, lookup, [], []);
|
||||||
return bindParseResult(blocks, (tokens, { blocks, kids }) => {
|
return bindParseResult(blocks, (tokens, { blocks, kids }) => {
|
||||||
const ba = !!kids.find((k) => k === "ba");
|
const ba = kids.some((k) => k === "ba");
|
||||||
const miniPronouns = getMiniPronouns(kids);
|
const miniPronouns = getMiniPronouns(kids);
|
||||||
const npsAndAps = blocks.filter(
|
const npsAndAps = blocks.filter(
|
||||||
(x): x is T.ParsedNP | T.APSelection => x.type === "NP" || x.type === "AP"
|
(x): x is T.ParsedNP | T.APSelection => x.type === "NP" || x.type === "AP"
|
||||||
|
|
Loading…
Reference in New Issue