연산자 우선 순위 규칙을 존중하면서 부울 표현식을 트리 구조로 변환하는 파서를 만드는 것을 목표로 합니다. (아니요, 그리고 xor, 또는).
시작하려면 표현식의 다양한 토큰과 일치하는 정규식을 정의합니다.
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_("()[]");
그런 다음 토큰을 결합하는 문법 규칙을 정의합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!