> 백엔드 개발 > C++ > 연산자 우선 순위를 고려하여 트리 구조를 생성하기 위해 Boost.Spirit을 사용하여 C에서 부울 표현식을 어떻게 구문 분석할 수 있습니까?

연산자 우선 순위를 고려하여 트리 구조를 생성하기 위해 Boost.Spirit을 사용하여 C에서 부울 표현식을 어떻게 구문 분석할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-25 19:36:13
원래의
572명이 탐색했습니다.

How can we parse Boolean expressions in C   using Boost.Spirit to create a tree structure, respecting operator precedence?

C에서 부울 표현식 구문 분석

소개

연산자 우선 순위 규칙을 존중하면서 부울 표현식을 트리 구조로 변환하는 파서를 만드는 것을 목표로 합니다. (아니요, 그리고 xor, 또는).

토큰화

시작하려면 표현식의 다양한 토큰과 일치하는 정규식을 정의합니다.

  • 변수: 하나 이상의 알파벳 순서 문자
  • 연산자: "and", "or", "xor", "not"
  • 괄호: "(" and ") "
using namespace boost::spirit::qi;
typedef std::string var;
qi::rule<std::string::const_iterator, var(), qi::space_type> var_ = qi::lexeme[+alpha];
qi::rule<std::string::const_iterator, std::string(), qi::space_type> operator_ = 
    keywords("and" | "or" | "xor" | "not");
qi::rule<std::string::const_iterator, char(), qi::space_type> parenthesis_ = qi::char_("()[]");
로그인 후 복사

문법 규칙

그런 다음 토큰을 결합하는 문법 규칙을 정의합니다.

  • 표현식: 괄호로 묶인 표현식, 변수 또는 "not"으로 시작하고 뒤에 오는 표현식
  • 하위 표현식: 우선순위 규칙을 따릅니다(아님, and, xor 또는)
qi::rule<std::string::const_iterator, expr(), qi::space_type> expression_ = (
    '(' >> expression_ >> ')'
) | var_ | operator_ >> expression_;

qi::rule<std::string::const_iterator, expr(), qi::space_type> sub_expression_ = 
    expression_ >> *operator_ >> expression_;
로그인 후 복사

구문 분석

표현식을 구문 분석하기 위해 전체 입력 문자열을 일치시키려는 Boost::spiritphrase_parse 함수를 사용합니다. 문법 규칙.

std::string input = "(a and b) xor (c and d)";
auto it = input.begin();
auto end = input.end();
expr parsed_expression;

bool success = phrase_parse(it, end, expression_, qi::space, parsed_expression);

if (success && it == end) {
    std::cout << "Parse successful!" << std::endl;
} else {
    std::cerr << "Parse failed!" << std::endl;
}
로그인 후 복사

트리 만들기

일단 표현식은 파싱하면 트리 구조를 구성할 수 있습니다. 구현 예는 다음과 같습니다.

typedef std::vector<expr> expr_set;
expr_set nodes;

void create_node(const expr& sub_expr) {
    if (sub_expr.is<std::string>()) {
        nodes.push_back(sub_expr.get<std::string>());
    } else {
        nodes.push_back(expr_set{sub_expr.get<expr_set>()});
    }
}

void build_tree(const expr& root) {
    if (root.is<std::string>()) {
        nodes.push_back(root.get<std::string>());
    } else {
        expr_set sub_expressions = root.get<expr_set>();
        for (const auto& sub_expr : sub_expressions) {
            create_node(sub_expr);
        }
    }
}
로그인 후 복사

사용 예

input = "(a and b) xor (c and d)";
it = input.begin();
end = input.end();

if (phrase_parse(it, end, expression_, qi::space, parsed_expression)) {
    std::cout << "Parse successful!" << std::endl;
    build_tree(parsed_expression);
} else {
    std::cerr << "Parse failed!" << std::endl;
}

for (const auto& node : nodes) {
    std::cout << node << std::endl;
}
로그인 후 복사

출력:

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

위 내용은 연산자 우선 순위를 고려하여 트리 구조를 생성하기 위해 Boost.Spirit을 사용하여 C에서 부울 표현식을 어떻게 구문 분석할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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