스피릿 파서 프레임워크

Spirit Parser Framework

Spirit Parser Framework는 템플릿 메타프로그래밍 기법을 사용하여 구현된 객체 지향 재귀 하강 파서 생성기 프레임워크입니다. 식 템플릿을 사용하면 사용자가 확장 백커스-나우어 형식(EBNF)의 구문을 C++로 완전히 근사할 수 있습니다. 파서 객체는 연산자 오버로딩을 통해 구성되며 결과는 다소 모호한 문법을 파싱할 수 있는 역추적 LL() 파서입니다.

스피릿은 렉싱과 구문 분석 모두에 함께 또는 개별적으로 사용할 수 있습니다.

프레임워크는 Boost 라이브러리의 일부입니다.

연산자

C++ 언어의 한계 때문에 Spirit의 구문은 EBNF정규 표현식 모두와 유사하면서도 C++의 연산자 우선순위를 중심으로 설계되었습니다.

통사법 설명.
x >> y x 다음에 y를 매치합니다.
x > y x를 맞추면 y를 예상합니다.
*x x를 0회 이상 반복합니다. 이것은 Kleene star를 나타냅니다. C++에는 단항 후정 연산자 *가 없습니다.
x y x를 맞추십시오. x가 일치하지 않으면 y를 맞추십시오.
+x 하나 이상의 x 출현과 일치합니다.
-x x 0 또는 1회 일치합니다.
x & y x와 y를 맞추세요.
x - y x를 맞추되 not.
x ^ y 임의의 순서로 x, y, 또는 둘 다 일치시킵니다.
x y x, 또는 y, 또는 x 다음에 y를 연결합니다.
x [ function_expression ] x가 일치하는 경우 function_expression으로 반환된 함수/함수를 실행합니다.
( x ) 일치 x(우선순위 그룹화에 사용 가능)
x % y 하나 이상의 x 발생을 y 발생으로 구분하여 일치시킵니다.
~x x를 제외한 모든 항목과 일치합니다(ch_p 또는 alnum_p와 같은 문자 클래스에만 해당).

이 예제에서는 의미 동작과 함께 인라인 파서 식을 사용하는 방법을 보여 줍니다.

# <끈> # <아이오스트림> # <부스트/spirit/include/qi.hpp> # <부스트/spirit/include/phoenix.hpp>   인트의 주된() {   네임스페이스  = 힘을 북돋아 주는::정신::;    std::끈의 인풋의;     std::꾸트 << "줄 입력: \n";   선을 긋다(std::정강이의, 인풋의);   std::꾸트 << "알았어요" << 인풋의 << "'.\n";     서명이 없는 세어보세요 = 0;   /*         다음으로 입력을 파싱합니다(input.c_str()).       다음 의미론으로 구성된 파서를 사용합니다.         ()의 발생 횟수가 0회 이상인 경우           리터럴 문자열 "cat"(일치되면 카운터 "count"를 증분)       또는 문자( 생략될 문자)       )       파서는 연산자 오버로딩을 사용하여 컴파일러에 의해 구성됩니다.      템플릿 일치, 따라서 실제 작업은 qi:: parse(), 및      *로 시작하는 식은 구문 분석하는 규칙 개체만 초기화합니다.      함수 사용.    */   오토 규칙. = *(::불을 켰다.("고양이") [ ++::_val ]   ::생략하다[::촤_]);   ::파싱하다(인풋의.시작한다.(), 인풋의.끝.(), 규칙., 세어보세요);       // 마지막으로 결과를 보여줍니다.   std::꾸트 << "입력된 내용이 포함되었습니다." << 세어보세요 << " 고양이의 출현\n"; } 

외부 링크