2010-12-17 3 views
4

내 응용 프로그램의 경우 날짜에 대한 직접적인 설명을 처리 할 수있는 파서가 필요합니다. 올해 12 월 31 일의 새해 이브에 대한 12/31/10이지만,/반복/날짜에 대한 설명도 처리 할 수 ​​있습니다. "매월 첫째 월요일." boost :: date_time에는 이미 날짜 생성기라는 개념이 있지만, 생성되는 생성기의 유형을 모른 채 문자열을 변환하는 일반적인 방법은 제공하지 않는다고 생각합니다.C++에서 되풀이 날짜에 대한 설명을 파싱하려면 라이브러리가 필요합니까?

내가 바퀴를 재발견하기 전에 이미 이렇게할만한 것이 있습니까? 나는 프로그래머가 읽고 이해할 수있는 한 문자열의 정확한 언어로 유연합니다.

답변

0

EBNF에서 직접 문법을 작성한 다음 렉서/파서 생성기를 사용하여 코드 스켈레톤을 만들 수 있습니다.

2

멋진 boost :: spirit 라이브러리를 사용할 수 있습니다.

이렇게하면 이런 종류의 파서를 쉽게 만들 수 있습니다.

+0

+1 영혼은 훌륭한 도서관이며, 그 범위에 겁 먹지 마십시오. 문서와 예제는 매우 유용합니다. –

1

어쩌면 당신은 에서 영감을 얻을 수 있습니다 (단순한 경우에 대해) 합리적으로 이해할 수있는 언어입니다.

0

, 여기에 2011 년 매월 첫 번째 월요일을 출력 코드 this library 사용 :

#include "date.h" 
#include <iostream> 

int main() 
{ 
    using namespace gregorian; 
    std::cout << date_fmt("%A %B %e, %Y"); 
    for (date d = first*mon/jan/2011; d <= dec/31/2011; d += month(1)) 
     std::cout << d << '\n'; 
} 

출력 :

Monday January 3, 2011 
Monday February 7, 2011 
Monday March 7, 2011 
Monday April 4, 2011 
Monday May 2, 2011 
Monday June 6, 2011 
Monday July 4, 2011 
Monday August 1, 2011 
Monday September 5, 2011 
Monday October 3, 2011 
Monday November 7, 2011 
Monday December 5, 2011 

또한 등 세 번째 두 번째를 얻을 수 있습니다, 또는 지난 달의 평일. 산술 연산은 일, 월 또는 연도를 기준으로 할 수 있습니다.

+0

이것은 질문에서 요구하는 것과 정확히 정반대입니다. 그래도 흥미있는 도서관. –

+0

동의. OP의 파서가 빌드되면 파서의 출력을 나타내는 데이 날짜 라이브러리가 유용 할 수 있습니다. –

관련 문제