Фоновые:Как рубин interperter разбора строк в двойных кавычках
Я реализую язык, похожий на Ruby, called Sapphire, как способ, чтобы попробовать некоторые идеи у меня есть на параллельности в языках программирования. Я пытаюсь скопировать строки с двойными кавычками Ruby со встроенным кодом, который я считаю очень полезным в качестве программиста.
Вопрос:
Как любой из переводчиков Руби превратить строку в двойные кавычки с внедренным кодом в и АСТ?
например:
puts "The value of foo is #{@foo}."
puts "this is an example of unmatched braces in code: #{ foo.go('}') }"
Детали:
У меня есть проблема, как решить, какой }
закрывает блок кода. Блоки кода могут иметь другие брекеты внутри них и с небольшим усилием они могут быть непревзойденными. Лексер может найти начало кодового блока в строке, но без помощи синтаксического анализатора он не может точно знать, какой символ является концом этого блока.
Похоже, что файл parse.y
Ruby делает как шаги лексирования, так и разбора, но reading that thing is a nightmare - это 11628 строк длиной без комментариев и много аббревиатуры.
Кроме того, FWIW, строковые литералы должны решить подобную хитрую задачу: '% Q {{привет}} # => "{} привет"' –
Как сделать heredocs ... –
Алекс, ваш пример даст если вы ввели его в IRB. Ruby закончит строку на первой закрывающей скобке. Вот почему вы можете выбрать свой символ в этой конструкции. т.е.% Q | {hi} | Символом, который открывает конструкцию, является тот, который ее закрывает. Исключениями являются {[(<, которые закрываются на>)]}. –