Mova0.5 pre-release⌕
☰
home / docs / dialects / ud-next / Converter mova ⇄ ud-next

Converter mova ⇄ ud-next

The rules are written in the convert language from The Mova dialect: a UD metadialect, treebanks, and converters: the v1 seed rule language plus set actions. They were run with the real engine en convert / en convert-check (en::convert, commit b23ef218 of 26.09.2026). Results are in the "Check" section. Rule ids follow the repo custom: mova.ud-next.* for the mova → ud-next direction, ud-next.* for the reverse.

What is converted to what.

Two changes affect annotation:

The other changes do not touch annotation: clarification No. 18 legitimizes what EWT already does; XPOS is a format gate; layers, expl:* and validator data did not change for en.

mova → ud-next

Order matters: the free-relative rule must fire before the general rules about who. All rules about Case have the condition !feats.Case, so a repeated run changes nothing.

rule: mova.ud-next.whom-lemma
what: whom → lemma who
from: mova
to: ud-next
match: t[upos=PRON, form=whom]
set: t[lemma=who]
source: UD docs/_en/pos/PRON.md:52 (snapshot 24.09.2026)
rule: mova.ud-next.whomever-lemma
what: whomever → lemma whoever
from: mova
to: ud-next
match: t[upos=PRON, form=whomever]
set: t[lemma=whoever]
source: UD docs/_en/pos/PRON.md:53
rule: mova.ud-next.whom-acc
what: whom, whomever — Case=Acc by form (the form wins over context, changes.md No. 18)
from: mova
to: ud-next
match: t[upos=PRON, form=whom|whomever, !feats.Case]
set: t[feats+=Case=Acc]
source: UD docs/_en/pos/PRON.md:52–53; docs/changes.md:55–56
rule: mova.ud-next.who-freerel-acc
what: who/whoever — head of a free relative in object position; the subordinate clause has its own subject, so who is an object there — Acc
from: mova
to: ud-next
match: t[upos=PRON, form=who|whoever, !feats.Case, rel=obj|iobj|obl|obl:agent|nmod]; r[rel=acl:relcl, head=t]; s[rel~nsubj, head=r]
set: t[feats+=Case=Acc]
source: UD docs/_en/pos/PRON.md:52–56
rule: mova.ud-next.who-freerel-nom
what: who/whoever — head of a free relative in object position without its own subject (for who wants…, of whoever wrote it), so who is the subject of the subordinate clause, Nom
from: mova
to: ud-next
match: t[upos=PRON, form=who|whoever, !feats.Case, rel=obj|iobj|obl|obl:agent|nmod]; r[rel=acl:relcl, head=t]
set: t[feats+=Case=Nom]
source: UD docs/_en/pos/PRON.md:52–56
rule: mova.ud-next.who-acc
what: who/whoever as an object, direct or prepositional (who … to, who … with) — Acc
from: mova
to: ud-next
match: t[upos=PRON, form=who|whoever, !feats.Case, rel=obj|iobj|obl|obl:agent|nmod]
set: t[feats+=Case=Acc]
source: UD docs/_en/pos/PRON.md:52, :56
rule: mova.ud-next.who-nom
what: who/whoever in all other positions (subject, question predicate, root) — Nom
from: mova
to: ud-next
match: t[upos=PRON, form=who|whoever, !feats.Case]
set: t[feats+=Case=Nom]
source: UD docs/_en/pos/PRON.md:52, :56
rule: mova.ud-next.whose-dependent
what: whose with a noun — Case=Gen and Poss=Yes
from: mova
to: ud-next
match: t[upos=PRON, form=whose, rel=nmod:poss, !feats.Case]
set: t[feats+=Case=Gen; feats+=Poss=Yes]
source: UD docs/_en/pos/PRON.md:52
rule: mova.ud-next.whose-independent
what: standalone whose — Poss=Yes without Case
from: mova
to: ud-next
match: t[upos=PRON, form=whose, rel!=nmod:poss]
set: t[feats+=Poss=Yes]
source: UD docs/_en/pos/PRON.md:52
rule: mova.ud-next.discourse-adv
what: adverb with discourse → advmod (in English discourse is not for the ADV class)
from: mova
to: ud-next
match: t[rel=discourse, upos=ADV]
set: t[rel=advmod]
source: UD docs/_u-dep/discourse.md:25–31

