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 этого объекта в методах. Пример