Распознавать код Ruby в грамматике Treetop

Я пытаюсь использовать Treetop для анализа файла ERB. Мне нужно уметь обрабатывать строки, подобные следующим:

<% ruby_code_here %>
<%= other_ruby_code %>

Поскольку Treetop написан на Ruby, а вы пишете грамматики Treetop на Ruby, в Treetop уже есть какой-то способ сказать: "эй, ищи здесь код Ruby и дай мне его разбивку", без необходимости выписывать отдельные правила для обработки. все части языка Ruby? Я ищу способ, в моем .treetop файл грамматики, чтобы иметь что-то вроде:

rule erb_tag
  "<%" ruby_code "%>" {
    def content
      ...
    end
  }
end

куда ruby_code обрабатывается некоторыми правилами, которые предоставляет Treetop.

Изменить: кто-то еще разобрал ERB с помощью Ruby-lex, но я получил ошибки, пытаясь воспроизвести то, что он сделал. Программа rlex не создала полный класс, когда она генерировала класс синтаксического анализатора.

Редактировать: правильно, так что вы много удручаете, но спасибо за информацию.:) Для моего магистерского проекта я пишу генератор тестовых примеров, который должен работать с ERB в качестве входных данных. К счастью, для моих целей мне нужно только распознать несколько вещей в коде ERB, таких как if операторы и другие условия, а также циклы. Я думаю, что могу придумать грамматику Treetop, чтобы соответствовать этому, с оговоркой, что она не завершена для Ruby.

4 ответа

Решение

Насколько я знаю, никто еще не создал грамматику Treetop для Ruby. (На самом деле, никто никогда не мог создать какую-либо грамматику для Ruby, кроме грамматики YACC, которая поставляется с MRI и YARV.) Я знаю, что автор Treetop работал над одной в течение нескольких лет, но это не тривиальная задача, Получение грамматики ANTLR, которая используется в XRuby, заняло около 5 лет, и она до сих пор не полностью соответствует требованиям.

Синтаксис Руби безумно, ошеломительно сложен.

нет


Я так не думаю. Определение сложной и тонкой грамматики Ruby в treetop было бы большим достижением, но это должно быть возможно.

Фактический рубиновый грамматик написан на yacc. Теперь yacc - легендарный инструмент, но treetop генерирует более мощный класс синтаксических анализаторов, поэтому это должно быть возможно, и, возможно, кто-то это сделал.

Это не дневной проект.

Может быть, я шучу, но если yacc менее сложен, чем ruby, вы можете реализовать yacc в treetop, который использует грамматику ruby, созданную для yacc.

Для ваших целей вы, вероятно, можете уйти, не разбирая весь Ruby. Что вам действительно нужно, так это способ определения%>, который закрывает блок Ruby. Если вы никогда не хотите потерпеть неудачу, когда код Ruby содержит эти закрывающие символы, вы должны обнаружить, где эти символы могут появляться внутри текста Ruby; Это означает, что вам нужно обнаружить все формы литералов.

Однако для ваших целей вы, вероятно, можете избежать распознавания наиболее вероятных случаев, когда%> встречается в тексте Ruby, и игнорировать только эти случаи. Это предполагает, конечно, что любой оставшийся сбой может быть обработан, если ваш пользователь напишет ERB немного по-другому.

Для чего бы то ни было, сам Treetop таким образом "разбирает" блоки Ruby; он просто считает {и} символов, пока не будет найден закрывающий. Так что, если ваш блок содержит символ} в строковой строке, вы разбиты (но вы можете обойти это, включив соответствующий элемент в комментарий).

Другие вопросы по тегам