/ast4gen

Primary LanguageCoffeeScriptMIT LicenseMIT

ast4gen

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}