1

Я пытаюсь отлаживать повышающий :: духа грамматика, который я хочу использовать в проекте Visual Studio: Это мой фрагмент кода:Ошибки при компиляции грамматики отладки активированной

#include <boost/spirit/include/classic.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 

// This is pasted and copied from another header file 

namespace StateMachine { 
namespace Private { 

struct LuaParameterData { 
    std::wstring name; 
    std::wstring type; 
    std::wstring unit; 
    std::wstring cardinality; 
    std::wstring value; 
}; 

} // namespace Private 
} // namespace StateMachine 

BOOST_FUSION_ADAPT_STRUCT(
    StateMachine::Private::LuaParameterData, 
    (std::wstring, name) 
    (std::wstring, type) 
    (std::wstring, unit) 
    (std::wstring, cardinality) 
    (std::wstring, value) 
) 

// From here original file continues 
namespace StateMachine { 
namespace Private { 

namespace qi = boost::spirit::qi; 

template<typename Iterator> 
struct LuaParameterDataParser : qi::grammar<Iterator, LuaParameterData(), qi::ascii::space_type> 
{ 
    LuaParameterDataParser() : LuaParameterDataParser::base_type(start) 
    { 
    quotedString %= qi::lexeme['"' >> +(qi::ascii::char_ - '"') >> '"']; 

    start %= 
     qi::lit("\"parameter\"") 
     >> ':' 
     >> '{' 
     >> qi::lit("\"name\""  ) >> ':' >> quotedString >> ',' 
     >> qi::lit("\"type\""  ) >> ':' >> quotedString >> ',' 
     >> qi::lit("\"unit\""  ) >> ':' >> quotedString >> ',' 
     >> qi::lit("\"cardinality\"") >> ':' >> quotedString >> ',' 
     >> qi::lit("\"value\""  ) >> ':' >> quotedString 
     >> '}' 
     ; 
    } 

    qi::rule<Iterator, std::string(), qi::ascii::space_type> quotedString; 
    qi::rule<Iterator, LuaParameterData(), qi::ascii::space_type> start; 
}; 

} // namespace Private 
} // namespace StateMachine 

BOOST_SPIRIT_DEBUG_RULE(StateMachine::Private::LuaParameterDataParser<std::string::const_iterator>::quotedString); 

Макрос BOOST_SPIRIT_DEBUG определяется в свойствах проекта.

Когда я скомпилировать я получаю следующие ошибки в последней строке, где я использую BOOST_SPIRIT_DEBUG_RULE:

error C3484: syntax error: expected '->' before the return type

error C2061: syntax error : identifier 'register_node'

Я не знаю, если я делаю правильные вещи. Я хочу отлаживать свою грамматику, но я видел только подсказки для правил отладки (here и here), поэтому я попытался адаптировать мой код.

Что я делаю неправильно и что мне делать, чтобы печатать отладочную информацию, когда я использую эту грамматику с phrase_parse?

ответ

1

Поле не является статичным.

Также вы не , показывая строку #define BOOST_SPIRIT_DEBUG (возможно, вы укажете ее в командной строке компилятора).

Типичный подход заключается в использовании BOOST_SPIRIT_DEBUG_NODES(), например.

Примечания:

  • уронить classic включают
  • какой-либо конкретной причины использовать wstring?

Compiling On Coliru

#define BOOST_SPIRIT_DEBUG 
#include <boost/fusion/include/io.hpp> 
//#include <boost/spirit/include/classic.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 

// This is pasted and copied from another header file 

namespace StateMachine { 
namespace Private { 

    struct LuaParameterData { 
     std::wstring name; 
     std::wstring type; 
     std::wstring unit; 
     std::wstring cardinality; 
     std::wstring value; 
    }; 

} // namespace Private 
} // namespace StateMachine 

BOOST_FUSION_ADAPT_STRUCT(
    StateMachine::Private::LuaParameterData, 
    (std::wstring, name) 
    (std::wstring, type) 
    (std::wstring, unit) 
    (std::wstring, cardinality) 
    (std::wstring, value) 
) 

namespace qi = boost::spirit::qi; 

// From here original file continues 
namespace StateMachine { 
namespace Private { 

