> 백엔드 개발 > C++ > Boost Spirit 라이브러리를 사용하여 C에서 부울 표현식을 어떻게 구문 분석할 수 있나요?

Boost Spirit 라이브러리를 사용하여 C에서 부울 표현식을 어떻게 구문 분석할 수 있나요?

Barbara Streisand
풀어 주다: 2024-12-04 05:54:13
원래의
730명이 탐색했습니다.

How can I parse Boolean expressions in C   using the Boost Spirit library?

C의 부울 표현식 파서

소개

부울 표현식 구문 분석은 컴퓨터 과학의 기본 작업입니다. 여기에는 사람이 읽을 수 있는 표현을 컴퓨터가 해석할 수 있는 데이터 구조로 변환하는 작업이 포함됩니다.

Boost Spirit을 사용한 구문 분석

부울 표현식을 구문 분석하는 널리 사용되는 접근 방식 중 하나는 Boost Spirit 라이브러리를 사용하는 것입니다. Spirit은 문법 정의 및 구문 분석을 위한 강력하고 유연한 프레임워크를 제공합니다.

다음은 Spirit을 기반으로 한 C 구현입니다.

#include <boost/spirit/include/qi.hpp>
#include <boost/variant/recursive_wrapper.hpp>

using namespace boost::spirit;
using namespace boost::spirit::qi;

struct op_or  {};
struct op_and {};
struct op_xor {};

typedef std::string var;
template <typename tag> struct binop;
template <typename tag> struct unop;

typedef boost::variant<var,
        boost::recursive_wrapper<unop <op_not> >, 
        boost::recursive_wrapper<binop<op_and> >,
        boost::recursive_wrapper<binop<op_xor> >,
        boost::recursive_wrapper<binop<op_or> >
        > expr;

template <typename tag> struct binop 
{ 
    explicit binop(const expr&amp; l, const expr&amp; r) : oper1(l), oper2(r) { }
    expr oper1, oper2; 
};

template <typename tag> struct unop  
{ 
    explicit unop(const expr&amp; o) : oper1(o) { }
    expr oper1; 
};

template <typename It, typename Skipper = qi::space_type>
    struct parser : qi::grammar<It, expr(), Skipper>
{
    parser() : parser::base_type(expr_)
    {
        using namespace qi;

        expr_  = or_.alias();
        not_ = ("not" > simple       ) [ _val = phx::construct<unop <op_not> >(_1)     ] | simple [ _val = _1 ];
        or_  = (xor_ >> "or"  >> or_ ) [ _val = phx::construct<binop<op_or> >(_1, _2) ] | xor_   [ _val = _1 ];
        xor_ = (and_ >> "xor" >> xor_) [ _val = phx::construct<binop<op_xor> >(_1, _2) ] | and_   [ _val = _1 ];
        and_ = (not_ >> "and" >> and_) [ _val = phx::construct<binop<op_and> >(_1, _2) ] | not_   [ _val = _1 ];

        simple = (('(' > expr_ > ')') | var_);
        var_ = qi::lexeme[ +alpha ];
    }
  private:
    qi::rule<It, var() , Skipper> var_;
    qi::rule<It, expr(), Skipper> not_, and_, xor_, or_, simple, expr_;
};
로그인 후 복사

사용법

파서를 사용하려면:

  1. 파서 인스턴스 생성
  2. 적절한 반복자 및 스키퍼 유형과 함께 부울 표현식을 구문 분석 함수에 전달합니다.
  3. 결과는 구문 분석된 내용을 포함하는 Boost::variant가 됩니다. 표현식.

auto expr = "a and b xor (c and d or a and b);";
expr parsed_expr;
qi::parse(expr.begin(), expr.end(), parser<std::string::const_iterator>(), parsed_expr);
std::cout << "Parsed expression: " << parsed_expr << std::endl;
로그인 후 복사

출력

Parsed expression: ((a and b) xor ((c and d) or (a and b)))
로그인 후 복사

결론

이 구현은 Boost Spirit의 재귀 하강 파서 생성기를 활용하여 구문 분석된 표현식을 나타내는 구문 트리. 우선순위 규칙을 올바르게 처리하여 표현식의 논리적 구조를 정확하게 포착하는 트리가 생성됩니다.

위 내용은 Boost Spirit 라이브러리를 사용하여 C에서 부울 표현식을 어떻게 구문 분석할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