а) Пока это мой пересмотренный полный код. Он не работает полностью, так как у меня возникают такие ошибки, как
«ошибка: нет типа с именем ‘type’ in ‘struct
повышение :: дух :: черты :: container_value»
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
#include <string>
#include <complex>
#include <fstream>
#include <vector>
namespace OpcUaStackCore
{
namespace spirit = boost::spirit;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
struct eddlVariable
{
std::string identifier;
std::string label;
std::string help;
std::string classtype;
};
//std::vector<eddlVariable> variableContainer;
template <typename Iterator>
struct eddlVariableParser : qi::grammar<Iterator, eddlVariable(), ascii::blank_type>
{
eddlVariableParser() : eddlVariableParser::base_type(start)
{
using boost::spirit::eol;
text = +qi::graph;
start = "VARIABLE" >> text >> qi::eol
>> '{' >> qi::eol
>> "LABEL" >> text >> qi::eol
>> "HELP" >> text >> qi::eol
>> "CLASS" >> text >> qi::eol
>> "TYPE" >> text >> qi::eol
>> '}';
}
private:
qi::rule<Iterator, eddlVariable(), ascii::blank_type> start;
// lexemes
qi::rule<Iterator, eddlVariable()> text;
};
}
BOOST_FUSION_ADAPT_STRUCT(
OpcUaStackCore::eddlVariable,
(std::string, identifier)
(std::string, label)
(std::string, help)
(std::string, classtype)
)
int main(int argc, char **argv)
{
using namespace OpcUaStackCore;
using boost::property_tree::ptree;
using boost::property_tree::write_xml;
using boost::property_tree::xml_writer_settings;
typedef std::string::const_iterator iterator_type;
typedef eddlVariableParser<iterator_type> eddl_parser;
eddl_parser parser;
eddlVariable storedEDDLData;
char const* filename;
if (argc > 1)
filename = argv[1];
std::ifstream filestream(filename, std::ios_base::in);
std::string storedString;
filestream.unsetf(std::ios::skipws);
std::copy(std::istream_iterator<char>(filestream), std::istream_iterator<char>(), std::back_inserter(storedString));
std::cout << "Stored string is: " << storedString << std::endl;
std::string::const_iterator begin_iter = storedString.begin();
std::string::const_iterator end_iter = storedString.end();
/* Invoke the parser */
bool r = phrase_parse(begin_iter, end_iter, parser, ascii::space, storedEDDLData);
if (r && begin_iter == end_iter)
{
std::cout << "Parsing succeeded\n";
} else {
std::cout << "Parsing failed\n";
}
return 0;
}
Пожалуйста, найдите мой полный код выше, возможно, это могло бы прояснить мой вопрос. Мой код все еще не работает. Один пример данных, которые мне нужно будет передать, показан ниже:
VARIABLE phys_soft_desc
{
LABEL [phys_soft_desc_label];
HELP [phys_soft_desc_help];
CLASS CONTAINED;
TYPE ASCII (32)
{
DEFAULT_VALUE "";
}
HANDLING READ;
}
Задача ещё не решена.
Других решений пока нет …