Index: trunk/apertium/apertium/serialiser.h =================================================================== --- trunk/apertium/apertium/serialiser.h (revision 68891) +++ trunk/apertium/apertium/serialiser.h (revision 68893) @@ -41,9 +41,8 @@ static unsigned char compressedSize(const SerialisedType &SerialisedType_) { unsigned char compressedSize_ = 0; - for (; static_cast(SerialisedType_ >> - std::numeric_limits::digits * - compressedSize_) != 0; + for (; (SerialisedType_ >> + std::numeric_limits::digits * compressedSize_) != 0; ++compressedSize_) { } Index: trunk/apertium/apertium/apertium_tagger.cc =================================================================== --- trunk/apertium/apertium/apertium_tagger.cc (revision 68891) +++ trunk/apertium/apertium/apertium_tagger.cc (revision 68893) @@ -630,7 +630,7 @@ } catch (const basic_ExceptionType &basic_ExceptionType_) { std::stringstream what_; what_ << "can't deserialise SERIALISED_BASIC_TAGGER file \"" << argv[optind] - << "\""; + << "\" Reason: " << basic_ExceptionType_.what(); throw Exception::apertium_tagger::deserialise(what_); } Index: trunk/apertium/apertium/hmm.cc =================================================================== --- trunk/apertium/apertium/hmm.cc (revision 68891) +++ trunk/apertium/apertium/hmm.cc (revision 68893) @@ -205,7 +205,7 @@ tags = tdhmm.getOpenClass(); } else { - require_ambiguity_class(tdhmm, tags, *word); + require_ambiguity_class(tdhmm, tags, *word, nw); } k2=output[tags]; @@ -362,7 +362,7 @@ tags = tdhmm.getOpenClass(); } else { - require_ambiguity_class(tdhmm, word_untagged->get_tags(), *word_untagged); + require_ambiguity_class(tdhmm, word_untagged->get_tags(), *word_untagged, nw); tags = word_untagged->get_tags(); } @@ -528,7 +528,7 @@ ndesconocidas++; } - require_ambiguity_class(tdhmm, tags, *word); + require_ambiguity_class(tdhmm, tags, *word, nw); k = output[tags]; len = pending.size(); Index: trunk/apertium/apertium/lswpost.cc =================================================================== --- trunk/apertium/apertium/lswpost.cc (revision 68891) +++ trunk/apertium/apertium/lswpost.cc (revision 68893) @@ -114,7 +114,7 @@ tags_left = tdlsw.getOpenClass(); } - require_ambiguity_class(tdlsw, tags_left, *word); + require_ambiguity_class(tdlsw, tags_left, *word, nw); ++nw; delete word; word = morpho_stream.get_next_word(); // word for tags mid @@ -122,7 +122,7 @@ if (tags_mid.size()==0) { //This is an unknown word tags_mid = tdlsw.getOpenClass(); } - require_ambiguity_class(tdlsw, tags_mid, *word); + require_ambiguity_class(tdlsw, tags_mid, *word, nw); ++nw; delete word; if (morpho_stream.getEndOfFile()) { @@ -141,7 +141,7 @@ if (tags_right.size()==0) { //This is an unknown word tags_right = tdlsw.getOpenClass(); } - require_ambiguity_class(tdlsw, tags_right, *word); + require_ambiguity_class(tdlsw, tags_right, *word, nw); num_valid_seq = tags_left.size() * tags_mid.size() * tags_right.size(); for (iter_left = tags_left.begin(); iter_left != tags_left.end(); ++iter_left) { @@ -252,7 +252,7 @@ if (tags_left.size()==0) { //This is an unknown word tags_left = tdlsw.getOpenClass(); } - require_ambiguity_class(tdlsw, tags_left, *word); + require_ambiguity_class(tdlsw, tags_left, *word, nw); ++nw; delete word; word = morpho_stream.get_next_word(); // word for tags mid @@ -260,7 +260,7 @@ if (tags_mid.size()==0) { //This is an unknown word tags_mid = tdlsw.getOpenClass(); } - require_ambiguity_class(tdlsw, tags_mid, *word); + require_ambiguity_class(tdlsw, tags_mid, *word, nw); ++nw; delete word; if (morpho_stream.getEndOfFile()) { @@ -278,7 +278,7 @@ if (tags_right.size()==0) { //This is an unknown word tags_right = tdlsw.getOpenClass(); } - require_ambiguity_class(tdlsw, tags_right, *word); + require_ambiguity_class(tdlsw, tags_right, *word, nw); double normalization = 0; Index: trunk/apertium/apertium/tagger_utils.cc =================================================================== --- trunk/apertium/apertium/tagger_utils.cc (revision 68891) +++ trunk/apertium/apertium/tagger_utils.cc (revision 68893) @@ -19,6 +19,7 @@ #include #include +#include #include #ifdef _MSC_VER #define wcstok wcstok_s @@ -191,12 +192,17 @@ } void -tagger_utils::require_ambiguity_class(TaggerData &td, set &tags, TaggerWord &word) { +tagger_utils::require_ambiguity_class(TaggerData &td, set &tags, TaggerWord &word, int nw) { if (td.getOutput().has_not(tags)) { wstring errors; errors = L"A new ambiguity class was found. I cannot continue.\n"; errors+= L"Word '" + word.get_superficial_form() + L"' not found in the dictionary.\n"; errors+= L"New ambiguity class: " + word.get_string_tags() + L"\n"; + if (nw >= 0) { + std::wostringstream ws; + ws << (nw + 1); + errors+= L"Line number: " + ws.str() + L"\n"; + } errors+= L"Take a look at the dictionary, then retrain."; fatal_error(errors); } Index: trunk/apertium/apertium/tagger_utils.h =================================================================== --- trunk/apertium/apertium/tagger_utils.h (revision 68891) +++ trunk/apertium/apertium/tagger_utils.h (revision 68893) @@ -85,7 +85,7 @@ set find_similar_ambiguity_class(TaggerData &td, set &c); /** Dies with an error message if the tags aren't in the tagger data */ -void require_ambiguity_class(TaggerData &td, set &tags, TaggerWord &word); +void require_ambiguity_class(TaggerData &td, set &tags, TaggerWord &word, int nw); /** As with find_similar_ambiguity_class, but returns tags if it's already fine * & prints a warning if debug */