Я работаю над тем, чтобы иметь возможность вводить любое сообщение электронной почты и выводить эквивалентную кодировку XML.
Я начинаю с малого, с одного из заголовков электронной почты — «Из заголовка».
Вот пример заголовка From:
From: John Doe <[email protected]>
Я хочу, чтобы он был преобразован в этот XML:
<From>
<Mailbox>
<DisplayName>John Doe</DisplayName>
<Address>[email protected]</Address>
</Mailbox>
</From>
Я хочу использовать лексический анализатор "Алекс" (http://www.haskell.org/alex/doc/html/), чтобы разбить (токенизировать) заголовок From.
Я хочу использовать парсер Happy (http://www.haskell.org/happy/ ) для обработки токенов и создания дерева синтаксического анализа.
Затем я хочу использовать сериализатор для обхода дерева синтаксического анализа и вывода XML.
Формат заголовка From определяется форматом сообщений Интернета (IMF), RFC 5322 (http://tools.ietf.org/html/rfc5322).
Вот еще несколько примеров From Headers и желаемого вывода XML:
Из заголовка без отображаемого имени:
From: <[email protected]>
Желаемый вывод XML:
<From>
<Mailbox>
<Address>[email protected]</Address>
</Mailbox>
</From>
Из заголовка без отображаемого имени и без угловых скобок вокруг адреса:
From: [email protected]
Желаемый вывод XML:
<From>
<Mailbox>
<Address>[email protected]</Address>
</Mailbox>
</From>
Из заголовка с несколькими почтовыми ящиками, разделенными запятой:
From: <[email protected]>, "Simon St. John" <[email protected]>, [email protected]
Желаемый вывод XML:
<From>
<Mailbox>
<Address>[email protected]</Address>
</Mailbox>
<Mailbox>
<DisplayName>Simon St. John</DisplayName>
<Address>[email protected]</Address>
</Mailbox>
<Mailbox>
<Address>[email protected]</Address>
</Mailbox>
</From>
В RFC 5322 говорится, что синтаксис комментария следующий: (…). Вот заголовок From, содержащий комментарий:
From: (this is a comment) "John Doe" <[email protected]>
Я хочу, чтобы все комментарии удалялись во время лексирования.
Желаемый вывод XML таков:
<From>
<Mailbox>
<DisplayName>John Doe</DisplayName>
<Address>[email protected]</Address>
</Mailbox>
</From>
В RFC говорится, что в заголовке From могут быть разбросаны «складывающиеся пробелы». Вот заголовок From с токеном From: в первой строке, отображаемым именем во второй строке и адресом в третьей строке:
From:
"John Doe"
<[email protected]>
На вывод XML не должны влиять сворачивающиеся пробелы:
<From>
<Mailbox>
<DisplayName>John Doe</DisplayName>
<Address>[email protected]</Address>
</Mailbox>
</From>
В RFC сказано, что после символа @ в адресе может быть строка, заключенная в скобки, например такая:
From: "John Doe" <john@[website]>
Я должен признать, что я никогда не видел электронные письма с этим. Тем не менее, RFC говорит, что это разрешено, поэтому я, безусловно, хочу, чтобы мой лексер и парсер обрабатывали такие входные данные. Вот желаемый результат:
<From>
<Mailbox>
<DisplayName>John Doe</DisplayName>
<Address>john@[website]</Address>
</Mailbox>
</From>
Обработка ошибок
Я хочу, чтобы ошибка генерировалась, если заголовок From неверен. Вот пара примеров ошибочных заголовков From и желаемого результата:
Отображаемое имя ошибочно помещено после адреса:
From: <[email protected]> "John Doe"
В выводе должно быть указано место, где была обнаружена ошибка:
serialize: parse error at line 1 and column 22. Error occurred at "John Doe"
В этом заголовке From есть ошибочная цифра "23" перед отображаемым именем:
From: 23 "John Doe" <[email protected]>
Опять же, вывод должен указывать место, где была обнаружена ошибка:
serialize: parse error at line 1 and column 10. Error occurred at "John Doe"
Не могли бы вы показать, как реализовать лексер, парсер и сериализатор?