Многие наверняка знают, что для HTML и CSS существует отличный инструмент под названием ZenCoding(emmet), который позволяет значительно упростить ввод рутинных языковых конструкций за счет определения специального мнемонического языка.
C# — менее многословный язык, чем Html, но, тем не менее, ввод его конструкций можно значительно оптимизировать.
Предлагаю динамическое расширение идеи мнемотехники, которую я впервые услышал от Дмитрия Нестерука.
1 ].
В результате получился небольшой плагин для ReSharper, мнемонику для которого можно настроить через специальный язык, аналогичный формальной грамматике.
Плагин ReSharper доступен в галерее расширений.
Исходный код для GitHub
Краткое описание
Основная идея ZenSharp — создать язык, в котором можно определить сразу два языка — язык сокращений и соответствующее им полное написание.Весь файл определения сокращений (*.
ltg) состоит из двух частей:
- определения правил (т.е.
что и как во что раскрывается),
- определение сферы применения этих правил.
Я называю такие правила «правилами обрезки».start ::= "expand text"="ex"
Существует три типа правил:
- Определение сокращения.
Состоит из пары строк, определенных как "развернуть"="короткий" Те.
если вы хотите получить аббревиатуру, чтобы введя p вы становились общедоступной, то такое правило объявляется как "публичный"="п"
- Нить.
Просто строка, которая всегда будет использоваться при расширении правила сокращения.
Другими словами, это просто текст, который не зависит от того, какую букву мы используем для сокращения.
Строковое правило аналогично правилу сокращений с пустой строкой сокращений.
- Подстановочный знак.
Специальный тип, который был введен специально для поддержки возможности ввода имени переменной/функции на языке сокращений.
Вы можете использовать два правила по умолчанию для типа и имени переменной.
Синтаксический сахар
В языке шаблонов есть немного сахара:- кронштейны
- знак вопроса после скобок переписывает правило на (x)? => ((x) | "")
- если аббревиатура не содержит специальных символов, то ее можно определить
без кавычек, т.е.
"some"=s, а не "some"="s"
- многострочное определение альтернатив.
Это сделано для удобной записи стартового правила, чтобы не создавать мусор в VCS. начало ::= правило | правилоб это то же самое
start ::= | rulea | ruleb
Объяснение с примерами
Зачем все это нужно, проще объяснить на реальном примере.
Давайте возьмем небольшой
часть стандартных правил: interface ::= access "interface"=i space classBody
class ::= access ("sealed "=s)? ("class"=c | "static class"=C) space classBody
access ::= (internal=i | public=p | private=_ | protected=P) space
classBody ::= identifier "{" cursor "}"
scope "InCSharpTypeAndNamespace" {
start ::= class | interface
}
Предположим, мы внедрили в студии какую-то тарабарщину типа pсSome. Необходимо понять, как будет происходить расширение этого правила, начиная со старта стартового правила.
Это правило определяет две альтернативы — класс или интерфейс.
Грамматика работает по принципу PEG (грамматика синтаксического анализа), т.е.
оператор | — оператор упорядоченного выбора.
Альтернативный класс проверен.
Внутри класс успешно расширяет доступ и принимает первую букву p, расширяясь до расширенного написания «public».
Далее идет ленивая часть «sealed»=s. В нашей абракадабре еще есть часть cSome, и она не подходит к этой части, поэтому пропускаем ее, ничего не убираем из сокращения и не добавляют ничего к раскрытию.
Далее идет альтернатива из класса или статического класса.
Класс нас устраивает, поэтому у нас есть расширение «public class» и короткая строка Some. Правило специального идентификатора берет из аббревиатуры все буквенные символы и переносит их в неизменном виде в длинное написание (это сделано для удобства).
В результате наша тарабарщина pcSome превратилась в публичный класс Some { $END$ }.
Повторюсь, плагин для ReSharper 8.2 доступен в галерее.
Исходный код для github.com/ulex/ZenSharp Это первая из двух запланированных статей.
Я попытался описать внутренности ZenSharp. Во второй статье я расскажу вам немного больше о стандартных шаблонах.
Сам я использую ZenSharp для работы не больше месяца, добавляя время от времени удобные правила.
Буду рад получить ваши отзывы.
Теги: #мнемоника #resharper #генерация кода #формальная грамматика #peg #peg #peg #peg #nemerle #Visual Studio #C++
-
Поезда Расчищают Пути Лазерами
19 Oct, 24 -
Качество Работы Онлайн-Переводчиков
19 Oct, 24