2010-12-17 13 views
4

私のアプリケーションでは、日付の直接的な記述を処理できるパーサーが必要です。今年の大晦日では「12/31/10」ですが、/繰り返し/日付の説明も処理できます。 「毎月の第一月曜日」。 boost :: date_timeにはすでに日付ジェネレータの概念がありますが、生成されるジェネレータのタイプを知らなくても文字列をそれらに変換する一般的な方法はありません。C++で繰り返し日付の説明を解析するライブラリですか?

私が行ってホイールを再発明する前に、これを行うにはすでに何かがありますか?私は文字列の正確な言葉に柔軟性があります。それはプログラマー以外の人が読んで理解できるものである限りです。

答えて

0

EBNFで独自の文法を書いてから、レクサー/パーサージェネレータを使ってコードスケルトンを作成することができます。

2

素晴らしいboost :: spiritライブラリを使用できます。

これで、このような種類のパーサーを簡単に作成できます。

+0

+1精神は素晴らしい図書館ですが、その範囲で脅かされることはありません。ドキュメンテーションとサンプルは非常に役に立ちます。 –

1

Roaring Penguin's remind toolからインスピレーションを得ることができますが、これは合理的に理解できる(単純なケースでは)言語です。 this libraryを使用して

0

は、ここでは2011年に毎月の最初の月曜日を出力コードは次のとおりです。

#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のパーサが構築されると、おそらくこの日付ライブラリがパーサの出力を表すのに役立ちます。 –

関連する問題