    template<typename Iterator> 
    struct LuaParameterDataParser : qi::grammar<Iterator, LuaParameterData(), qi::ascii::space_type> 
    { 
     LuaParameterDataParser() : LuaParameterDataParser::base_type(start) 
     { 
      quotedString = qi::lexeme['"' >> +(qi::ascii::char_ - '"') >> '"']; 

      start = 
       qi::lit("\"parameter\"") 
       >> ':' 
       >> '{' 
       >> qi::lit("\"name\""  ) >> ':' >> quotedString >> ',' 
       >> qi::lit("\"type\""  ) >> ':' >> quotedString >> ',' 
       >> qi::lit("\"unit\""  ) >> ':' >> quotedString >> ',' 
       >> qi::lit("\"cardinality\"") >> ':' >> quotedString >> ',' 
       >> qi::lit("\"value\""  ) >> ':' >> quotedString 
       >> '}' 
       ; 

      BOOST_SPIRIT_DEBUG_NODES((start)(quotedString)); 
     } 

     qi::rule<Iterator, std::string(), qi::ascii::space_type> quotedString; 
     qi::rule<Iterator, LuaParameterData(), qi::ascii::space_type> start; 
    }; 

} // namespace Private 
} // namespace StateMachine 

int main() { 
    using It = std::string::const_iterator; 

    std::string const input = R"(
     "parameter" : { 
      "name"  : "name"  , 
      "type"  : "type"  , 
      "unit"  : "unit"  , 
      "cardinality" : "cardinality", 
      "value"  : "value"  
     } 
    )"; 
    It f = input.begin(), 
     l = input.end(); 

    StateMachine::Private::LuaParameterDataParser<It> p; 
    StateMachine::Private::LuaParameterData data; 
    bool ok = qi::phrase_parse(f, l, p, qi::ascii::space, data); 

    if (ok) { 
     std::wcout << L"Parsed: \n"; 
     std::wcout << L"\tname: " << data.name << L'\n'; 
     std::wcout << L"\ttype: " << data.type << L'\n'; 
     std::wcout << L"\tunit: " << data.unit << L'\n'; 
     std::wcout << L"\tcardinality: " << data.cardinality << L'\n'; 
     std::wcout << L"\tvalue: " << data.value << L'\n'; 
    } else { 
     std::wcout << L"Parse failure\n"; 
    } 

    if (f!=l) 
     std::wcout << L"Remaining unparsed: '" << std::wstring(f,l) << L"'\n"; 
} 

Печать

<start> 
    <try>\n  "parameter"</try> 
    <quotedString> 
    <try> "name"  , \n </try> 
    <success>  , \n   </success> 
    <attributes>[[n, a, m, e]]</attributes> 
    </quotedString> 
    <quotedString> 
    <try> "type"  , \n </try> 
    <success>  , \n   </success> 
    <attributes>[[t, y, p, e]]</attributes> 
    </quotedString> 
    <quotedString> 
    <try> "unit"  , \n </try> 
    <success>  , \n   </success> 
    <attributes>[[u, n, i, t]]</attributes> 
    </quotedString> 
    <quotedString> 
    <try> "cardinality", \n </try> 
    <success>, \n   "valu</success> 
    <attributes>[[c, a, r, d, i, n, a, l, i, t, y]]</attributes> 
    </quotedString> 
    <quotedString> 
    <try> "value"  \n </try> 
    <success>  \n  }\n </success> 
    <attributes>[[v, a, l, u, e]]</attributes> 
    </quotedString> 
    <success>\n </success> 
    <attributes>[[[110, 97, 109, 101], [116, 121, 112, 101], [117, 110, 105, 116], [99, 97, 114, 100, 105, 110, 97, 108, 105, 116, 121], [118, 97, 108, 117, 101]]]</attributes> 
</start> 
Parsed: 
    name: name 
    type: type 
    unit: unit 
    cardinality: cardinality 
    value: value 
+0

Я поставил 'BOOST_SPIRIT_DEBUG' в настройках проекта, поэтому он используется компилятором. Я попробую ваш подход. Спасибо за вашу помощь. – Jepessen

+0

Он компилирует (спасибо), но я не получаю результат от неудачного разбора, я установил 'BOOST_SPIRIT_DEBUG' define, так что я могу сделать? может быть, мой парсер ошибается? – Jepessen

+0

Я не вижу ничего, что объясняет это в вашем коде, как показано. Можете ли вы опубликовать SSCCE? Как бы то ни было, вы ничего не разбираете :) – sehe

 Смежные вопросы

  • Нет связанных вопросов^_^