simple type language DSL |
|
expression = { ekind object } |
|
ekind = 'true' | 'false' | 'object' | 'calledObject' |
|
object = { name fieldMap } |
|
fieldMap = :map field |
|
field = { name fkind actualParameterList } |
|
fkind = 'map' | 'simple' |
|
actualParameterList = :map expression |
|
name = :string |
|
|
|
construct |
meaning |
expression = { ekind object } |
create a class called “expression” with two fields ‘ekind’ and ‘object’ |
ekind = 'true' | 'false' | 'object' | 'calledObject' |
create enum with 4 possible symbols (true, false, object, calledObject) |
fieldMap = :map field |
create a type called ‘fieldMap’ that can be iterated in order, containing objects of type ‘field’ |
name = :string |
create a string called ‘name’ |
xxx = :bag yyy |
create an object called ‘xxx’ which is an unordered bag of type ‘yyy’ objects |
aaa =| xxx | yyy | zzz |
create a type called ‘aaa’ which can be one of the types ‘xxx’, ‘yyy’ or ‘zzz’ |
|
|
|
|
|
N.B. Every created type has two stacks – I called them ‘input-<xxx>’ and ‘output-<xxx>’, although, in retrospect, the ‘input-<xxx>’ might have been called ‘work-<xxx>’ and, it is arguable if a second stack ‘output-<xxx>’ is needed at all (having 2 stacks made design easier – rhetorical question: is the number of stacks variable? Is 2 the magic number?) |
|
|
|
N.B. see https://github.com/bmfbp/bmfbp/blob/v2emitter/build_process/esa-transpiler/exprtypes.dsl for a full-blown example |
|
|
|
N.B. see https://github.com/guitarvydas/stack-dsl for a full implementation |