作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究使用 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/
我是一名优秀的程序员,十分优秀!