FlexSym
A variable-length symbol token whose UTF-8 bytes can be inline or found in the symbol table.
A FlexSym
begins with a FlexInt
; once this integer has been read, we can evaluate it to determine how to proceed. If the FlexInt is:
- non-negative, it represents a symbol ID. The symbol's associated text can be found in the local symbol table. No more bytes follow.
- negative, the symbol text is encoded as a number of UTF-8 bytes that follow the FlexInt. The number of bytes is calculated by
-1 - flexInt
. (This is because 0 is already in use as SID 0, so text length needs to be offset by 1 to support zero-length text.)
FlexSym
encoding of symbol ID $10
┌─── The leading FlexInt ends in a `1`,
│ no more FlexInt bytes follow.
│
0 0 0 1 0 1 0 1
└─────┬─────┘
2's comp.
positive 10
FlexSym
encoding of symbol text 'hello'
┌─── The leading FlexInt ends in a `1`,
│ no more FlexInt bytes follow.
│ h e l l o
1 1 1 1 0 1 0 1 01101000 01100101 01101100 01101100 01101111
└─────┬─────┘ └─────────────────────┬─────────────────────┘
2's comp. 5-byte UTF-8 encoded "hello"
negative 6
FlexSym
encoding of empty symbol text ''
┌─── The leading FlexInt ends in a `1`,
│ no more FlexInt bytes follow.
│
1 1 1 1 1 1 1 1
└─────┬─────┘
2's comp.
negative 1