2017-11-02 13 views
1

다음 프로그램이 원본에서 축소되었습니다. 실행시 분할 오류가 발생합니다. ArithmeticUnaryExpression으로 24 행을 제거하면 프로그램이 더 이상 충돌하지 않습니다. 세분화 오류를 제거하려면 어떻게해야합니까?중첩 된 부스트에 대한 분할 오류 :: 변형

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 
#include <boost/spirit/home/x3/support/ast/variant.hpp> 
#include <boost/spirit/include/qi_expect.hpp> 
#include <boost/spirit/home/x3/directive/expect.hpp> 

#include <iostream> 
#include <string> 

namespace wctl_parser { 

namespace x3 = boost::spirit::x3; 
namespace ascii = x3::ascii; 
namespace qi = boost::spirit::qi; 

using x3::ulong_; 
using x3::lexeme; 

//--- Ast structures 
struct ArithmeticUnaryExpression; 
using AtomicProp = std::string; 

using ArithmeticExpression = x3::variant< 
    x3::forward_ast<ArithmeticUnaryExpression>, 
    unsigned long 
>; 

struct ArithmeticUnaryExpression { 
    std::string op; 
    ArithmeticExpression operand; 
}; 

using Expression = x3::variant< 
    ArithmeticExpression 
>; 

template <typename T> auto rule = [](const char* name = typeid(T).name()) { 
    struct _{}; 
    return x3::rule<_, T> {name}; 
}; 

template <typename T> auto as = [](auto p) { return rule<T>() = p; }; 

//--- Rules 

x3::rule<struct aTrivRule, ArithmeticExpression> aTriv("aTriv"); 
x3::rule<struct exprRule, Expression> expr("expression"); 

auto const aTriv_def = rule<ArithmeticExpression>("aTriv") 
    = ulong_ 
// | '(' > expr > ')' 
    ; 

auto const primitive = rule<Expression>("primitive") 
    = aTriv 
    ; 

auto const expr_def 
    = primitive 
    ; 

BOOST_SPIRIT_DEFINE(aTriv) 
BOOST_SPIRIT_DEFINE(expr) 

auto const entry = x3::skip(ascii::space) [expr]; 

} //End namespace 

int main() { 

    std::string str("prop"); 
    namespace x3 = boost::spirit::x3; 
    wctl_parser::Expression root; 
    auto iter = str.begin(); 
    auto end = str.end(); 
    bool r = false; 
    r = parse(iter, end, wctl_parser::entry, root); 
    if (r) { 
     std::cout << "Parses OK:" << std::endl << str << std::endl; 
     if (iter != end) std::cout << "Partial match" << std::endl; 
     std::cout << std::endl << "----------------------------\n"; 
    } 
    else { 
     std::cout << "!! Parsing failed:" << std::endl << str << std::endl << std::endl << "----------------------------\n"; 
    } 
    return 0; 
} 

답변

2

귀하의 변형

using ArithmeticExpression = x3::variant< 
    x3::forward_ast<ArithmeticUnaryExpression>, 
    unsigned long 
>; 

는 첫 번째 요소 유형으로 기본 - 구성합니다. 첫 번째 요소 유형은 기본값으로 구성된 ArithmeticExpression을 포함합니다. 이미 문제를 볼 수 있습니까?

그냥 기본 구성 상태는 무한 재귀으로 이어질하지 않도록 :

using ArithmeticExpression = x3::variant< 
    unsigned long, 
    x3::forward_ast<ArithmeticUnaryExpression> 
>;