Из чего
состоит ЯП?
Токены: литералы,операторы,ключевые слова
Лексический акцептор/анализатор
Синтаксические конструкции: условные операторы,
функции,классы
Синтаксический акцептор/анализатор
Семантика: смысл,который несет в себе код,выраженный в
виде синтаксических конструкций
???
Лексический анализатор
1
1 +
+ 2
2 // [NumericLiteral, PlusToken, NumericLiteral]
// [NumericLiteral, PlusToken, NumericLiteral]
x
x =
= y
y // [Identifier, EqualToken, Idenitifer]
// [Identifier, EqualToken, Idenitifer]
let
let x
x =
= y
y.
.toString
toString(
()
)
/* [
/* [
LetKeyword, Identifier, EqualToken,
LetKeyword, Identifier, EqualToken,
Identifier, DotToken, Identifier,
Identifier, DotToken, Identifier,
OpenParenToken, CloseParenToken
OpenParenToken, CloseParenToken
] */
] */
Шо таки делать если на бэкенде у
вас нет JS?
Поставить nodejs ¯_(ツ)_/¯
Запихнуть рантайм v8 в этот ваш php/kphp
GraalVM?
А что если взять JS и сделать из него PHP?
Допущения и ограничения
Код на выходе не обязан соответствовать коду на входе.
Для скорости можно ставить цель не поддерживать все возможные конструкции языка,т.е.
ограничиться подмножеством языка.
Околостатическая типизация 😨
Что решили?
Используем Typescript compiler API
...Не то что бы был какой-то иной выбор помимо typescript для языка реализации
Инструменты для работы с AST у нас будут из коробки,что приятно
Не пытаемся трансформировать AST,пишем сразу генератор кода
Общая схема генерации кода
yes
no
Start renderNode
is terminal?
Print as text
Custom render logic