Вопрос

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

<% ruby_code_here %>
<%= other_ruby_code %>

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

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

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

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

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

Это было полезно?

Решение

Насколько я знаю, никто еще не создал грамматику Treetop для Ruby. (На самом деле никто никогда не смог создать Любые Грамматика для Ruby, кроме грамматики YacC, которая отправляется с МРТ и Ярвом.) Я знаю, что автор Treetop работает на один в течение нескольких лет, но это не тривиальное предприятие. Получение грамматики ANTLR, которая используется в XRUBY право, заняла около 5 лет, и она все еще не полностью соответствует.

Синтаксис Рубина безумно, Mindboggling комплекс.

Другие советы

Нет


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

Фактический Ruby Grammer написан в YACC. Теперь YACC является легендарным инструментом, но Treetop генерирует более мощный класс парсеров, поэтому должно быть возможно, и, возможно, кто-то сделал это.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top