mirror of
https://github.com/boostorg/spirit.git
synced 2026-01-19 04:42:11 +00:00
`filesystem::path::c_str()` on windows returns `wchar_t` while error_handler file parameter is of `std::string` type.
87 lines
2.7 KiB
C++
87 lines
2.7 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2001-2015 Joel de Guzman
|
|
|
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
=============================================================================*/
|
|
#include <iostream>
|
|
#include <iterator>
|
|
#include <algorithm>
|
|
#include <sstream>
|
|
|
|
#include "../rexpr/ast.hpp"
|
|
#include "../rexpr/rexpr.hpp"
|
|
#include "../rexpr/error_handler.hpp"
|
|
#include "../rexpr/config.hpp"
|
|
#include "../rexpr/printer.hpp"
|
|
|
|
#include <boost/spirit/home/x3/support/utility/testing.hpp>
|
|
|
|
namespace fs = boost::filesystem;
|
|
namespace testing = boost::spirit::x3::testing;
|
|
|
|
auto parse = [](std::string const& source, fs::path input_path)-> std::string
|
|
{
|
|
std::stringstream out;
|
|
|
|
using rexpr::parser::iterator_type;
|
|
iterator_type iter(source.begin());
|
|
iterator_type const end(source.end());
|
|
|
|
// Our AST
|
|
rexpr::ast::rexpr ast;
|
|
|
|
// Our error handler
|
|
using boost::spirit::x3::with;
|
|
using rexpr::parser::error_handler_type;
|
|
using rexpr::parser::error_handler_tag;
|
|
error_handler_type error_handler(iter, end, out, input_path.string()); // Our error handler
|
|
|
|
// Our parser
|
|
auto const parser =
|
|
// we pass our error handler to the parser so we can access
|
|
// it later on in our on_error and on_sucess handlers
|
|
with<error_handler_tag>(std::ref(error_handler))
|
|
[
|
|
rexpr::rexpr()
|
|
];
|
|
|
|
// Go forth and parse!
|
|
using boost::spirit::x3::ascii::space;
|
|
bool success = phrase_parse(iter, end, parser, space, ast);
|
|
|
|
if (success)
|
|
{
|
|
if (iter != end)
|
|
error_handler(iter, "Error! Expecting end of input here: ");
|
|
else
|
|
rexpr::ast::rexpr_printer{out}(ast);
|
|
}
|
|
|
|
return out.str();
|
|
};
|
|
|
|
int num_files_tested = 0;
|
|
auto compare = [](fs::path input_path, fs::path expect_path)
|
|
{
|
|
testing::compare(input_path, expect_path, parse);
|
|
++num_files_tested;
|
|
};
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
if (argc < 2)
|
|
{
|
|
std::cout << "usage: " << fs::path(argv[0]).filename() << " path/to/test/files" << std::endl;
|
|
return -1;
|
|
}
|
|
|
|
std::cout << "===================================================================================================" << std::endl;
|
|
std::cout << "Testing: " << fs::absolute(fs::path(argv[1])) << std::endl;
|
|
int r = testing::for_each_file(fs::path(argv[1]), compare);
|
|
if (r == 0)
|
|
std::cout << num_files_tested << " files tested." << std::endl;
|
|
std::cout << "===================================================================================================" << std::endl;
|
|
return r;
|
|
}
|