Библиотека для разбора описания повторяющихся дат в C ++? - PullRequest
4 голосов
/ 18 декабря 2010

Для моего приложения мне нужен анализатор, который может обрабатывать прямые описания дат, например, «12/12/10» для кануна Нового года в этом году, но также может обрабатывать описания / повторения / дат, например, «Первый понедельник каждого».Месяц."В boost :: date_time уже есть концепция генераторов дат, но я не думаю, что она предоставляет какой-либо общий способ преобразования строк в них, не зная тип генерируемого генератора.

Прежде чем я пойду и изобрету зановоколесо, уже есть что-то для этого?Я гибко отношусь к точному языку строк, если только непрограммист может читать и понимать.

Ответы [ 4 ]

2 голосов
/ 18 декабря 2010

Вы можете использовать замечательную библиотеку boost :: spirit.

Позволяет легко создавать парсеры для подобных вещей.

1 голос
/ 18 декабря 2010

Может быть, вы можете черпать вдохновение из инструмента remind Ревущего пингвина , который имеет достаточно понятный (для простых случаев) язык.

0 голосов
/ 02 апреля 2011

Используя эту библиотеку , вот код, который печатает первый понедельник каждого месяца 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 голосов
/ 18 декабря 2010

Вы можете написать свою собственную грамматику в EBNF, а затем использовать генератор лексера / парсера для создания скелета кода для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...