/** * Insert a list of tokens into the paradigm / section being processed * * @param elements the list */ private void insertEntryTokens(ArrayList<EntryToken> elements) { if (DEBUG) System.err.println("insertEntryTokens( " + elements); if (!current_paradigm.equals("")) { // compilation of paradigms TransducerComp t = paradigms.get(current_paradigm); if (t == null) { t = new TransducerComp(); paradigms.put(current_paradigm, t); } Integer e = t.getInitial(); for (int i = 0, limit = elements.size(); i < limit; i++) { EntryToken entry = elements.get(i); if (entry.isParadigm()) { if (!paradigms.containsKey(entry.paradigmName)) { paradigms.put(entry.paradigmName, new TransducerComp()); } e = t.insertTransducer(e, paradigms.get(entry.paradigmName)); } else if (entry.isSingleTransduction()) { e = matchTransduction(entry.leftSide, entry.rightSide, e, t); } else if (entry.isRegexp()) { RegexpCompiler analyzer = new RegexpCompiler(); analyzer.initialize(alphabet); analyzer.compile(entry.regexp); t.setEpsilon_Tag(alphabet_cast00); e = t.insertTransducer(e, analyzer.getTransducer()); } else { throw new RuntimeException( "Error (" + reader.getLocation().getLineNumber() + "): Invalid entry token."); } } t.setFinal(e); } else { // compilation of the dictionary TransducerComp t; if (!sections.containsKey(current_section)) { t = new TransducerComp(); sections.put(current_section, t); } else { t = sections.get(current_section); } int e = t.getInitial(); for (int i = 0, limit = elements.size(); i < limit; i++) { EntryToken entry = elements.get(i); if (entry.isParadigm()) { final String paradigmName = entry.paradigmName; if (i == elements.size() - 1) { // paradigm sufix if (!suffix_paradigms.containsKey(current_section)) { suffix_paradigms.put(current_section, new HashMap<String, Integer>()); } if (suffix_paradigms.get(current_section).containsKey(paradigmName)) { t.linkStates(e, suffix_paradigms.get(current_section).get(paradigmName), 0); e = postsuffix_paradigms.get(current_section).get(paradigmName); } else { e = t.insertNewSingleTransduction(alphabet_cast00, e); suffix_paradigms.get(current_section).put(paradigmName, e); t.setEpsilon_Tag(0); e = t.insertTransducer(e, paradigms.get(paradigmName)); if (!postsuffix_paradigms.containsKey(current_section)) { postsuffix_paradigms.put(current_section, new HashMap<String, Integer>()); } postsuffix_paradigms.get(current_section).put(paradigmName, e); } } else if (i == 0) { // paradigm prefix if (!prefix_paradigms.containsKey(current_section)) { prefix_paradigms.put(current_section, new HashMap<String, Integer>()); } if (prefix_paradigms.get(current_section).containsKey(paradigmName)) { e = prefix_paradigms.get(current_section).get(paradigmName); } else { t.setEpsilon_Tag(0); e = t.insertTransducer(e, paradigms.get(paradigmName)); prefix_paradigms.get(current_section).put(paradigmName, e); } } else { // paradigm intermediate if (!paradigms.containsKey(paradigmName)) { paradigms.put(paradigmName, new TransducerComp()); } t.setEpsilon_Tag(0); e = t.insertTransducer(e, paradigms.get(paradigmName)); } } else if (entry.isRegexp()) { RegexpCompiler analyzer = new RegexpCompiler(); analyzer.initialize(alphabet); analyzer.compile(entry.regexp); t.setEpsilon_Tag(alphabet_cast00); e = t.insertTransducer(e, analyzer.getTransducer()); } else { e = matchTransduction(entry.leftSide, entry.rightSide, e, t); } } t.setFinal(e); } }