> 백엔드 개발 > C++ > Boost Spirit을 사용하여 C에서 부울 표현식을 구문 분석하고 구문 트리를 구성하는 방법은 무엇입니까?

Boost Spirit을 사용하여 C에서 부울 표현식을 구문 분석하고 구문 트리를 구성하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-27 02:56:13
원래의
623명이 탐색했습니다.

How to Parse Boolean Expressions and Construct Syntax Trees in C   using Boost Spirit?

C의 부울 표현식 문법 파서

문제:

다음과 같이 주어진 부울 표현식을 구문 분석합니다. 문자열을 만들고 표현식의 구문 트리를 나타내는 트리를 구성합니다. 트리는 우선 순위 규칙(NOT, AND, XOR, OR)을 따라야 합니다.

답변:

Boost Spirit 사용:

  1. 연산자(NOT, AND, XOR, OR).
  2. 트리 노드를 나타내는 재귀 변형 유형(expr)을 정의합니다.

    • var: 변수 이름
    • unop: 단항 연산자
    • binop: 바이너리 연산자
  3. Boolean 표현식을 구문 분석하기 위해 Boost Spirit Qi를 사용하여 문법을 정의합니다.
  4. 파싱된 표현식을 탐색하고 트리로 인쇄하는 방문자 클래스를 만듭니다.

예시 사용법:

using namespace qi;
using namespace phoenix;

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;

struct parser : grammar<It, expr(), Skipper> {
    parser() : parser::base_type(expr_) {
        not_ = ...
        or_  = ...
        xor_ = ...
        and_ = ...

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

int main() {
    std::string input = "(a and b) xor ((c and d) or (a and b));";
    const char *f = input.c_str(), *l = f + input.size();

    expr result;
    bool ok = phrase_parse(f, l, parser() > ';', qi::space, result);
    if (ok) {
        std::cout << result << '\n';
    }
}
로그인 후 복사

결과:

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

위 내용은 Boost Spirit을 사용하여 C에서 부울 표현식을 구문 분석하고 구문 트리를 구성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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