Использование грамматики ParseKit для разбора меток времени
У меня довольно простой вопрос о ParseKit и разборе временных меток... как мне заставить форсировать символическую природу точки / периода.
Например, если я пытаюсь разобрать 2008-01-25
Я мог бы использовать что-то вроде date = /\d{4}/ '-' /\d{2}/ '-' /\d{2}/
, На самом деле, есть date.grammar
поставляется с ParseKit, который делает именно это (достаточно интересно, однако, предоставленная грамматика не работает в DemoApp, если вы не добавите @symbolState='-';
но я отвлекся...)
Тем не менее, что мне делать, если я хочу разобрать дату с точками в ней... например, 2008.01.25
или же 2008-01-25-12.34.45
, Я пытался добавить '.'
к @symbolState
директива, но она просто продолжает игнорироваться. Обратите внимание, что я полагаюсь на DemoApp для проверки моих грамматик в данный момент... не уверен, что это имеет какое-то значение.
Любые мысли будут высоко ценится.
2 ответа
Разработчик ParseKit здесь.
Во-первых, спасибо за сообщение об ошибке в date.grammar
файл. Я исправил это.
Что касается вашего основного вопроса, я уверен, что то, что вы пытаетесь сделать, было невозможно с ParseKit до сих пор.
То есть токенизатор ParseKit (PKTokenizer
) не смог произвести только целое число Number
жетоны. Числа всегда маркировались как числа с плавающей точкой, что означает, что было невозможно проанализировать ввод, как 3.14
как три отдельных токена 3
(Число) .
(Условное обозначение) 14
(Число). Скорее это всегда будет обозначено как 3.14
,
Хорошие новости: я добавил эту возможность новым методом:
-[PKNumberState allowsFloatingPoint]
который по умолчанию YES
,
И я добавил соответствующую директиву токенизатора, которую вы можете использовать в своих грамматиках ParseKit, например:
@allowsFloatingPoint = NO;
ПРИМЕЧАНИЕ. Чтобы увидеть эту функцию, вам необходимо получить последнюю версию заголовка соединительной линии в Google Code.
Итак, вот пример грамматики даты, которая делает примерно то, что вы просили с новой функцией:
@symbolState = '.';
@allowsFloatingPoint = NO;
@start = date;
date = year dot month dot day;
year = /\d{4}/;
month = /\d{2}/;
day = /\d{2}/;
dot = '.';
Мне интересно, может ли быть более простой идеей заставить parseKit просто проанализировать дату как строку, а затем передать ее NSDate::dateWithNaturalLanguageString:locale: orNSDate::dateWithNaturalLanguageString: для обработки.