스피릿 파서 프레임워크
Spirit Parser FrameworkSpirit Parser Framework는 템플릿 메타프로그래밍 기법을 사용하여 구현된 객체 지향 재귀 하강 파서 생성기 프레임워크입니다. 식 템플릿을 사용하면 사용자가 확장 백커스-나우어 형식(EBNF)의 구문을 C++로 완전히 근사할 수 있습니다. 파서 객체는 연산자 오버로딩을 통해 구성되며 결과는 다소 모호한 문법을 파싱할 수 있는 역추적 LL(∞) 파서입니다.
스피릿은 렉싱과 구문 분석 모두에 함께 또는 개별적으로 사용할 수 있습니다.
연산자
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"; }
외부 링크
- Spirit Parser 프레임워크 github 페이지
- 스피릿 파서 프레임워크
- Boost 프로젝트의 문서화
- 디자이너 조엘 드 구즈만의 정신에 관한 기사 Dobb's Journal.