21#include <QXmlStreamReader>
23#include<boost/tokenizer.hpp>
35namespace LinguisticProcessing {
36namespace SyntacticAnalysis {
48 bool parse(QIODevice *device);
70 std::map< Common::MediaticData::ChainsType, std::map< std::string, TokenFilter > >
m_tokenFilters;
100 return m_d->
parse(device);
113 if (
m_reader.readNextStartElement())
115 if (
m_reader.name() == QLatin1String(
"matrice_precedence"))
121 m_reader.raiseError(QObject::tr(
"The file is not a LIMA XML precedence matrix file."));
139 LTRACE <<
"readPrecedenceMatrix";
140 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"matrice_precedence"));
142 while (
m_reader.readNextStartElement())
144 if (
m_reader.name() == QLatin1String(
"chaine"))
146 else if (
m_reader.name() == QLatin1String(
"matrice"))
149 m_reader.raiseError(QObject::tr(
"Expected a chaine or matrice but got a %1.").arg(
m_reader.name()));
163 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"chaine"));
165 std::string currentChainType = (
m_reader.attributes().value(
"type")).toUtf8().data();
170 while (
m_reader.readNextStartElement())
172 if (
m_reader.name() == QLatin1String(
"filtre"))
175 m_reader.raiseError(QObject::tr(
"Expected a filtre but got a %1.").arg(
m_reader.name()));
192 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"filtre"));
198 while (
m_reader.readNextStartElement())
200 if (
m_reader.name() == QLatin1String(
"nom"))
202 else if (
m_reader.name() == QLatin1String(
"categorie"))
204 else if (
m_reader.name() == QLatin1String(
"attribut"))
207 m_reader.raiseError(QObject::tr(
"Expected a nom, a categorie or a attribut but got a %1.").arg(
m_reader.name()));
223 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"nom"));
234 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"attribut"));
247 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"categorie"));
252 auto text =
m_reader.readElementText();
253 if (text[0].isDigit())
261 .getPropertyManager(
"MICRO").getPropertyValue(text.toStdString());
281 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"matrice"));
283 auto currentMatrixType =
m_reader.attributes().value(
"type").toString();
288 while (
m_reader.readNextStartElement())
290 if (
m_reader.name() == QLatin1String(
"ligne"))
292 else if (
m_reader.name() == QLatin1String(
"debuts"))
294 else if (
m_reader.name() == QLatin1String(
"fins"))
297 m_reader.raiseError(QObject::tr(
"Expected a ligne, a debuts or a fins but got a %1.").arg(
m_reader.name()));
309 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"ligne"));
312 while (
m_reader.readNextStartElement())
314 if (
m_reader.name() == QLatin1String(
"succ"))
317 m_reader.raiseError(QObject::tr(
"Expected a succ but got a %1.").arg(
m_reader.name()));
326 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"succ"));
328 using namespace boost;
329 std::string successorsStr = (
m_reader.attributes().value(
"REF")).toUtf8().data();
330 std::set< std::string > successors;
333 copy(tok.begin(), tok.end(),
334 std::insert_iterator< std::set< std::string > >(successors, successors.end()));
337 std::set< std::string >::iterator it = successors.begin();
338 for (; it != successors.end(); it++)
358 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"debuts"));
359 using namespace boost;
360 std::string beginningsStr = (
m_reader.attributes().value(
"REF")).toUtf8().data();
361 std::set< std::string > beginnings;
364 copy(tok.begin(), tok.end(),
365 std::insert_iterator< std::set< std::string > >(beginnings, beginnings.end()));
368 std::set< std::string >::iterator it = beginnings.begin();
369 for (; it != beginnings.end(); it++)
391 Q_ASSERT(
m_reader.isStartElement() &&
m_reader.name() == QLatin1String(
"fins"));
393 using namespace boost;
394 std::string endingsStr = (
m_reader.attributes().value(
"REF")).toUtf8().data();
395 std::set< std::string > endings;
398 copy(tok.begin(), tok.end(),
399 std::insert_iterator< std::set< std::string > >(endings, endings.end()));
402 std::set< std::string >::iterator it = endings.begin();
403 for (; it != endings.end(); it++)
418 auto errorStr = QObject::tr(
"%1, Line %2, column %3")
static LinguisticCode fromString(const std::string &str)
SyntagmaticMatrix & verbal()
SyntagmaticMatrixRow & nominalEnd()
SyntagmaticMatrixRow & verbalEnd()
SyntagmaticMatrixRow & verbalBegin()
SyntagmaticMatrix & nominal()
SyntagmaticMatrixRow & nominalBegin()
std::set< TokenFilter, tfless > m_filters
SyntagmaticMatrixFilter & filters()
XmlSyntagmaticMatrixFileReaderPrivate(SyntagmDefStruct &theMatrices, MediaId language)
bool parse(QIODevice *device)
std::string m_currentElement
std::string m_currentMatrixLineId
std::set< StringsPoolIndex > m_currentFilterAttributes
QString errorString() const
Common::MediaticData::ChainsType m_currentChainType
QXmlStreamReader m_reader
void readPrecedenceMatrix()
std::string m_currentFilterId
std::map< Common::MediaticData::ChainsType, std::map< std::string, TokenFilter > > m_tokenFilters
This map stores the associations between the filters and their IDs.
SyntagmDefStruct & m_matrices
The structure where data will be stored.
~XmlSyntagmaticMatrixFileReaderPrivate()=default
std::string m_currentFilterName
Common::MediaticData::ChainsType m_currentMatrixType
std::set< LinguisticCode > m_currentFilterCategories
This is a SAX document handler the Detect configuration files.
bool parse(QIODevice *device)
QString errorString() const
XmlSyntagmaticMatrixFileReader(SyntagmDefStruct &theMatrices, MediaId language)
static MediaticData & changeable()
singleton accessor