About feats+=. In the engine each FEATS feature is a separate field. feats+=X=V sets a value, replacing the existing one, and feats-=X together with feats+=X=… in one rule is a conflict. That never happens here: the condition !feats.Case is everywhere. Poss=Yes on whose is already in EWT, so the action changes nothing.

DEPS. The engine carries DEPS over unchanged. For mova.ud-next.discourse-adv this is a desync: N:discourse will remain in the EWT DEPS. Either a DEPS action or an EUD rebuild from the basic tree is needed. This is a question for the engine author.

Changes on EWT 2.18 (train+dev+test; engine: 16,622 sentences, 254,820 words, 469 words changed; distribution by rule — from counters):

ruletokens
mova.ud-next.whom-lemma + mova.ud-next.whomever-lemma24
mova.ud-next.whom-acc24
mova.ud-next.who-freerel-acc0
mova.ud-next.who-freerel-nom2 (for who wants, of whoever wrote it)
mova.ud-next.who-acc13: obj 7, obl 6 (who I need to send it to, who she worked with…)
mova.ud-next.who-nom408: subject 396, the rest (12) — root, ccomp, advcl, parataxis, conj, csubj
mova.ud-next.whose-dependent13
mova.ud-next.whose-independent0
mova.ud-next.discourse-adv9 (train 4, dev 1, test 4)

In total, who pronouns with Case after the run — 447 of 447: Acc 37 (whom forms 24, objects 13), Nom 410. This is what udnext.who-case requires.

Edge cases.

ud-next → mova

rule: ud-next.who-case-drop
what: drop Case from who pronouns (2.18 and EWT do not have it)
from: ud-next
to: mova
match: t[upos=PRON, lemma=who|whoever, feats.Case]
set: t[feats-=Case]
source: UD 2.18 docs/_en/pos/PRON.md:48
rule: ud-next.whose-case-drop
what: drop Case=Gen from whose, keep Poss=Yes
from: ud-next
to: mova
match: t[upos=PRON, form=whose, feats.Case]
set: t[feats-=Case]
source: UD 2.18 docs/_en/pos/PRON.md:68
rule: ud-next.whom-lemma
what: whom, whomever — lemma equals form (EWT 2.18 custom)
from: ud-next
to: mova
match: t[upos=PRON, form=whom|whomever]
set: t[lemma=@form]
source: EWT 2.18 (23 whom, 1 whomever)

There is no reverse rule for discourse: which advmod were discourse is not visible from the tree itself.

Check

Engine en convert / en convert-check, 26.09.2026, EWT 2.18 train+dev+test (mova = EWT 2.18 as is).

runresult
en convert dialects/ud-next mova ud-next10 rules; 469 words changed (FEATS 469, LEMMA 24, DEPREL 9)
en expert-check dialects/ud-next/seeds on the output0 violations of all udnext.* about who and discourse. 1 udnext.vbz-3sg remains: a token with empty FEATS, unrelated to the converter. Case: Nom 410, Acc 37, Gen 13
en convert dialects/ud-next ud-next mova on the output, then diff with the original EWT3 rules; 460 words changed. Exactly 9 lines differ from the original — adverbs with discourse (so ×2, though ×3, also, maybe, btw, FTW). The rest matches byte for byte
en convert-check dialects/ud-next ud-next on the forward outputud-next → mova → ud-next: 0 divergences; of the words changed by the forward run, 460 of 460 came back

What this means.

Negative control (by the engine, with a copy of the rules in a temporary folder):

Target ud-next gates:

This page in Markdown → https://md.mova.elamur.ai/free/en/docs/dialects/ud-next/convert/