Spirit::qi::具有不同字符大小的语法名称

发布于 2024-12-29 08:14:06 字数 813 浏览 1 评论 0原文

我正在用 Spirit::qi 制作一个解析器,目标是使其与不同的字符大小兼容。

template < typename Iterator >
struct grammar : qi::grammar < Iterator >
{
    grammar () : grammar::base_type ( file, alter_string_size_to < Iterator::value_type > ( _szFile ) )
    {

    }

    qi::rule < Iterator > file;
};

鉴于

alter_string_size_to < Iterator::value_type > ( _szFile )

成功返回一个指向包含所需字符大小的 _szFile 的字符串的指针。

当我编译时,

Iterator = std::wstring::const_iterator

我收到以下错误消息

cannot convert parameter 2 from 'unsigned short *' to 'const std::string &'

So .. Grammar::base_type 仅期望 const std::string &作为第二个参数。 我的问题是,如何告诉 qi::grammar 期望一个具有迭代器 value_type size 的字符串?

提前致谢 !

I am making a parser with spirit::qi and aim for making it compatible with different char sizes.

template < typename Iterator >
struct grammar : qi::grammar < Iterator >
{
    grammar () : grammar::base_type ( file, alter_string_size_to < Iterator::value_type > ( _szFile ) )
    {

    }

    qi::rule < Iterator > file;
};

Given that

alter_string_size_to < Iterator::value_type > ( _szFile )

successfully returns a pointer to a string containing _szFile in the required char size.

When I compile with

Iterator = std::wstring::const_iterator

I get following error message

cannot convert parameter 2 from 'unsigned short *' to 'const std::string &'

So .. grammar::base_type is only expecting an const std::string & as the second parameter.
My question is, how can I tell qi::grammar to expect a string with its Iterators value_type size ?

Thanks in advance !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不会写诗 2025-01-05 08:14:06

它在源代码中的定义如下:

    grammar(
        start_type const& start
      , std::string const& name_ = "unnamed-grammar")
    : proto::extends<terminal, base_type>(terminal::make(reference_(start)))
    , name_(name_)
    {}

    std::string name_;

所以你不能。正如文档中所述:

name 是一个可选字符串,它为语法提供了名称,对于调试和错误处理很有用。

因此,您必须根据它进行自己的查找。

It's defined as follows in the source:

    grammar(
        start_type const& start
      , std::string const& name_ = "unnamed-grammar")
    : proto::extends<terminal, base_type>(terminal::make(reference_(start)))
    , name_(name_)
    {}

    std::string name_;

So you can't. As it's stated in the doc:

name is an optional string that gives the grammar its name, useful for debugging and error handling.

So, you'll have to make your own lookup based on it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文