view software/eXist/mpdl-modules/src/de/mpg/mpiwg/berlin/mpdl/lt/analyzer/lang/MpdlNormalizerLexLA.lex @ 9:1ec29fdd0db8

neue .lex Dateien f?r Normalisierung / externe Objekte update
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 22 Feb 2011 16:03:45 +0100
parents
children 5df60f24e997
line wrap: on
line source

/*
 * Normalization rules for Latin text
 * [this is a JFlex specification]
 *
 * Wolfgang Schmidle 
 * version 0.96
 * 2011-02-21
 *
 */

package de.mpg.mpiwg.berlin.mpdl.lt.analyzer.lang;

%%

%public
%class MpdlNormalizerLexLA
%type java.lang.String
%unicode

// Latin: la, lat

%states DISP, DICT, SEARCH
%states RENAISSANCE_DISP, RENAISSANCE_DICT, RENAISSANCE_SEARCH

%{
	private static final int CONS = 1;
	private static final int VOWEL = 2;
	private int cv = 0;  // consonant = 1, vowel = 2, everything else = 0

	private String original = "";
	private String normalized = "";
	private int problem = 0;
	
	private void add (String norm) {
		original += yytext(); 
		normalized += norm;
	}
%}

Vowel = [AEIOUaeiou] // without Ææęàèòùœ
Cons = [BCDFGHKLMNPQRSTVWXZbcdfghklmnpqrstvwxzſß]
LR = [lLrR]

hyphen = [\u002d\u00ad]  // hyphen and soft hyphen
X = {hyphen}?

END = \n

que = (que)?  // optional -que
enclitic = (que | ve | ne)
prefixCons = (in{X}ter | per | ſu{X}per | ſer) // "ſer" for forms of ſervare

%%


// TEST, siehe Benedetti Seite 444
𐆑 { add("X"); } // (U+10191; D800+DD91)


<DISP, DICT, SEARCH, 
RENAISSANCE_DISP, RENAISSANCE_DICT, RENAISSANCE_SEARCH> {

// 1. simple replacements

// 1.1 single characters
ſ { cv = CONS; add("s"); }
ß { cv = CONS; add("ss"); }
[æę] { cv = VOWEL; add("ae"); }
Æ { cv = VOWEL; add("AE"); }
œ { cv = VOWEL; add("oe"); }

// 1.2 character combinations
ij { cv = VOWEL; add("ii"); }

// 2. superfluous diacritics

// 2.1 acute accent
q́ue / {END} { add("que"); }  // G
á / [mrst]? {enclitic} {END} { add("a"); }  // G
é / [mrst]? {enclitic} {END} { add("e"); }  // G
í / [mrst]? {enclitic} {END} { add("i"); }  // G
ó / [mrst]? {enclitic} {END} { add("o"); }  // G
ú / [mrst]? {enclitic} {END} { add("u"); }  // G

úe / {END} { add("ve"); }  // W ??

// 2.2 grave accent
à / {que} {END} { add("a"); }  // W G
àm / {que} {END} { add("am"); }  // W (G)
às / {que} {END} { add("as"); }  // W (G) (-àsque will likely never occur)
è / {que} {END} { add("e"); }  // W G
ò / {que} {END} { add("o"); }  // W G
òd / {que} {END} { add("od"); }  // W (G)
ùm / {que} {END} { add("um"); }  // W (G)
ùs / {que} {END} { add("us"); }  // W G

ès / {que} {END} { add("es"); }  // (G)
^ quì / {END} { add("qui"); }  // W ??
^ Quì / {END} { add("Qui"); }  // W ??
àc / {END} { add("ac"); }  // W ??
èr / {END} { add("er"); }  // W ??
èt / {END} { add("et"); }  // W ??
ù / {END} { add("u"); }  // W ??
ùl / {END} { add("ul"); }  // W ??

// 2.3 circumflex accent
^ hîc / {END} { add("hic"); }  // W G
^ Hîc / {END} { add("Hic"); }  // W G
^ ô / {END} { add("o"); }  // G
â / {que} {END} { add("a"); }  // W G
ûs / {END} { add("us"); }  // W G
âr { add("ar"); }  // W (G) --> this is only a rough approximation!

// 2.4 trema
// 2.4.1 common cases
aë { cv = VOWEL; add("ae"); }
oë { cv = VOWEL; add("oe"); }
// 2.4.2 rare cases
oï { cv = VOWEL; add("oi"); }
uï { cv = VOWEL; add("ui"); }
// 2.4.3 extremely rare cases
uü { cv = VOWEL; add("uu"); }


// 3. rules for u and v

// 3.1 rules for u --> v

// peruenias --> pervenias, interuallum --> intervallum
^ {prefixCons} / {X} { cv = VOWEL; add(yytext().replace("ſ", "s")); }  // not cv = CONS !

// uellet --> vellet
^ [uU] / {Vowel} { cv = VOWEL; add(yytext().replaceAll("u", "v").replaceAll("U", "V")); }

// diuidatur --> dividatur
// ut, volui: unchanged
// no rule for veruina because we cannot distinguish it from volui
[uU] / {Vowel} { 
		switch(cv) {
			case VOWEL: add(yytext().replace("u", "v").replace("U", "V")); break;
			default: cv = VOWEL; add(yytext()); break;
		}
	}

// 3.2 rules for v --> u

// qvam --> quam
qv { cv = CONS; add("qu"); }  // the replaced v still counts as consonant
Qv { cv = CONS; add("Qu"); }
QV { cv = CONS; add("QU"); }

// febrvarius --> februarius
// curva: unchanged
{LR} [vV] { 
		switch(cv) {
			case CONS: add(yytext().replace("v", "u").replace("V", "U")); break;
			default: cv = CONS; add(yytext()); break;
		}
	}

// februarivs --> februarius
v / {X} {Cons} { cv = CONS; add("u"); }
V / {X} {Cons} { cv = CONS; add("U"); }

// 3.3 override default rule for .

{Vowel} { cv = VOWEL; add(yytext()); }
{Cons} { cv = CONS; add(yytext()); }
{hyphen} { add(yytext()); }

. { problem = 1; cv = 0; add(yytext()); }  // in particular "@", and from Arboreal: "〈" (2329), "〉" (232A), Ç, ç

}


<DISP, SEARCH, 
RENAISSANCE_DISP, RENAISSANCE_SEARCH> {

{END} {
		switch (problem) {
			case 1: return original;
			default: return normalized;
		}
	}
}

<DICT, 
RENAISSANCE_DICT> {

{END} {
		switch (problem) {
			case 1: return "";
			default: return normalized;
		}
	}
}


/*

Annahmen:
- die Routine wird wortweise aufgerufen, mit einem \n am Ende des Strings
- Wörter mit Zeilenumbrüchen wurden bereits wieder zusammengesetzt


TO DO:

LA: Nochmal überlegen, ob man Ææęàèòùœ in der Vokal-Klasse weglassen kann. Sie schaden aber auch nicht. (Oder doch !?) Unterscheide Vokal-Klassen vor und nach dem u ? 
LA: Diakritika nochmal mit Paul durchgehen
LA: Die Disambiguierungen durch die Diakritika fehlen noch.
LA: ist J wirklich ein Problemfall?
LA: gibt es Wörter wie super-rv... oder super-lv... in Klein- oder Großbuchstaben?

*/