gpt4 book ai didi

c++ - 如何在不先将整个文件读入内存的情况下使用 Boost::Spirit::Lex 对文件进行 lex?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:46 25 4
gpt4 key购买 nike

我正在研究使用 boost::spirit::lex 编写词法分析器,但我能找到的所有示例似乎都假定您已先将整个文件读入 RAM。我想编写一个不需要整个字符串都在 RAM 中的词法分析器,这可能吗?或者我需要使用其他东西吗?

我尝试使用 istream_iterator,但除非我使用 const char* 作为迭代器类型,否则 boost 会给我一个编译错误。

例如我能找到的所有示例基本上都是这样做的:

lex_functor_type< lex::lexertl::lexer<> > lex_functor;

// assumes entire file is in memory
char const* first = str.c_str();
char const* last = &first[str.size()];

bool r = lex::tokenize(first, last, lex_functor,
boost::bind(lex_callback_functor(), _1, ... ));

此外,是否可以通过某种方式从 lex 标记中确定行号/列号?

谢谢!

最佳答案

只要符合标准正向迭代器的要求,Spirit Lex 就可以与任何迭代器一起使用。这意味着您可以为词法分析器(调用 lex::tokenize())提供任何符合规范的迭代器。例如,如果您想使用 std::istream,您可以将其包装到 boost::spirit::istream_iterator 中:

bool tokenize(std::istream& is, ...)
{
lex_functor_type< lex::lexertl::lexer<> > lex_functor;

boost::spirit::istream_iterator first(is);
boost::spirit::istream_iterator last;

return lex::tokenize(first, last, lex_functor,
boost::bind (lex_callback_functor(), _1, ... ));
}

它会起作用。

对于问题的第二部分(与输入的行/列号相关):是的,可以使用词法分析器跟踪输入位置。但这不是微不足道的。您需要创建自己的 token 类型来存储行/列信息并使用它而不是预定义的 token 类型。许多人一直在要求这个,所以我可能会继续创建一个示例。

关于c++ - 如何在不先将整个文件读入内存的情况下使用 Boost::Spirit::Lex 对文件进行 lex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4715829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com