Mazdaywik / mrefal

Компилятор Модульного Рефала
BSD 2-Clause "Simplified" License
6 stars 0 forks source link

Сырые строки для Модульного Рефала #11

Closed Mazdaywik closed 7 years ago

Mazdaywik commented 7 years ago

Решение задачи #10 предполагает, что нативные вставки будут оформляться как в том числе и литеральные строки Модульного Рефала. Но часто такие вставки будут представлять собой длинные многострочные куски текста на C++. Очевидно, набирать их, учитывая escape-последовательности, завершая строки на \n (ведь хочется, чтобы в целевом коде они тоже были разбиты на строки, довольно утомительно и ненаглядно.

Поэтому предлагается внедрить в язык специальный синтаксис для сырых строк — строковых литералов, которые могут разбиваться на несколько строчек текста, не учитывают escape-последовательности и завершаются особым завершителем.

При этом завершитель должен быть таким, чтобы минимально ограничивать содержимое самой литеральной строки. Плохой пример — Python, где три кавычки запрещают наличие трёх кавычек внутри самой строки. Heredoc’и Perl’а позволяют пользователю самому указать вид завершителя, но при этом завершитель (ЕМНИП) должен начинаться с новой строки, да и сама строка начинается со следующей строки.

Очень неплохой подход демонстрирует Rust — в нём сырые строки имеют вид r"…", r#"…"#, r##"…"## и т.д. То есть, буква r, за которой следует ноль или более решёток, кавычка и сама строка. Завершается строка кавычкой и таким же числом решёток. При этом если мы хотим внутри сырой строки указать, скажем "##, мы можем для ограничителя указать три решётки и конфликта не будет.

Предлагается использовать подход Rust, при этом незначительно изменив его.

Сырые строки в Модульном Рефале будут выглядеть так: @'…'@, @@'…'@@ и т.д. — снаружи кавычек не менее одной собачки, число собачек в начале и конце должно быть одинаковым.