распознавать код Ruby в грамматике Treetop - PullRequest
8 голосов
/ 29 октября 2010

Я пытаюсь использовать 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 ]

11 голосов
/ 30 октября 2010

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

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

2 голосов
/ 29 октября 2010

Нет


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

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

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

1 голос
/ 31 октября 2010

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

0 голосов
/ 06 мая 2015

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

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

...