Граємо з ключовими словами в Javascript

image
У статті розповідається про модуль дозволяє створювати підмножина javascript з будь-якими ключовими словами. Строго для нестримного веселощів.
На хвилі статті про rucckuu.js я заздрив і вирішив оприлюднити своє творіння: невелику екосистему для створення довільних підмножин javascript. Якщо до вас давно закрадалася думка про те, що деякі ключові слова погано підходять до контексту їх застосування або думка про те, що javascript занадто багатослівний (всяке буває). Якщо ви хочете добродушно пожартувати над колегами або просто пояснити вашій мамі чим ви займаєтеся на роботі, ласкаво просимо під кат.
Отже, завдання транспиляции сама по собі досить проста — знайти і замінити. Сама ж транспиляция у світі сучасного фронтенда — невід'ємна частина інтеграції нових технологій і специфікацій: всі знають що таке babel або traceur-compiler, так і кожен поважаючий себе фронтенд-розробник час від часу поглядає на розсилку esdiscuss. Блискавичний розвиток нашого стека технологій — це біль і чудо в одному флаконі, тому що від можливостей захоплює дух, а від кількості можливих варіацій виконання у деяких опускаються руки. Дуже пощастило тим, у кого вони опускаються прямо на улюблену або просто потрапила під них клавіатуру. Для таких бравих героїв ця стаття може представляти мало академічного інтересу, тому застерігаю — все нижческазане призначене тільки для задоволення нестримної пристрасті до створення цікавих штук. Так.
Повернувшись до транспиляции, завдання по заміні значень у рядку дуже тривіальна. Проте завдання заміни слів інтегрованих з контекстом вже кілька більш цікава. Не зачіпаючи всі тисячі людино-годин, витрачених на вивчення та створення теоретичної бази для створення парсера різних граматик, перейдемо відразу до найголовнішого. Граматика мови програмування дуже чітко визначає контекст використання того чи іншого ключового слова і це можна буде трактувати тільки одним певним способом. Такий детермінізм випливає з самої суті програм, я впевнений що немає нікого, хто хотів би бачити два різних результату виконання однієї і тієї ж програми при однакових початкових умовах. Виходячи з цього — будь-яка програма може бути інтерпретована як вельми певний синтаксичне дерево. Отже, для мов програмування досить просто приборкати синтаксичного монстра і отримати однозначне визначення контексту використання будь-якого слова. Маючи на руках контекст — можна робити буквально що завгодно.
Я думаю, багато хто чув про esprima, парсер ECMAScript. Трохи менше людей знають про jison. Без першого ми б не побачили jsx так скоро, а другий зобов'язаний своїй появі CoffeeScript, обидва інструменту досить потужні, але esprima спеціалізується якраз на те, що ми хочемо зробити — поміняти зовнішній вигляд наших програм.
Скупе вступ закінчено, до справи.

Створюємо MeowScript

  • node
    ,
    npm
    на мою думку не викликають у вас жаху
  • npm i your-script
    в будь-яку зручну директорію
  • заглянемо в
    node_modules/your-script/lexems
  • створимо файл
    meowscript.lex
  • відкриємо
    javascript.lex
    з тієї ж папки де-небудь неподалік
  • meowscript.lex
    замінимо визначення ключових слів на зразок:
VAR meow
LET meoww
CONST meOw
FOR meowwr
...

  • any-name.js
meowScript = new translator({
to: 'meowscript'
});

let output = meowScript.parse(`
var kitty = new Kitty(); if (kitty.isHungry()) {kitty.feed()}
`, {
from: 'javascript',
to: 'meowscript'
});

console.log(output);

// stdout:
// meow kitty = MEW Kitty(); meeow (kitty.isHungry()) {kitty.feed()}

загалом, все.
Область застосування модуля обмежена вашою уявою. Під капотом знаходиться якраз esprima, яку я вже згадував, з тим винятком, що ця версія пропатчена (вручну і з любов'ю) для того, щоб підтримувати довільний набір ключових слів. Промовчу про обсяг праці, який довелося пройти, щоб вручну знайти всі hardcoded використання і замінити їх на коректні референси. Після цього довелося лише додати завантажувач для підтримки довільній заміни наборів ключових слів під час виконання. Робота досить проста, але кропітка.
Крім цього в комплекті упакований примітивний keyword провайдер з самим примітивним парсером
.lex
. Всі модулі валяються у вільному доступі і доступні для штурхання усіма бажаючими
Фактично, з цим набором інструментів можна створювати довільні підмножини javascript протягом декількох хвилин. Єдине обмеження — нездатність модуля знаходити стандартні інтерфейси ноди або браузера. Так що на жаль, document.body.getBoundingClientRect, панове. Додати підтримку транспиляции інтерфейсів теж не так складно, потрібно лише визначити правила проходження identifiers і здійснювати заміну згідно з ним.
Наостанок, картинка в хедері поста невипадкова, як приклад використання your-script, я написав redscript — російське підмножина javascript. Ну і як наслідок використання цього парсера:
var стр = 'var';

буде коректно транспилировано в:
нехай с = 'var';

Сам модуль валяється npm. Для затравки, приклад транспилированной програми:
функція функ(ікс, ігрек, зет) { 
приймемо = 0; 
приймемо ікс = {0: "нуль", 1: ""}; 
приймемо функ = функція () { 
} 
якщо (!і > 10) { 
(приймемо j = 0; j < 10; j++) { 
перемикач (j) { 
положення 0: 
значення = "zero"; 
стоп; 
положення 1: 
значення = "one"; 
стоп; 
} 
приймемо = джей > 5 ? "ГТ 5" : "ЛЕ 5";
} 
} інакше { 
приймемо джей = 0; 
спробуй { 
поки джей < 10) { 
if (і == джей || джей > 5) { 
a[джей] = і + джей * 12; 
} 
і = (джей << 2) & 4; 
джей++; 
} 
роби { 
джей--; 
} поки джей > 0) 
} лови (e) { 
alert("Крах: " + e.message); 
} потім { 
обнулити(a, i); 
} 
} 
} 

В цілях реклами, це поки єдиний модуль, який дозволяє вам зробити
лови (крах) {
КрахДетектор(крах);
}

У цілому, придумувати альтернативи ключовими словами — шалено цікаво. Якщо придумаєте щось круте — залиште будь-ласка в коментарях. Всім гарних вихідних і багато-багато, нескінченно багато задоволення від того що ви робите :)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.