获取当前行提升精神语法
Get current line in boost spirit grammar
我正在尝试使用提升精神获取我正在解析的文件的当前行。我创建了一个语法类和我的结构来解析我的命令。我还想跟踪在哪一行找到该命令,并将其解析到我的结构中。我已经将我的 istream 文件迭代器包装在一个 multi_pass 迭代器中,然后将其包装在一个 boost::spirit::classic::p osition_iterator2 中。在我的语法规则中,我将如何获得迭代器的当前位置,或者这是不可能的?
更新:它类似于该问题,但我只需要能够保留所有处理的行的计数。我不需要执行解决方案中完成的所有额外缓冲。
更新:它类似于该问题,但我只需要能够保留所有处理的行的计数。我不需要执行解决方案中完成的所有额外缓冲。
保留所有已处理行的计数与"获取当前行"几乎不同。
简单拍摄
如果这是您需要的,只需在解析后检查它:
活在魔杖盒上
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_line_pos_iterator.hpp>
#include <fstream>
#include <set>
namespace qi = boost::spirit::qi;
int main() {
using It = boost::spirit::istream_iterator;
std::ifstream ifs("main.cpp");
boost::spirit::line_pos_iterator<It> f(It(ifs >> std::noskipws)), l;
std::set<std::string> words;
if (qi::phrase_parse(f, l, *qi::lexeme[+qi::graph], qi::space, words)) {
std::cout << "Parsed " << words.size() << " words";
if (!words.empty())
std::cout << " (from '" << *words.begin() << "' to '" << *words.rbegin() << "')";
std::cout << "nLast line processed: " << boost::spirit::get_line(f) << "n";
}
}
指纹
Parsed 50 words (from '"' to '}')
Last line processed: 22
稍微复杂一点的拍摄
如果你说"不,等等,我确实想在解析时获取当前行/"。真正的完整蒙蒂在这里:
- 提升::来自语义动作的精神访问位置迭代器
这是使用iter_pos
完全精简的版本:
活在魔杖盒上
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/support_line_pos_iterator.hpp>
#include <boost/spirit/repository/include/qi_iter_pos.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <fstream>
#include <map>
namespace qi = boost::spirit::qi;
namespace qr = boost::spirit::repository::qi;
using LineNum = size_t;
struct line_number_f {
template <typename It> LineNum operator()(It it) const { return get_line(it); }
};
static boost::phoenix::function<line_number_f> line_number_;
int main() {
using Underlying = boost::spirit::istream_iterator;
using It = boost::spirit::line_pos_iterator<Underlying>;
qi::rule<It, LineNum()> line_no = qr::iter_pos [ qi::_val = line_number_(qi::_1) ];
std::ifstream ifs("main.cpp");
It f(Underlying{ifs >> std::noskipws}), l;
std::multimap<LineNum, std::string> words;
if (qi::phrase_parse(f, l, +(line_no >> qi::lexeme[+qi::graph]), qi::space, words)) {
std::cout << "Parsed " << words.size() << " words.n";
if (!words.empty()) {
auto& first = *words.begin();
std::cout << "First word: '" << first.second << "' (in line " << first.first << ")n";
auto& last = *words.rbegin();
std::cout << "Last word: '" << last.second << "' (in line " << last.first << ")n";
}
std::cout << "Line 20 contains:n";
auto p = words.equal_range(20);
for (auto it = p.first; it != p.second; ++it)
std::cout << " - '" << it->second << "'n";
}
}
印刷:
Parsed 166 words.
First word: '#include' (in line 1)
Last word: '}' (in line 46)
Line 20 contains:
- 'int'
- 'main()'
- '{'
相关文章:
- 1d 智能指针不适用于语法 (*)++
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 如何获取std::result_of函数的返回类型
- 很好的语法来获取对向量/数组数据的大小引用?
- c++ 获取非语法使用"&"创建指针
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 为什么用于获取有关名称的输入的语法不起作用?
- 使用 liblua 获取 Lua 语法树
- 语法在C 11中获取功能指针
- 获取错误makefile:45:条件中的语法无效.停止
- 获取语法和意外令牌错误,任何人都知道原因
- 获取当前行提升精神语法
- 如何更改UNIX语法以获取正确的输出
- 获取0:1(1):错误:语法错误,尝试编译着色器时意外$end
- c++中获取所有权和释放对象的语法指南
- 用于获取nothrow运算符new地址的C++语法