Generic AST
- Что такое AST
- Зачем оно мне.
- Я хочу написать код один раз и оттранслировать его в coffee, Rust и Java.
- Мне нужно универсальное представление кода. Оно должно быть транслируемо в почти любой императивный ЯП.
- В нём должны быть все базовые конструкции
- В нём должны быть типы (см модуль type)
- В нём должна быть самопроверка что этот AST валидный, а значит код может быть сгенерирован и в нём нет банальных ошибок (типа провтыкали поле в ast заполнить, или вставили не то, или не полностью).
- Что есть в этом модуле
- This. Указатель на instance этого объекта в методах. Пример
@
- Const. Числовая, строковая, булевая константа. Примеры
1
,1.1
,'1'
,true
- Array_init. Примеры
[]
,[1]
- Hash_init. Примеры
{}
,{a:1}
,{a:1, b:1}
.hash
обязан иметь одинаковый тип значений. Можно добавлять, удалять ключи в runtime - Struct_init. Примеры
{a:1}
,{a:1, b:'1'}
.struct
может иметь разный тип полей. Фиксированный набор ключей. - Var. Пример
a
. Использование переменной - Bin_op. Пример
a*b
. - Un_op. Пример
!a
. - Field_access. Пример
a.b
- Fn_call. Пример
a()
,a(b)
- Scope. Блок. Пример тело цикла - это блок.
- If
- Switch
- Loop
- Break
- Continue
- While
- For_range. Пример
for i in [1 .. 10]
,for i in [1 .. 10] by 1
- For_array. Пример
for v in array
,for v,k in array
- For_hash. Пример
for k of hash
,for k,v of hash
- Ret. Пример
return
,return(1)
- Try
- Throw
- Var_decl. Пример
var a:int
- Class_decl
- Fn_decl. Пример
function(a:int):int{return a}
- This. Указатель на instance этого объекта в методах. Пример