// Copyright 2013 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.morph.mapper.czech; import marmot.morph.mapper.czech.PdtMorphTag.Gender; public class PdtMorphTagReader { public PdtMorphTag parse_keyvalue(String pos, String feats) { PdtMorphTag tag = new PdtMorphTag(); setPos(pos, tag); setFeatures(feats, tag); return tag; } private void setFeatures(String feats, PdtMorphTag tag) { feats = feats.toLowerCase(); if (!feats.equals("_")) { for (String feat : feats.split("\\|")) { int index = feat.indexOf("="); String key = feat.substring(0, index); String value = feat.substring(index + 1); setGenricFeature(key, value, tag); } } } private void setGenricFeature(String key, String value, PdtMorphTag tag) { if (!key.equals("subpos")) { value = value.replace("x", "_"); } switch (key) { case "subpos": setSubPos(value, tag); break; case "gen": setGender(value, tag); break; case "num": setNumber(value, tag); break; case "cas": setCase(value, tag); break; case "gra": setDegree(value, tag); break; case "neg": setNegation(value, tag); break; case "per": setPerson(value, tag); break; case "ten": setTense(value, tag); break; case "voi": setVoice(value, tag); break; case "var": case "sem": case "pge": case "pnu": break; default: throw new RuntimeException("Unknown category: " + key); } } private void setVoice(String value, PdtMorphTag tag) { tag.voice_ = PdtMorphTag.Voice.valueOf(value); } private void setTense(String value, PdtMorphTag tag) { tag.tense_ = PdtMorphTag.Tense.valueOf(value); } private void setPerson(String value, PdtMorphTag tag) { switch (value) { case "1": tag.person_ = PdtMorphTag.Person.fst; break; case "2": tag.person_ = PdtMorphTag.Person.snd; break; case "3": tag.person_ = PdtMorphTag.Person.thd; break; case "_": break; default: throw new RuntimeException("Unknown value: " + value); } } private void setNegation(String value, PdtMorphTag tag) { tag.negation_ = PdtMorphTag.Negation.valueOf(value); } private void setDegree(String value, PdtMorphTag tag) { switch (value) { case "1": tag.degree_ = PdtMorphTag.Degree.pos; break; case "2": tag.degree_ = PdtMorphTag.Degree.comp; break; case "3": tag.degree_ = PdtMorphTag.Degree.sup; break; default: throw new RuntimeException("Unknown value: " + value); } } private void setCase(String value, PdtMorphTag tag) { switch (value) { case "1": tag.case_ = PdtMorphTag.Case.nom; break; case "2": tag.case_ = PdtMorphTag.Case.gen; break; case "3": tag.case_ = PdtMorphTag.Case.dat; break; case "4": tag.case_ = PdtMorphTag.Case.acc; break; case "5": tag.case_ = PdtMorphTag.Case.voc; break; case "6": tag.case_ = PdtMorphTag.Case.loc; break; case "7": tag.case_ = PdtMorphTag.Case.ins; break; case "_": break; default: throw new RuntimeException("Unknown value: " + value); } } private void setNumber(String value, PdtMorphTag tag) { tag.number_ = PdtMorphTag.Number.valueOf(value); } private void setGender(String value, PdtMorphTag tag) { if (value.equals("x")) { tag.gender_ = Gender._; return; } tag.gender_ = PdtMorphTag.Gender.valueOf(value); } private void setSubPos(String value, PdtMorphTag tag) { try { tag.type_ = PdtMorphTag.Type.valueOf(value); } catch (IllegalArgumentException e) { switch (value) { case ":": tag.type_ = PdtMorphTag.Type.Colon; break; case "^": tag.type_ = PdtMorphTag.Type.Zircumflex; break; case ",": tag.type_ = PdtMorphTag.Type.Comma; break; case "=": tag.type_ = PdtMorphTag.Type.Equals; break; case "?": tag.type_ = PdtMorphTag.Type.Questionmark; break; case "}": tag.type_ = PdtMorphTag.Type.Bracket; break; case "*": tag.type_ = PdtMorphTag.Type.Asterisk; break; case "@": tag.type_ = PdtMorphTag.Type.At; break; case "1": tag.type_ = PdtMorphTag.Type.One; case "2": tag.type_ = PdtMorphTag.Type.Two; case "3": tag.type_ = PdtMorphTag.Type.Three; case "4": tag.type_ = PdtMorphTag.Type.Four; break; case "5": tag.type_ = PdtMorphTag.Type.Five; break; case "6": tag.type_ = PdtMorphTag.Type.Six; break; case "7": tag.type_ = PdtMorphTag.Type.Seven; break; case "8": tag.type_ = PdtMorphTag.Type.Eight; break; case "9": tag.type_ = PdtMorphTag.Type.Nine; break; default: throw e; } } } private void setPos(String pos, PdtMorphTag tag) { pos = pos.toLowerCase(); tag.pos_ = PdtMorphTag.Pos.valueOf(pos); } public PdtMorphTag parse_positional(String string) { string = string.toLowerCase(); PdtMorphTag tag = new PdtMorphTag(); for (int i = 0; i < string.length(); i++) { char c = string.charAt(i); String current_char = Character.toString(c); if (c == '-' || c == 'x') { continue; } switch (i) { case 0: setPos(current_char, tag); break; case 1: setSubPos(current_char, tag); break; case 2: setGender(current_char, tag); break; case 3: setNumber(current_char, tag); break; case 4: setCase(current_char, tag); break; case 5: // Poss Gender break; case 6: // Poss Number break; case 7: setPerson(current_char, tag); break; case 8: setTense(current_char, tag); break; case 9: setDegree(current_char, tag); break; case 10: setNegation(current_char, tag); break; case 11: setVoice(current_char, tag); break; case 12: case 13: case 14: // Unused break; case 15: // Variant break; } } return tag; } }