Ein Compiler wird häufig als Übersetzer bezeichnet, da er Programm-Code in eine Sprache übersetzt, die der Computer versteht. Der TextTransformer ist ein Compiler-Compiler oder Parser-Generator, d.h. ein Hilfsmittel zum Bau von Übersetzern.
Bei dem Projekt Zahl2Nombre, der Übersetzung deutscher Zahlworte in französische, kommt dieser Terminus mit seiner Alltagsbedeutung überein.
Das Projekt kann hier herunter geladen werden: Text2Html.ttp
Ein Text zum testen von Zahl2Nombre ist: Zahl2Nombre_Test.txt
Die Textvorlage für diese HTML-Seite ist: Text2Html.txt
Jedem deutschsprachigen Leser sind die Bildungsregeln der Zahlwörter unmittelbar bekannt. Dennoch ist die Aufgabe einen derartigen Übersetzer zu schreiben eine Knobelarbeit und das resultierende Programm nicht sehr übersichtlich. Dies liegt daran, dass natürlichsprachliche Ausdrücke stets Unregelmäßigkeiten und Ausnahmen enthalten, die eine formale Repräsentation erschweren. Hinzukommt, dass die Bildungsregeln der französischen Zahlworte von denen der deutschen teilweise stark abweicht, so dass auch, wenn das deutsche Zahlwort richtig analysiert ist, eine Synthese des französischen keineswegs eins zu eins aus den deutschen Zahlwortelementen erfolgen kann.
So ist z.B. die Reihenfolge der Einer und Zehner im deutschen gegenüber dem Französischen vertauscht. Das französische "vingt et un" hieße wörtlich übersetzt "zwanzig und eins" und nicht "einundzwanzig". Noch schwieriger verhält es sich mit den Zahlen größer als 70. Die Zahl "sechsundneunzig" ist auf französisch "quatre-vingt-seize", was wörtlich übersetzt hieße: "vier-zwanzig-sechzehn".
Wegen dieser Schwierigkeiten wäre es in einer "ernsthaften" Anwendung wahrscheinlich sinnvoller auf die ersten tausend Zahlwortpaare über einer Tabelle zuzugreifen. Mir hat diese Knobelarbeit aber Spaß gemacht und mindestens zu didaktischen Zwecken ist sie sinnvoll.
deutsch | französisch |
---|---|
null | zéro |
eins | un |
zwei | deux |
drei | trois |
vier | quatre |
fünf | cinq |
sechs | six |
sieben | sept |
acht | huit |
neun | neuf |
zehn | dix |
elf | onze |
zwölf | douze |
dreizehn | treize |
vierzehn | quatorze |
fünfzehn | quinze |
sechzehn | seize |
siebzehn | dix-sept |
achtzehn | dix-huit |
neunzehn | dix-neuf |
zwanzig | vingt |
einundzwanzig | vingt et un |
zweiundzwanzig | vingt-deux |
dreiundzwanzig | vingt-trois |
vierundzwanzig | vingt-quatre |
fünfundzwanzig | vingt-cinq |
sechsundzwanzig | vingt-six |
siebenundzwanzig | vingt-sept |
achtundzwanzig | vingt-huit |
neunundzwanzig | vingt-neuf |
dreißig | trente |
einunddreißig | trente et un |
zweiunddreißig | trente-deux |
vierzig | quarante |
einundvierzig | quarante et un |
fünfzig | cinquante |
einundfünfzig | cinquante et un |
sechzig | soixante |
einundsechzig | soixante et un |
siebzig | soixante-dix |
einundsiebzig | soixante et onze |
zweiundsiebzig | soixante-douze |
dreiundsiebzig | soixante-treize |
achtzig | quatre-vingts |
einundachtzig | quatre-vingt-un |
zweiundachtzig | quatre-vingts-deux |
dreiundachtzig | quatre-vingts-trois |
neunzig | quatre-vingt-dix |
einundneunzig | quatre-vingt-onze |
sechsundneunzig | quatre-vingt-seize |
neunundneunzig | quatre-vingt-dix-neuf |
hundert | cent |
hunderteins | cent un |
hundertfünf | cent cinq |
hundertzehn | cent dix |
hundertzwanzig | cent vingt |
zweihundert | deux cents |
tausend | mille |
tausendeins | mille un |
tausendzweihundert | mille deux cents |
zweitausend | deux mille |
zweitausendzehn | deux mille dix |
eine Million | un million |
Um die Ausnahmen, die es bei der Bildung der französischen Zahlausdrücke gibt berücksichtigen zu können, werden jeweils Informationen über den Kontext in dem das aktuell erkannte Token steht benötigt. Der Kontext besteht aus zuvor oder später erkannten Token. So gibt es beispielsweise eine Reihe regelmäßig gebildeter Zahlausdrücke:
21: vingt et un
31: trente et un
41: quarante et un
51: cinquante et un
61: soixante et un
die dann von einer unregelmäßigen Bildung abgelöst wird:
Folgt also das Token "siebzig" auf die Token: "ein" und "und", so müssen die letzteren anders übersetzt werden als im Normalfall. Im TETRA-Programm wird die französische Zahl daher erst gebildet, wenn alle drei Token erkannt sind und eine entsprechende Fallunterscheidung gemacht werden kann. Als Grundlage der Fallunterscheidung dient in der Regel "und_zehner" die Integer-Referenzvariable "iZehner", die als Parameter der Regel "zehner" nach dessen Durchlaufen einen Wert zwischen 2 und 9 enthält, je nachdem ob eine Zwanziger, Dreißiger usw. erkannt wurden. Die Integer-Variable kann nun für eine switch-Anweisung verwendet werden, die die richtige Übersetzung der Zahl bestimmt.
Ein ähnliches Problem besteht darin, ob "hundert" mit "Cent" oder "cents" übersetzt werden soll. Hier hilft ein boolscher Parameter, der angibt, ob eine Pluralbildung erfolgen soll oder nicht (Regel: "hundert").
Anm.: In der Produktion "hunderter" wird die Regel hundert folgendermaßen aufgerufen:
hundert[sHundert, iEiner != 1]
d.h. der zweite Parameter, der die Pluralbildung bestimmt, wird während des Aufrufs berechnet:
er ist true, wenn die Integer-Variable "iEiner" nicht gleich eins ist.
to the top |