Mercurial > hg > mpdl-group
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? */