2019-06-19 14:34:30 +02:00
|
|
|
/*
|
|
|
|
* Copyright © 2006 Ondra Kamenik
|
|
|
|
* Copyright © 2019 Dynare Team
|
|
|
|
*
|
|
|
|
* This file is part of Dynare.
|
|
|
|
*
|
|
|
|
* Dynare is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Dynare is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2019-01-08 17:12:05 +01:00
|
|
|
|
|
|
|
#include "parser_exception.hh"
|
|
|
|
#include "matrix_parser.hh"
|
|
|
|
#include "location.hh"
|
|
|
|
#include "matrix_tab.hh"
|
2019-04-19 17:09:04 +02:00
|
|
|
|
|
|
|
#include <algorithm>
|
2019-01-08 17:12:05 +01:00
|
|
|
|
|
|
|
using namespace ogp;
|
|
|
|
|
|
|
|
/** A global symbol for passing info to the MatrixParser from
|
|
|
|
* matrix_parse(). */
|
|
|
|
MatrixParser *mparser;
|
|
|
|
|
|
|
|
/** The declaration of functions defined in matrix_ll.cc and
|
|
|
|
* matrix_tab.cc generated from matrix.lex and matrix.y. */
|
2019-04-24 14:52:30 +02:00
|
|
|
void *matrix__scan_string(const char *);
|
2019-01-08 17:12:05 +01:00
|
|
|
void matrix__destroy_buffer(void *);
|
|
|
|
int matrix_parse();
|
|
|
|
extern ogp::location_type matrix_lloc;
|
|
|
|
|
|
|
|
void
|
2019-04-24 14:52:30 +02:00
|
|
|
MatrixParser::parse(const string &stream)
|
2019-01-08 17:12:05 +01:00
|
|
|
{
|
|
|
|
// reinitialize the object
|
|
|
|
data.clear();
|
|
|
|
row_lengths.clear();
|
|
|
|
nc = 0;
|
|
|
|
// allocate temporary buffer and parse
|
|
|
|
matrix_lloc.off = 0;
|
|
|
|
matrix_lloc.ll = 0;
|
2019-04-24 14:52:30 +02:00
|
|
|
void *p = matrix__scan_string(stream.c_str());
|
2019-01-08 17:12:05 +01:00
|
|
|
mparser = this;
|
|
|
|
matrix_parse();
|
|
|
|
matrix__destroy_buffer(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MatrixParser::add_item(double v)
|
|
|
|
{
|
|
|
|
data.push_back(v);
|
|
|
|
if (row_lengths.size() == 0)
|
|
|
|
row_lengths.push_back(0);
|
|
|
|
(row_lengths.back())++;
|
2019-04-19 17:09:04 +02:00
|
|
|
nc = std::max(nc, row_lengths.back());
|
2019-01-08 17:12:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
MatrixParser::start_row()
|
|
|
|
{
|
|
|
|
row_lengths.push_back(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-04-24 14:52:30 +02:00
|
|
|
MatrixParser::error(string mes) const
|
2019-01-08 17:12:05 +01:00
|
|
|
{
|
2019-04-24 14:52:30 +02:00
|
|
|
throw ParserException(std::move(mes), matrix_lloc.off);
|
2019-01-08 17:12:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
MatrixParser::find_first_non_empty_row(int start) const
|
|
|
|
{
|
|
|
|
int r = start;
|
2019-04-19 17:09:04 +02:00
|
|
|
while (r < static_cast<int>(row_lengths.size()) && row_lengths[r] == 0)
|
2019-01-08 17:12:05 +01:00
|
|
|
r++;
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
MPIterator
|
|
|
|
MatrixParser::begin() const
|
|
|
|
{
|
|
|
|
MPIterator it(*this);
|
|
|
|
return it;
|
|
|
|
}
|
|
|
|
|
|
|
|
MPIterator
|
|
|
|
MatrixParser::end() const
|
|
|
|
{
|
|
|
|
MPIterator it(*this, "end");
|
|
|
|
return it;
|
|
|
|
}
|
|
|
|
|
|
|
|
MPIterator::MPIterator(const MatrixParser &mp)
|
2019-12-20 14:36:20 +01:00
|
|
|
: p(&mp), i(0), r(mp.find_first_non_empty_row())
|
2019-01-08 17:12:05 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
MPIterator::MPIterator(const MatrixParser &mp, const char *dummy)
|
2019-12-20 14:36:20 +01:00
|
|
|
: p(&mp), i(mp.data.size()), r(mp.row_lengths.size())
|
2019-01-08 17:12:05 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
MPIterator &
|
|
|
|
MPIterator::operator++()
|
|
|
|
{
|
|
|
|
i++;
|
|
|
|
c++;
|
|
|
|
if (p->row_lengths[r] <= c)
|
|
|
|
{
|
|
|
|
c = 0;
|
|
|
|
r = p->find_first_non_empty_row(r+1);
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|