I
a : Type
, Type : Type 1
, Type 1 : Type 2
и т.д.женерики/хкт ортогональны, это средства универсальной квантификации, с какой бы аксиоматикой их не рассматривать
Size: a a a
I
a : Type
, Type : Type 1
, Type 1 : Type 2
и т.д.(
КР
I
(
I
(
I
(
(
I
I
I
I
class Arithmetics : Grammar<Int>() {Скобки вокруг лямбд можно будет скоро убрать. И вынести их в отдельные переменные, главное, чтобы типы сошлись. А вот если я захочу, ну я не знаю, дерево выражений строить - баста, копипаст.
override val TOP = ::additive
fun additive(): R<Int> =
on(::multiplicative)('+' I '-')(::multiplicative)({ a, op, b ->
if (op == '+') a + b else a - b
})
fun multiplicative(): R<Int> =
on(::grouping)('*' I '/' I '%')(::grouping)({ a, op, b ->
when (op) {
'*' -> a * b
'/' -> a / b
'%' -> a % b
else -> error("unreachable")
}
})
fun grouping(): R<Int> =
on('(')(::additive)(')')({ _, a, _ -> a }) I
on(::literal)({ a -> a })
fun literal(): R<Int> =
on(('0'..'9').oneOrMore())({ a -> a.toInt() })
}
I
class Arithmetics : Grammar<Int>() {Скобки вокруг лямбд можно будет скоро убрать. И вынести их в отдельные переменные, главное, чтобы типы сошлись. А вот если я захочу, ну я не знаю, дерево выражений строить - баста, копипаст.
override val TOP = ::additive
fun additive(): R<Int> =
on(::multiplicative)('+' I '-')(::multiplicative)({ a, op, b ->
if (op == '+') a + b else a - b
})
fun multiplicative(): R<Int> =
on(::grouping)('*' I '/' I '%')(::grouping)({ a, op, b ->
when (op) {
'*' -> a * b
'/' -> a / b
'%' -> a % b
else -> error("unreachable")
}
})
fun grouping(): R<Int> =
on('(')(::additive)(')')({ _, a, _ -> a }) I
on(::literal)({ a -> a })
fun literal(): R<Int> =
on(('0'..'9').oneOrMore())({ a -> a.toInt() })
}
I
I
I
(
class Arithmetics : Grammar<Int>() {Скобки вокруг лямбд можно будет скоро убрать. И вынести их в отдельные переменные, главное, чтобы типы сошлись. А вот если я захочу, ну я не знаю, дерево выражений строить - баста, копипаст.
override val TOP = ::additive
fun additive(): R<Int> =
on(::multiplicative)('+' I '-')(::multiplicative)({ a, op, b ->
if (op == '+') a + b else a - b
})
fun multiplicative(): R<Int> =
on(::grouping)('*' I '/' I '%')(::grouping)({ a, op, b ->
when (op) {
'*' -> a * b
'/' -> a / b
'%' -> a % b
else -> error("unreachable")
}
})
fun grouping(): R<Int> =
on('(')(::additive)(')')({ _, a, _ -> a }) I
on(::literal)({ a -> a })
fun literal(): R<Int> =
on(('0'..'9').oneOrMore())({ a -> a.toInt() })
}