Как проанализировать шаблонные языки в Ragel?

Я работал над синтаксическим анализатором для простого шаблонного языка. Я использую 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 и гвоздями, если синтаксис непредсказуем, такие как это.

9
задан Tobias Lütke 26 July 2010 в 01:24
поделиться