구문 또는 문장을 읽고 일정/타이밍 정보를 구문 분석 할 문자열 구문 분석기를 작성하고 있습니다. 예를 들어, 입력 문구를C# 동의어가있는 핵심 구문 구문 분석
"하루에 두 번"이 포함될 수 있습니다
또는
"ON 월요일, 수요일, 금요일"
목표는 시작일과 종료일이 주어지면 DateTimes
의 목록으로 변환 할 수있는 템플릿을 만드는 것입니다. 이 템플리트를 Func<DateTime, bool>
으로 저장하는 방법에 대해 생각해 보았습니다.
이전 예제는 아마도 (d => d.TimeOfDay == TimeSpan.FromHours(8) || d.TimeOFDay == TimeSpan.FromHours(18))
으로 해석 될 수 있습니다.
후자의 예는 (d => d.TimeOfDay == TimeSpan.FromHours(8) && (d.DayOfWeek == Monday || d.DayOfWeek == Wednesday || d.DayOfWeek == Friday))
으로 해석 될 수 있습니다.
그런 다음 함수가 true를 반환하면 시작 및 종료 날짜 사이의 각 시간을 반복하고 일정에 시간을 추가 할 수 있습니다.
내가 처리해야 할 문제는 구문 분석입니다. 나의 현재 해결책은 내가 생각할 수있는 모든 문구와 적절한 필터를 값으로 사용하여 사전을 만드는 것이다. 그러나 이것은 매우 혼란스럽고 지속될 수없는 것으로 보입니다. 특히 중복되는 양이 많습니다.
var phrases = new Dictionary<string, Func<DateTime, bool>>()
{
{ "DAILY", (d => true) },
{ "A DAY", (d => true) },
{ "PER DAY", (d => true) },
{ "EVERY DAY", (d => true) },
{ "SUNDAY", (d => d.DayOfWeek == DayOfWeek.Sunday) },
{ "SUN", (d => d.DayOfWeek == DayOfWeek.Sunday) },
{ "MONDAY", (d => d.DayOfWeek == DayOfWeek.Monday) },
{ "MON", (d => d.DayOfWeek == DayOfWeek.Monday) },
. . .
}
더 좋은 방법은 뭔가요?
자연어 처리를 살펴볼 수 있습니다. –
DFA (결정 성 유한 오토마타)를 작성/구현하는 것이 도움이 될 것입니다. 당신은 "시작 상태"에서 시작한 다음 문장의 각 단어를 검토하고 그 문장이 어떤 "종류"의 문장에 영향을 주는지에 따라 새로운 상태로 (또는 현재 문장으로) 전환합니다. 당신은 이러한 전환에 대한 규칙을 생각해 내야 할 것입니다. –
다음을 확인하십시오 : http://www.codeproject.com/Articles/38553/TaskScheduler –