bablr-lang / agast-vm

A VM providing DOM-like guarantees about agAST trees
MIT License
1 stars 0 forks source link

@bablr/agast-vm

The agAST VM provides consistency guarantees when with CSTML documents to parse or transform code. It has no language-specific functionality of any kind. Instead it acts as a streaming traversal engine for CSTML.

API

The VM responds to several instructions, but its primary API is advance(token), where token may be a OpenNodeTag, CloseNodeTag, Literal, Reference, or Gap.

The VM requires the basic invariants of CSTML to be followed, for example that Reference must be followed by either a OpenNodeTag or a Gap. In fact, agast-vm is the reference implementation of these invariants.

The VM supports branch(), accept(), and reject() instructions, which allow a series of instructions to have their effects applied or discarded together in a kind of transaction.

Finally the VM supports bindAttribute(key, value). A node's attributes start unbound, and this command is used to give them values. Once all declared attributes for a node are bound, that node's full start tag is known and can be emitted.

Here are the basic types used by the VM:

type Token = OpenNodeTag | CloseNodeTag | Literal | Reference | Gap;

type OpenNodeTag {
  type: 'OpenNodeTag',
  value: {
    flags: {
      token: boolean,
      trivia: boolean,
      escape: boolean
    },
    language: string | null,
    type: string | null, // null type indicates a fragment
    attributes: { [key: string]: boolean | number | string }
  }
}

type CloseNodeTag {
  type: 'CloseNodeTag',
  value: {
    language: string,
    type: string,
  }
}

type Literal {
  value: string
}

type Reference {
  type: 'Reference',
  value: {
    name: string,
    isArray: boolean
  }
}

type Gap {
  type: 'Gap',
  value: null,
}