(no subject)
May. 23rd, 2005 05:14 amПо надобности пишу конвертер текста в викиформате в HTML.
Впервые в жизни приходится писать не просто парсер, а pragmatic парсер.
Простой парсер — он исходит из того, что файл, который он обрабатывает, отформатирован верно, вложенность тегов правильная, нужные символы поэскейпены. А pragmatic рассчитан на то, что юзер — раздолбай, и пытается несмотря на криворукость юзера разобрать, что же тот имел ввиду.
Маааааааать пионерия, хоспидябожимой.. Какой это ужас! Оказалось, что писать pragmatic-парсеры в несколько раз сложнее, чем обычные, которые исходят из well-formedness.
К счастью, языком написания оказался Perl, на котором я относительно быстро (пара часов работы) накидал инфраструктуру простеньких таблиц парсинга, которые уменьшают объём работы в несколько раз и повышают прозрачность на порядок.
Лучше бы, конечно, использовать что-нибудь, что поддерживает PEG — то есть, рекурсивные регэкспы. Но их поддерживают, к сожалению, всего две софтины — одна под жабу, другая под хаскел. Ни то, ни другое не пойдёт ввиду специфики задачи.
Спать. Всем доброй ночи.
Впервые в жизни приходится писать не просто парсер, а pragmatic парсер.
Простой парсер — он исходит из того, что файл, который он обрабатывает, отформатирован верно, вложенность тегов правильная, нужные символы поэскейпены. А pragmatic рассчитан на то, что юзер — раздолбай, и пытается несмотря на криворукость юзера разобрать, что же тот имел ввиду.
Маааааааать пионерия, хоспидябожимой.. Какой это ужас! Оказалось, что писать pragmatic-парсеры в несколько раз сложнее, чем обычные, которые исходят из well-formedness.
К счастью, языком написания оказался Perl, на котором я относительно быстро (пара часов работы) накидал инфраструктуру простеньких таблиц парсинга, которые уменьшают объём работы в несколько раз и повышают прозрачность на порядок.
Лучше бы, конечно, использовать что-нибудь, что поддерживает PEG — то есть, рекурсивные регэкспы. Но их поддерживают, к сожалению, всего две софтины — одна под жабу, другая под хаскел. Ни то, ни другое не пойдёт ввиду специфики задачи.
Спать. Всем доброй ночи.