C의 부울 표현식 문법 파서
문제:
다음과 같이 주어진 부울 표현식을 구문 분석합니다. 문자열을 만들고 표현식의 구문 트리를 나타내는 트리를 구성합니다. 트리는 우선 순위 규칙(NOT, AND, XOR, OR)을 따라야 합니다.
답변:
Boost Spirit 사용:
트리 노드를 나타내는 재귀 변형 유형(expr)을 정의합니다.
예시 사용법:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!