Я работал над синтаксическим анализатором для простого шаблонного языка. Я использую Ragel.
Требования скромны. Я пытаюсь найти [[отмечает]], который может быть встроен где угодно во входной строке.
Я пытаюсь проанализировать простой шаблонный язык, что-то, что может иметь теги, такие как {{нечто}}, встроенное в HTML. Я попробовал несколько подходов для парсинга этого, но должен был обратиться к использованию сканера Ragel и использовать неэффективный подход только соответствия отдельному символу как "выгода все". Я чувствую, что это - неправильный способ пойти об этом. Я по существу злоупотребляю предвзятостью самого длинного соответствия сканера для реализации моего правила по умолчанию (это может только быть 1 символ долго, таким образом, это должно всегда быть последнее средство).
%%{
machine parser;
action start { tokstart = p; }
action on_tag { results << [:tag, data[tokstart..p]] }
action on_static { results << [:static, data[p..p]] }
tag = ('[[' lower+ ']]') >start @on_tag;
main := |*
tag;
any => on_static;
*|;
}%%
(действия, записанные в рубине, но, должно быть легко понять).
Как Вы пошли бы о записи синтаксического анализатора для такого простого языка? Разве Ragel является, возможно, не правильным инструментом? Кажется, что необходимо бороться с зубом Ragel и гвоздями, если синтаксис непредсказуем, такие как это.