blob: 8daf2e60683372b4701868b2720c868cf6f2f851 [file] [log] [blame]
// Copyright 2017 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
package token
// MaxIntBits is the largest size (in bits) of the i8, u8, i16, u16, etc.
// integer types.
const MaxIntBits = 64
// ID is a token type. Every identifier (in the programming language sense),
// keyword, operator and literal has its own ID.
//
// Some IDs are built-in: the "func" keyword always has the same numerical ID
// value. Others are mapped at runtime. For example, the ID value for the
// "foobar" identifier (e.g. a variable name) is looked up in a Map.
type ID uint32
// Str returns a string form of x.
func (x ID) Str(m *Map) string { return m.ByID(x) }
func (x ID) AmbiguousForm() ID {
if x >= ID(len(ambiguousForms)) {
return 0
}
return ambiguousForms[x]
}
func (x ID) UnaryForm() ID {
if x >= ID(len(unaryForms)) {
return 0
}
return unaryForms[x]
}
func (x ID) BinaryForm() ID {
if x >= ID(len(binaryForms)) {
return 0
}
return binaryForms[x]
}
func (x ID) AssociativeForm() ID {
if x >= ID(len(associativeForms)) {
return 0
}
return associativeForms[x]
}
func (x ID) IsBuiltIn() bool { return x < nBuiltInIDs }
func (x ID) IsUnaryOp() bool { return minOp <= x && x <= maxOp && unaryForms[x] != 0 }
func (x ID) IsBinaryOp() bool { return minOp <= x && x <= maxOp && binaryForms[x] != 0 }
func (x ID) IsAssociativeOp() bool { return minOp <= x && x <= maxOp && associativeForms[x] != 0 }
func (x ID) IsLiteral(m *Map) bool {
if x < nBuiltInIDs {
return minBuiltInLiteral <= x && x <= maxBuiltInLiteral
} else if s := m.ByID(x); s != "" {
return !alpha(s[0])
}
return false
}
func (x ID) IsNumLiteral(m *Map) bool {
if x < nBuiltInIDs {
return minBuiltInNumLiteral <= x && x <= maxBuiltInNumLiteral
} else if s := m.ByID(x); s != "" {
return numeric(s[0])
}
return false
}
// IsDQStrLiteral returns whether x is a double-quote string literal.
func (x ID) IsDQStrLiteral(m *Map) bool {
if x < nBuiltInIDs {
return false
} else if s := m.ByID(x); s != "" {
return s[0] == '"'
}
return false
}
// IsSQStrLiteral returns whether x is a single-quote string literal.
func (x ID) IsSQStrLiteral(m *Map) bool {
if x < nBuiltInIDs {
return false
} else if s := m.ByID(x); s != "" {
return s[0] == '\''
}
return false
}
func (x ID) IsIdent(m *Map) bool {
if x < nBuiltInIDs {
return minBuiltInIdent <= x && x <= maxBuiltInIdent
} else if s := m.ByID(x); s != "" {
return alpha(s[0])
}
return false
}
func (x ID) IsTightLeft() bool { return x < ID(len(isTightLeft)) && isTightLeft[x] }
func (x ID) IsTightRight() bool { return x < ID(len(isTightRight)) && isTightRight[x] }
func (x ID) IsAssign() bool { return minAssign <= x && x <= maxAssign }
func (x ID) IsBuiltInCPUArch() bool { return minBuiltInCPUArch <= x && x <= maxBuiltInCPUArch }
func (x ID) IsBuiltInCPUArchARMNeon() bool {
return minBuiltInCPUArchARMNeon <= x && x <= maxBuiltInCPUArchARMNeon
}
func (x ID) IsCannotAssignTo() bool { return minCannotAssignTo <= x && x <= maxCannotAssignTo }
func (x ID) IsClose() bool { return minClose <= x && x <= maxClose }
func (x ID) IsKeyword() bool { return minKeyword <= x && x <= maxKeyword }
func (x ID) IsNumType() bool { return minNumType <= x && x <= maxNumType }
func (x ID) IsNumTypeOrIdeal() bool { return minNumTypeOrIdeal <= x && x <= maxNumTypeOrIdeal }
func (x ID) IsRangeType() bool { return minRangeType <= x && x <= maxRangeType }
func (x ID) IsRectType() bool { return minRectType <= x && x <= maxRectType }
func (x ID) IsOpen() bool { return minOpen <= x && x <= maxOpen }
func (x ID) IsImplicitSemicolon(m *Map) bool {
return x.IsClose() || x.IsKeyword() || x.IsIdent(m) || x.IsLiteral(m)
}
func (x ID) IsXOp() bool { return minXOp <= x && x <= maxXOp }
func (x ID) IsXUnaryOp() bool { return minXOp <= x && x <= maxXOp && unaryForms[x] != 0 }
func (x ID) IsXBinaryOp() bool { return minXOp <= x && x <= maxXOp && binaryForms[x] != 0 }
func (x ID) IsXAssociativeOp() bool { return minXOp <= x && x <= maxXOp && associativeForms[x] != 0 }
func (x ID) IsEtcUtility() bool {
if (minBuiltInCPUArch <= x) && (x <= maxBuiltInCPUArch) {
switch x {
case IDARMCRC32Utility,
IDARMNeonUtility,
IDX86SSE42Utility,
IDX86AVX2Utility:
return true
}
}
return x == IDUtility
}
// QID is a qualified ID, such as "foo.bar". QID[0] is "foo"'s ID and QID[1] is
// "bar"'s. QID[0] may be 0 for a plain "bar".
type QID [2]ID
func (x QID) IsZero() bool { return x == QID{} }
func (x QID) LessThan(y QID) bool {
if x[0] != y[0] {
return x[0] < y[0]
}
return x[1] < y[1]
}
// Str returns a string form of x.
func (x QID) Str(m *Map) string {
if x[0] != 0 {
return m.ByID(x[0]) + "." + m.ByID(x[1])
}
return m.ByID(x[1])
}
// QQID is a double-qualified ID, such as "receiverPkg.receiverName.funcName".
type QQID [3]ID
func (x QQID) IsZero() bool { return x == QQID{} }
func (x QQID) LessThan(y QQID) bool {
if x[0] != y[0] {
return x[0] < y[0]
}
if x[1] != y[1] {
return x[1] < y[1]
}
return x[2] < y[2]
}
// Str returns a string form of x.
func (x QQID) Str(m *Map) string {
if x[0] != 0 {
return m.ByID(x[0]) + "." + m.ByID(x[1]) + "." + m.ByID(x[2])
}
if x[1] != 0 {
return m.ByID(x[1]) + "." + m.ByID(x[2])
}
return m.ByID(x[2])
}
func (x QQID) QIDSuffix() QID {
return QID{x[1], x[2]}
}
// Token combines an ID and the line number it was seen.
type Token struct {
ID ID
Line uint32
}
// nBuiltInIDs is the number of built-in IDs. The packing is:
// - 0x00 is invalid.
// - 0x01 ..= 0x0F are squiggly punctuation, such as ";", "." and "?".
// - 0x10 ..= 0x1F are squiggly bookends, such as "(", ")" and "]".
// - 0x20 ..= 0x3F are squiggly assignments, such as "=" and "+=".
// - 0x40 ..= 0x6F are operators, such as "+", "==" and "not".
// - 0x70 ..= 0xAF are x-ops (disambiguation forms): unary vs binary "+".
// - 0xB0 ..= 0xCF are keywords, such as "if" and "return".
// - 0xD0 ..= 0xDF are type modifiers, such as "ptr" and "slice".
// - 0xE0 ..= 0xFF are literals, such as "ok" and "true".
// - 0x100 ..= 0x3FF are identifiers, such as "bool", "u32" and "read_u8".
//
// Squiggly means a sequence of non-alpha-numeric bytes, such as "+" and "&=".
const (
nBuiltInSymbolicIDs = ID(0xB0) // 176
nBuiltInIDs = ID(0x400) // 1024
)
const (
IDInvalid = ID(0x00)
IDSemicolon = ID(0x01)
IDDot = ID(0x02)
IDDotDot = ID(0x03)
IDDotDotEq = ID(0x04)
IDComma = ID(0x05)
IDExclam = ID(0x06)
IDQuestion = ID(0x07)
IDColon = ID(0x08)
)
const (
minOpen = 0x10
maxOpen = 0x17
IDOpenParen = ID(0x10)
IDOpenBracket = ID(0x11)
IDOpenCurly = ID(0x12)
IDOpenDoubleCurly = ID(0x13)
minClose = 0x18
maxClose = 0x1F
IDCloseParen = ID(0x18)
IDCloseBracket = ID(0x19)
IDCloseCurly = ID(0x1A)
IDCloseDoubleCurly = ID(0x1B)
)
const (
minAssign = 0x20
maxAssign = 0x3F
IDPlusEq = ID(0x20)
IDMinusEq = ID(0x21)
IDStarEq = ID(0x22)
IDSlashEq = ID(0x23)
IDShiftLEq = ID(0x24)
IDShiftREq = ID(0x25)
IDAmpEq = ID(0x26)
IDPipeEq = ID(0x27)
IDHatEq = ID(0x28)
IDPercentEq = ID(0x29)
IDTildeModPlusEq = ID(0x30)
IDTildeModMinusEq = ID(0x31)
IDTildeModStarEq = ID(0x32)
IDTildeModShiftLEq = ID(0x34)
IDTildeSatPlusEq = ID(0x38)
IDTildeSatMinusEq = ID(0x39)
IDEq = ID(0x3E)
IDEqQuestion = ID(0x3F)
)
const (
minOp = 0x40
minAmbiguousOp = 0x40
maxAmbiguousOp = 0x6F
minXOp = 0x70
maxXOp = 0xAF
maxOp = 0xAF
IDPlus = ID(0x40)
IDMinus = ID(0x41)
IDStar = ID(0x42)
IDSlash = ID(0x43)
IDShiftL = ID(0x44)
IDShiftR = ID(0x45)
IDAmp = ID(0x46)
IDPipe = ID(0x47)
IDHat = ID(0x48)
IDPercent = ID(0x49)
IDTildeModPlus = ID(0x50)
IDTildeModMinus = ID(0x51)
IDTildeModStar = ID(0x52)
IDTildeModShiftL = ID(0x54)
IDTildeSatPlus = ID(0x58)
IDTildeSatMinus = ID(0x59)
IDNotEq = ID(0x60)
IDLessThan = ID(0x61)
IDLessEq = ID(0x62)
IDEqEq = ID(0x63)
IDGreaterEq = ID(0x64)
IDGreaterThan = ID(0x65)
IDAnd = ID(0x68)
IDOr = ID(0x69)
IDAs = ID(0x6A)
IDNot = ID(0x6F)
// The IDXFoo IDs are not returned by the tokenizer. They are used by the
// ast.Node ID-typed fields to disambiguate e.g. unary vs binary plus.
IDXBinaryPlus = ID(0x70)
IDXBinaryMinus = ID(0x71)
IDXBinaryStar = ID(0x72)
IDXBinarySlash = ID(0x73)
IDXBinaryShiftL = ID(0x74)
IDXBinaryShiftR = ID(0x75)
IDXBinaryAmp = ID(0x76)
IDXBinaryPipe = ID(0x77)
IDXBinaryHat = ID(0x78)
IDXBinaryPercent = ID(0x79)
IDXBinaryTildeModPlus = ID(0x80)
IDXBinaryTildeModMinus = ID(0x81)
IDXBinaryTildeModStar = ID(0x82)
IDXBinaryTildeModShiftL = ID(0x84)
IDXBinaryTildeSatPlus = ID(0x88)
IDXBinaryTildeSatMinus = ID(0x89)
IDXBinaryNotEq = ID(0x90)
IDXBinaryLessThan = ID(0x91)
IDXBinaryLessEq = ID(0x92)
IDXBinaryEqEq = ID(0x93)
IDXBinaryGreaterEq = ID(0x94)
IDXBinaryGreaterThan = ID(0x95)
IDXBinaryAnd = ID(0x98)
IDXBinaryOr = ID(0x99)
IDXBinaryAs = ID(0x9A)
IDXAssociativePlus = ID(0xA0)
IDXAssociativeStar = ID(0xA1)
IDXAssociativeAmp = ID(0xA2)
IDXAssociativePipe = ID(0xA3)
IDXAssociativeHat = ID(0xA4)
IDXAssociativeAnd = ID(0xA5)
IDXAssociativeOr = ID(0xA6)
IDXUnaryPlus = ID(0xAC)
IDXUnaryMinus = ID(0xAD)
IDXUnaryNot = ID(0xAF)
)
const (
minKeyword = 0xB0
maxKeyword = 0xCF
IDAssert = ID(0xB0)
IDBreak = ID(0xB1)
IDChoose = ID(0xB2)
IDChoosy = ID(0xB3)
IDConst = ID(0xB4)
IDContinue = ID(0xB5)
IDElse = ID(0xB6)
IDFunc = ID(0xB7)
IDIOBind = ID(0xB8)
IDIOForgetHistory = ID(0xB9)
IDIOLimit = ID(0xBA)
IDIf = ID(0xBB)
IDImplements = ID(0xBC)
IDInv = ID(0xBD)
IDIterate = ID(0xBE)
IDPost = ID(0xBF)
IDPre = ID(0xC0)
IDPri = ID(0xC1)
IDPub = ID(0xC2)
IDReturn = ID(0xC3)
IDStruct = ID(0xC4)
IDUse = ID(0xC5)
IDVar = ID(0xC6)
IDVia = ID(0xC7)
IDWhile = ID(0xC8)
IDYield = ID(0xC9)
)
const (
minTypeModifier = 0xD0
maxTypeModifier = 0xDF
IDArray = ID(0xD0)
IDNptr = ID(0xD1)
IDPtr = ID(0xD2)
IDRoarray = ID(0xD3)
IDRoslice = ID(0xD4)
IDRotable = ID(0xD5)
IDSlice = ID(0xD6)
IDTable = ID(0xD7)
)
const (
minBuiltInLiteral = 0xE0
minBuiltInNumLiteral = 0xF0
maxBuiltInNumLiteral = 0xFF
maxBuiltInLiteral = 0xFF
IDFalse = ID(0xE0)
IDTrue = ID(0xE1)
IDNothing = ID(0xE2)
IDNullptr = ID(0xE3)
IDOk = ID(0xE4)
ID0 = ID(0xF0)
)
const (
minBuiltInIdent = 0x100
minCannotAssignTo = 0x100
maxCannotAssignTo = 0x102
minNumTypeOrIdeal = 0x10F
minNumType = 0x110
maxNumType = 0x117
maxNumTypeOrIdeal = 0x117
minRangeType = 0x130
maxRangeType = 0x133
minRectType = 0x134
maxRectType = 0x135
maxBuiltInIdent = 0x3FF
// -------- 0x100 block.
IDArgs = ID(0x100)
IDCoroutineResumed = ID(0x101)
IDThis = ID(0x102)
IDR1 = ID(0x104)
IDT1 = ID(0x105)
IDT2 = ID(0x106)
IDRho1 = ID(0x107)
IDDagger1 = ID(0x108)
IDDagger2 = ID(0x109)
IDQNonNullptr = ID(0x10A)
IDQNullptr = ID(0x10B)
IDQPackage = ID(0x10C)
IDQPlaceholder = ID(0x10D)
IDQTypeExpr = ID(0x10E)
// It is important that IDQIdeal is right next to the IDI8..IDU64 block.
// See the ID.IsNumTypeOrIdeal method.
IDQIdeal = ID(0x10F)
IDI8 = ID(0x110)
IDI16 = ID(0x111)
IDI32 = ID(0x112)
IDI64 = ID(0x113)
IDU8 = ID(0x114)
IDU16 = ID(0x115)
IDU32 = ID(0x116)
IDU64 = ID(0x117)
IDBitvec128 = ID(0x118)
IDBitvec256 = ID(0x119)
IDOptionalU63 = ID(0x11C)
IDBase = ID(0x120)
IDBool = ID(0x121)
IDEmptyIOReader = ID(0x122)
IDEmptyIOWriter = ID(0x123)
IDEmptyStruct = ID(0x124)
IDMoreInformation = ID(0x125)
IDIOReader = ID(0x126)
IDIOWriter = ID(0x127)
IDStatus = ID(0x128)
IDTokenReader = ID(0x129)
IDTokenWriter = ID(0x12A)
IDUtility = ID(0x12B)
IDRangeIEU32 = ID(0x130)
IDRangeIIU32 = ID(0x131)
IDRangeIEU64 = ID(0x132)
IDRangeIIU64 = ID(0x133)
IDRectIEU32 = ID(0x134)
IDRectIIU32 = ID(0x135)
IDFrameConfig = ID(0x150)
IDImageConfig = ID(0x151)
IDPixelBlend = ID(0x152)
IDPixelBuffer = ID(0x153)
IDPixelConfig = ID(0x154)
IDPixelFormat = ID(0x155)
IDPixelSwizzler = ID(0x156)
IDDecodeFrameOptions = ID(0x158)
IDCanUndoByte = ID(0x160)
IDCountSince = ID(0x161)
IDHistoryLength = ID(0x162)
IDHistoryPosition = ID(0x163)
IDIsClosed = ID(0x164)
IDMark = ID(0x165)
IDMatch15 = ID(0x166)
IDMatch31 = ID(0x167)
IDMatch7 = ID(0x168)
IDPosition = ID(0x169)
IDSince = ID(0x16A)
IDSkip = ID(0x16B)
IDSkipU32 = ID(0x16C)
IDSkipU32Fast = ID(0x16D)
IDCopyFromSlice = ID(0x170)
IDLimitedCopyU32FromHistory = ID(0x171)
IDLimitedCopyU32FromHistory8ByteChunksDistance1Fast = ID(0x172)
IDLimitedCopyU32FromHistory8ByteChunksDistance1FastReturnCusp = ID(0x173)
IDLimitedCopyU32FromHistory8ByteChunksFast = ID(0x174)
IDLimitedCopyU32FromHistory8ByteChunksFastReturnCusp = ID(0x175)
IDLimitedCopyU32FromHistoryFast = ID(0x176)
IDLimitedCopyU32FromHistoryFastReturnCusp = ID(0x177)
IDLimitedCopyU32FromReader = ID(0x178)
IDLimitedCopyU32FromSlice = ID(0x179)
IDLimitedCopyU32ToSlice = ID(0x17A)
// -------- 0x180 block.
IDUndoByte = ID(0x180)
IDReadU8 = ID(0x181)
IDReadU8AsU16 = ID(0x185)
IDReadU16BE = ID(0x186)
IDReadU16LE = ID(0x187)
IDReadU8AsU32 = ID(0x189)
IDReadU16BEAsU32 = ID(0x18A)
IDReadU16LEAsU32 = ID(0x18B)
IDReadU24BEAsU32 = ID(0x18C)
IDReadU24LEAsU32 = ID(0x18D)
IDReadU32BE = ID(0x18E)
IDReadU32LE = ID(0x18F)
IDReadU8AsU64 = ID(0x191)
IDReadU16BEAsU64 = ID(0x192)
IDReadU16LEAsU64 = ID(0x193)
IDReadU24BEAsU64 = ID(0x194)
IDReadU24LEAsU64 = ID(0x195)
IDReadU32BEAsU64 = ID(0x196)
IDReadU32LEAsU64 = ID(0x197)
IDReadU40BEAsU64 = ID(0x198)
IDReadU40LEAsU64 = ID(0x199)
IDReadU48BEAsU64 = ID(0x19A)
IDReadU48LEAsU64 = ID(0x19B)
IDReadU56BEAsU64 = ID(0x19C)
IDReadU56LEAsU64 = ID(0x19D)
IDReadU64BE = ID(0x19E)
IDReadU64LE = ID(0x19F)
// --------
IDPeekUndoByte = ID(0x1A0)
IDPeekU8 = ID(0x1A1)
IDPeekU8At = ID(0x1A2)
IDPeekU8AsU16 = ID(0x1A5)
IDPeekU16BE = ID(0x1A6)
IDPeekU16LE = ID(0x1A7)
IDPeekU8AsU32 = ID(0x1A9)
IDPeekU16BEAsU32 = ID(0x1AA)
IDPeekU16LEAsU32 = ID(0x1AB)
IDPeekU24BEAsU32 = ID(0x1AC)
IDPeekU24LEAsU32 = ID(0x1AD)
IDPeekU32BE = ID(0x1AE)
IDPeekU32LE = ID(0x1AF)
IDPeekU8AsU64 = ID(0x1B1)
IDPeekU16BEAsU64 = ID(0x1B2)
IDPeekU16LEAsU64 = ID(0x1B3)
IDPeekU24BEAsU64 = ID(0x1B4)
IDPeekU24LEAsU64 = ID(0x1B5)
IDPeekU32BEAsU64 = ID(0x1B6)
IDPeekU32LEAsU64 = ID(0x1B7)
IDPeekU40BEAsU64 = ID(0x1B8)
IDPeekU40LEAsU64 = ID(0x1B9)
IDPeekU48BEAsU64 = ID(0x1BA)
IDPeekU48LEAsU64 = ID(0x1BB)
IDPeekU56BEAsU64 = ID(0x1BC)
IDPeekU56LEAsU64 = ID(0x1BD)
IDPeekU64BE = ID(0x1BE)
IDPeekU64LE = ID(0x1BF)
IDPeekU64LEAt = ID(0x1C0)
// --------
IDWriteU8 = ID(0x1C1)
IDWriteU16BE = ID(0x1C2)
IDWriteU16LE = ID(0x1C3)
IDWriteU24BE = ID(0x1C4)
IDWriteU24LE = ID(0x1C5)
IDWriteU32BE = ID(0x1C6)
IDWriteU32LE = ID(0x1C7)
IDWriteU40BE = ID(0x1C8)
IDWriteU40LE = ID(0x1C9)
IDWriteU48BE = ID(0x1CA)
IDWriteU48LE = ID(0x1CB)
IDWriteU56BE = ID(0x1CC)
IDWriteU56LE = ID(0x1CD)
IDWriteU64BE = ID(0x1CE)
IDWriteU64LE = ID(0x1CF)
// --------
IDPokeU8 = ID(0x1D1)
IDPokeU16BE = ID(0x1D2)
IDPokeU16LE = ID(0x1D3)
IDPokeU24BE = ID(0x1D4)
IDPokeU24LE = ID(0x1D5)
IDPokeU32BE = ID(0x1D6)
IDPokeU32LE = ID(0x1D7)
IDPokeU40BE = ID(0x1D8)
IDPokeU40LE = ID(0x1D9)
IDPokeU48BE = ID(0x1DA)
IDPokeU48LE = ID(0x1DB)
IDPokeU56BE = ID(0x1DC)
IDPokeU56LE = ID(0x1DD)
IDPokeU64BE = ID(0x1DE)
IDPokeU64LE = ID(0x1DF)
// --------
IDWriteU8Fast = ID(0x1E1)
IDWriteU16BEFast = ID(0x1E2)
IDWriteU16LEFast = ID(0x1E3)
IDWriteU24BEFast = ID(0x1E4)
IDWriteU24LEFast = ID(0x1E5)
IDWriteU32BEFast = ID(0x1E6)
IDWriteU32LEFast = ID(0x1E7)
IDWriteU40BEFast = ID(0x1E8)
IDWriteU40LEFast = ID(0x1E9)
IDWriteU48BEFast = ID(0x1EA)
IDWriteU48LEFast = ID(0x1EB)
IDWriteU56BEFast = ID(0x1EC)
IDWriteU56LEFast = ID(0x1ED)
IDWriteU64BEFast = ID(0x1EE)
IDWriteU64LEFast = ID(0x1EF)
// --------
IDWriteSimpleTokenFast = ID(0x1F1)
IDWriteExtendedTokenFast = ID(0x1F2)
// -------- 0x200 block.
IDAdvance = ID(0x200)
IDCPUArch = ID(0x201)
IDCPUArchIs32Bit = ID(0x202)
IDInitialize = ID(0x203)
IDLength = ID(0x204)
IDLikely = ID(0x205)
IDReset = ID(0x206)
IDSet = ID(0x207)
IDUnlikely = ID(0x208)
IDUnroll = ID(0x209)
IDUpdate = ID(0x20A)
// TODO: range/rect methods like intersection and contains?
IDHighBits = ID(0x220)
IDLowBits = ID(0x221)
IDMax = ID(0x222)
IDMin = ID(0x223)
IDIsError = ID(0x230)
IDIsOK = ID(0x231)
IDIsSuspension = ID(0x232)
IDBulkLoadHostEndian = ID(0x238)
IDBulkMemset = ID(0x239)
IDBulkSaveHostEndian = ID(0x23A)
IDData = ID(0x240)
IDHeight = ID(0x241)
IDIO = ID(0x242)
IDLimit = ID(0x243)
IDPrefix = ID(0x244)
IDRowU32 = ID(0x245)
IDStride = ID(0x246)
IDSubtable = ID(0x247)
IDSuffix = ID(0x248)
IDUintptrLow12Bits = ID(0x249)
IDValidUTF8Length = ID(0x24A)
IDWidth = ID(0x24B)
IDLimitedSwizzleU32InterleavedFromReader = ID(0x280)
IDSwizzleInterleavedFromReader = ID(0x281)
// -------- 0x300 block.
minBuiltInCPUArch = 0x300
minBuiltInCPUArchARMNeon = 0x30E
maxBuiltInCPUArchARMNeon = 0x38F
maxBuiltInCPUArch = 0x3AF
// If adding more CPUArch utility types, also update IsEtcUtility.
IDARMCRC32 = ID(0x300)
IDARMCRC32Utility = ID(0x301)
IDARMCRC32U32 = ID(0x302)
IDARMNeon = ID(0x30E)
IDARMNeonUtility = ID(0x30F)
// ARM Neon D register (64-bit double-word) types.
IDARMNeonU8x8 = ID(0x310)
IDARMNeonU16x4 = ID(0x311)
IDARMNeonU32x2 = ID(0x312)
IDARMNeonU64x1 = ID(0x313)
// ARM Neon Q register (128-bit quad-word) types.
IDARMNeonU8x16 = ID(0x320)
IDARMNeonU16x8 = ID(0x321)
IDARMNeonU32x4 = ID(0x322)
IDARMNeonU64x2 = ID(0x323)
IDX86SSE42 = ID(0x390)
IDX86SSE42Utility = ID(0x391)
IDX86AVX2 = ID(0x392)
IDX86AVX2Utility = ID(0x393)
IDX86BMI2 = ID(0x394)
IDX86M128I = ID(0x3A0)
IDX86M256I = ID(0x3A1)
)
var builtInsByID = [nBuiltInIDs]string{
IDSemicolon: ";",
IDDot: ".",
IDDotDot: "..",
IDDotDotEq: "..=",
IDComma: ",",
IDExclam: "!",
IDQuestion: "?",
IDColon: ":",
IDOpenParen: "(",
IDOpenBracket: "[",
IDOpenCurly: "{",
IDOpenDoubleCurly: "{{",
IDCloseParen: ")",
IDCloseBracket: "]",
IDCloseCurly: "}",
IDCloseDoubleCurly: "}}",
IDPlusEq: "+=",
IDMinusEq: "-=",
IDStarEq: "*=",
IDSlashEq: "/=",
IDShiftLEq: "<<=",
IDShiftREq: ">>=",
IDAmpEq: "&=",
IDPipeEq: "|=",
IDHatEq: "^=",
IDPercentEq: "%=",
IDTildeModPlusEq: "~mod+=",
IDTildeModMinusEq: "~mod-=",
IDTildeModStarEq: "~mod*=",
IDTildeModShiftLEq: "~mod<<=",
IDTildeSatPlusEq: "~sat+=",
IDTildeSatMinusEq: "~sat-=",
IDEq: "=",
IDEqQuestion: "=?",
IDPlus: "+",
IDMinus: "-",
IDStar: "*",
IDSlash: "/",
IDShiftL: "<<",
IDShiftR: ">>",
IDAmp: "&",
IDPipe: "|",
IDHat: "^",
IDPercent: "%",
IDTildeModPlus: "~mod+",
IDTildeModMinus: "~mod-",
IDTildeModStar: "~mod*",
IDTildeModShiftL: "~mod<<",
IDTildeSatPlus: "~sat+",
IDTildeSatMinus: "~sat-",
IDNotEq: "<>",
IDLessThan: "<",
IDLessEq: "<=",
IDEqEq: "==",
IDGreaterEq: ">=",
IDGreaterThan: ">",
IDAnd: "and",
IDOr: "or",
IDAs: "as",
IDNot: "not",
IDAssert: "assert",
IDBreak: "break",
IDChoose: "choose",
IDChoosy: "choosy",
IDConst: "const",
IDContinue: "continue",
IDElse: "else",
IDFunc: "func",
IDIOBind: "io_bind",
IDIOForgetHistory: "io_forget_history",
IDIOLimit: "io_limit",
IDIf: "if",
IDImplements: "implements",
IDInv: "inv",
IDIterate: "iterate",
IDPost: "post",
IDPre: "pre",
IDPri: "pri",
IDPub: "pub",
IDReturn: "return",
IDStruct: "struct",
IDUse: "use",
IDVar: "var",
IDVia: "via",
IDWhile: "while",
IDYield: "yield",
IDArray: "array",
IDNptr: "nptr",
IDPtr: "ptr",
IDRoarray: "roarray",
IDRoslice: "roslice",
IDRotable: "rotable",
IDSlice: "slice",
IDTable: "table",
IDFalse: "false",
IDTrue: "true",
IDNothing: "nothing",
IDNullptr: "nullptr",
IDOk: "ok",
ID0: "0",
// -------- 0x100 block.
IDArgs: "args",
IDCoroutineResumed: "coroutine_resumed",
IDThis: "this",
// Some of the next few IDs are never returned by the tokenizer, as it
// rejects non-ASCII input. The string representations "¶", "ℤ" etc. are
// specifically non-ASCII so that no user-defined (non built-in) identifier
// will conflict with them.
// IDRhoN and IDDaggerN are used by the type checker as placeholder
// built-in IDs to represent generic 1-dimensional (slice) or 2-dimensional
// (table) types. The Rho flavor is read-only.
IDR1: "R1",
IDT1: "T1",
IDT2: "T2",
IDRho1: "ρ", // U+03C1 GREEK SMALL LETTER RHO
IDDagger1: "†", // U+2020 DAGGER
IDDagger2: "‡", // U+2021 DOUBLE DAGGER
// IDQNonNullptr is used by the type checker to build an artificial MType
// for function pointers.
IDQNonNullptr: "«NonNullptr»",
// IDQNullptr is used by the type checker to build an artificial MType for
// the nullptr literal.
IDQNullptr: "«Nullptr»",
// IDQPackage is used by the type checker to build an artificial MType for
// used (imported) packages.
IDQPackage: "«Package»",
// IDQPlaceholder is used by the type checker to build an artificial MType
// for AST nodes that aren't expression nodes or type expression nodes,
// such as struct definition nodes and statement nodes. Its presence means
// that the node is type checked.
IDQPlaceholder: "«Placeholder»",
// IDQTypeExpr is used by the type checker to build an artificial MType for
// type expression AST nodes.
IDQTypeExpr: "«TypeExpr»",
// IDQIdeal is used by the type checker to build an artificial MType for
// ideal integers (in mathematical terms, the integer ring ℤ), as opposed
// to a realized integer type whose range is restricted. For example, the
// base.u16 type is restricted to [0x0000, 0xFFFF].
IDQIdeal: "«Ideal»",
// Change MaxIntBits if a future update adds an i128 or u128 type.
IDI8: "i8",
IDI16: "i16",
IDI32: "i32",
IDI64: "i64",
IDU8: "u8",
IDU16: "u16",
IDU32: "u32",
IDU64: "u64",
IDBitvec128: "bitvec128",
IDBitvec256: "bitvec256",
IDOptionalU63: "optional_u63",
IDBase: "base",
IDBool: "bool",
IDEmptyIOReader: "empty_io_reader",
IDEmptyIOWriter: "empty_io_writer",
IDEmptyStruct: "empty_struct",
IDMoreInformation: "more_information",
IDIOReader: "io_reader",
IDIOWriter: "io_writer",
IDStatus: "status",
IDTokenReader: "token_reader",
IDTokenWriter: "token_writer",
IDUtility: "utility",
IDRangeIEU32: "range_ie_u32",
IDRangeIIU32: "range_ii_u32",
IDRangeIEU64: "range_ie_u64",
IDRangeIIU64: "range_ii_u64",
IDRectIEU32: "rect_ie_u32",
IDRectIIU32: "rect_ii_u32",
IDFrameConfig: "frame_config",
IDImageConfig: "image_config",
IDPixelBlend: "pixel_blend",
IDPixelBuffer: "pixel_buffer",
IDPixelConfig: "pixel_config",
IDPixelFormat: "pixel_format",
IDPixelSwizzler: "pixel_swizzler",
IDDecodeFrameOptions: "decode_frame_options",
IDCanUndoByte: "can_undo_byte",
IDCountSince: "count_since",
IDHistoryLength: "history_length",
IDHistoryPosition: "history_position",
IDIsClosed: "is_closed",
IDMark: "mark",
IDMatch15: "match15",
IDMatch31: "match31",
IDMatch7: "match7",
IDPosition: "position",
IDSince: "since",
IDSkip: "skip",
IDSkipU32: "skip_u32",
IDSkipU32Fast: "skip_u32_fast",
IDCopyFromSlice: "copy_from_slice",
IDLimitedCopyU32FromHistory: "limited_copy_u32_from_history",
IDLimitedCopyU32FromHistory8ByteChunksDistance1Fast: "limited_copy_u32_from_history_8_byte_chunks_distance_1_fast",
IDLimitedCopyU32FromHistory8ByteChunksDistance1FastReturnCusp: "limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp",
IDLimitedCopyU32FromHistory8ByteChunksFast: "limited_copy_u32_from_history_8_byte_chunks_fast",
IDLimitedCopyU32FromHistory8ByteChunksFastReturnCusp: "limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp",
IDLimitedCopyU32FromHistoryFast: "limited_copy_u32_from_history_fast",
IDLimitedCopyU32FromHistoryFastReturnCusp: "limited_copy_u32_from_history_fast_return_cusp",
IDLimitedCopyU32FromReader: "limited_copy_u32_from_reader",
IDLimitedCopyU32FromSlice: "limited_copy_u32_from_slice",
IDLimitedCopyU32ToSlice: "limited_copy_u32_to_slice",
// -------- 0x180 block.
IDUndoByte: "undo_byte",
IDReadU8: "read_u8",
IDReadU8AsU16: "read_u8_as_u16",
IDReadU16BE: "read_u16be",
IDReadU16LE: "read_u16le",
IDReadU8AsU32: "read_u8_as_u32",
IDReadU16BEAsU32: "read_u16be_as_u32",
IDReadU16LEAsU32: "read_u16le_as_u32",
IDReadU24BEAsU32: "read_u24be_as_u32",
IDReadU24LEAsU32: "read_u24le_as_u32",
IDReadU32BE: "read_u32be",
IDReadU32LE: "read_u32le",
IDReadU8AsU64: "read_u8_as_u64",
IDReadU16BEAsU64: "read_u16be_as_u64",
IDReadU16LEAsU64: "read_u16le_as_u64",
IDReadU24BEAsU64: "read_u24be_as_u64",
IDReadU24LEAsU64: "read_u24le_as_u64",
IDReadU32BEAsU64: "read_u32be_as_u64",
IDReadU32LEAsU64: "read_u32le_as_u64",
IDReadU40BEAsU64: "read_u40be_as_u64",
IDReadU40LEAsU64: "read_u40le_as_u64",
IDReadU48BEAsU64: "read_u48be_as_u64",
IDReadU48LEAsU64: "read_u48le_as_u64",
IDReadU56BEAsU64: "read_u56be_as_u64",
IDReadU56LEAsU64: "read_u56le_as_u64",
IDReadU64BE: "read_u64be",
IDReadU64LE: "read_u64le",
// --------
IDPeekUndoByte: "peek_undo_byte",
IDPeekU8: "peek_u8",
IDPeekU8At: "peek_u8_at",
IDPeekU8AsU16: "peek_u8_as_u16",
IDPeekU16BE: "peek_u16be",
IDPeekU16LE: "peek_u16le",
IDPeekU8AsU32: "peek_u8_as_u32",
IDPeekU16BEAsU32: "peek_u16be_as_u32",
IDPeekU16LEAsU32: "peek_u16le_as_u32",
IDPeekU24BEAsU32: "peek_u24be_as_u32",
IDPeekU24LEAsU32: "peek_u24le_as_u32",
IDPeekU32BE: "peek_u32be",
IDPeekU32LE: "peek_u32le",
IDPeekU8AsU64: "peek_u8_as_u64",
IDPeekU16BEAsU64: "peek_u16be_as_u64",
IDPeekU16LEAsU64: "peek_u16le_as_u64",
IDPeekU24BEAsU64: "peek_u24be_as_u64",
IDPeekU24LEAsU64: "peek_u24le_as_u64",
IDPeekU32BEAsU64: "peek_u32be_as_u64",
IDPeekU32LEAsU64: "peek_u32le_as_u64",
IDPeekU40BEAsU64: "peek_u40be_as_u64",
IDPeekU40LEAsU64: "peek_u40le_as_u64",
IDPeekU48BEAsU64: "peek_u48be_as_u64",
IDPeekU48LEAsU64: "peek_u48le_as_u64",
IDPeekU56BEAsU64: "peek_u56be_as_u64",
IDPeekU56LEAsU64: "peek_u56le_as_u64",
IDPeekU64BE: "peek_u64be",
IDPeekU64LE: "peek_u64le",
IDPeekU64LEAt: "peek_u64le_at",
// --------
IDWriteU8: "write_u8",
IDWriteU16BE: "write_u16be",
IDWriteU16LE: "write_u16le",
IDWriteU24BE: "write_u24be",
IDWriteU24LE: "write_u24le",
IDWriteU32BE: "write_u32be",
IDWriteU32LE: "write_u32le",
IDWriteU40BE: "write_u40be",
IDWriteU40LE: "write_u40le",
IDWriteU48BE: "write_u48be",
IDWriteU48LE: "write_u48le",
IDWriteU56BE: "write_u56be",
IDWriteU56LE: "write_u56le",
IDWriteU64BE: "write_u64be",
IDWriteU64LE: "write_u64le",
// --------
IDPokeU8: "poke_u8",
IDPokeU16BE: "poke_u16be",
IDPokeU16LE: "poke_u16le",
IDPokeU24BE: "poke_u24be",
IDPokeU24LE: "poke_u24le",
IDPokeU32BE: "poke_u32be",
IDPokeU32LE: "poke_u32le",
IDPokeU40BE: "poke_u40be",
IDPokeU40LE: "poke_u40le",
IDPokeU48BE: "poke_u48be",
IDPokeU48LE: "poke_u48le",
IDPokeU56BE: "poke_u56be",
IDPokeU56LE: "poke_u56le",
IDPokeU64BE: "poke_u64be",
IDPokeU64LE: "poke_u64le",
// --------
IDWriteU8Fast: "write_u8_fast",
IDWriteU16BEFast: "write_u16be_fast",
IDWriteU16LEFast: "write_u16le_fast",
IDWriteU24BEFast: "write_u24be_fast",
IDWriteU24LEFast: "write_u24le_fast",
IDWriteU32BEFast: "write_u32be_fast",
IDWriteU32LEFast: "write_u32le_fast",
IDWriteU40BEFast: "write_u40be_fast",
IDWriteU40LEFast: "write_u40le_fast",
IDWriteU48BEFast: "write_u48be_fast",
IDWriteU48LEFast: "write_u48le_fast",
IDWriteU56BEFast: "write_u56be_fast",
IDWriteU56LEFast: "write_u56le_fast",
IDWriteU64BEFast: "write_u64be_fast",
IDWriteU64LEFast: "write_u64le_fast",
// --------
IDWriteSimpleTokenFast: "write_simple_token_fast",
IDWriteExtendedTokenFast: "write_extended_token_fast",
// -------- 0x200 block.
IDAdvance: "advance",
IDCPUArch: "cpu_arch",
IDCPUArchIs32Bit: "cpu_arch_is_32_bit",
IDInitialize: "initialize",
IDLength: "length",
IDLikely: "likely",
IDReset: "reset",
IDSet: "set",
IDUnlikely: "unlikely",
IDUnroll: "unroll",
IDUpdate: "update",
IDHighBits: "high_bits",
IDLowBits: "low_bits",
IDMax: "max",
IDMin: "min",
IDIsError: "is_error",
IDIsOK: "is_ok",
IDIsSuspension: "is_suspension",
IDBulkLoadHostEndian: "bulk_load_host_endian",
IDBulkMemset: "bulk_memset",
IDBulkSaveHostEndian: "bulk_save_host_endian",
IDData: "data",
IDHeight: "height",
IDIO: "io",
IDLimit: "limit",
IDPrefix: "prefix",
IDRowU32: "row_u32",
IDStride: "stride",
IDSubtable: "subtable",
IDSuffix: "suffix",
IDUintptrLow12Bits: "uintptr_low_12_bits",
IDValidUTF8Length: "valid_utf_8_length",
IDWidth: "width",
IDLimitedSwizzleU32InterleavedFromReader: "limited_swizzle_u32_interleaved_from_reader",
IDSwizzleInterleavedFromReader: "swizzle_interleaved_from_reader",
// -------- 0x300 block.
IDARMCRC32: "arm_crc32",
IDARMCRC32Utility: "arm_crc32_utility",
IDARMCRC32U32: "arm_crc32_u32",
IDARMNeon: "arm_neon",
IDARMNeonUtility: "arm_neon_utility",
IDARMNeonU8x8: "arm_neon_u8x8",
IDARMNeonU16x4: "arm_neon_u16x4",
IDARMNeonU32x2: "arm_neon_u32x2",
IDARMNeonU64x1: "arm_neon_u64x1",
IDARMNeonU8x16: "arm_neon_u8x16",
IDARMNeonU16x8: "arm_neon_u16x8",
IDARMNeonU32x4: "arm_neon_u32x4",
IDARMNeonU64x2: "arm_neon_u64x2",
IDX86SSE42: "x86_sse42",
IDX86SSE42Utility: "x86_sse42_utility",
IDX86AVX2: "x86_avx2",
IDX86AVX2Utility: "x86_avx2_utility",
IDX86BMI2: "x86_bmi2",
IDX86M128I: "x86_m128i",
IDX86M256I: "x86_m256i",
}
var builtInsByName = map[string]ID{}
func init() {
for i, name := range builtInsByID {
if name != "" {
builtInsByName[name] = ID(i)
}
}
}
// squiggles are built-in IDs that aren't alpha-numeric.
var squiggles = [256]ID{
'(': IDOpenParen,
')': IDCloseParen,
'[': IDOpenBracket,
']': IDCloseBracket,
',': IDComma,
'!': IDExclam,
'?': IDQuestion,
':': IDColon,
';': IDSemicolon,
}
type suffixLexer struct {
suffix string
id ID
}
// lexers lex ambiguous 1-byte squiggles. For example, "&" might be the start
// of "&^" or "&=".
//
// The order of the []suffixLexer elements matters. The first match wins. Since
// we want to lex greedily, longer suffixes should be earlier in the slice.
var lexers = [256][]suffixLexer{
'.': {
{".=", IDDotDotEq},
{".", IDDotDot},
{"", IDDot},
},
'&': {
{"=", IDAmpEq},
{"", IDAmp},
},
'|': {
{"=", IDPipeEq},
{"", IDPipe},
},
'^': {
{"=", IDHatEq},
{"", IDHat},
},
'+': {
{"=", IDPlusEq},
{"", IDPlus},
},
'-': {
{"=", IDMinusEq},
{"", IDMinus},
},
'*': {
{"=", IDStarEq},
{"", IDStar},
},
'/': {
{"=", IDSlashEq},
{"", IDSlash},
},
'%': {
{"=", IDPercentEq},
{"", IDPercent},
},
'=': {
{"=", IDEqEq},
{"?", IDEqQuestion},
{"", IDEq},
},
'<': {
{"<=", IDShiftLEq},
{"<", IDShiftL},
{"=", IDLessEq},
{">", IDNotEq},
{"", IDLessThan},
},
'>': {
{">=", IDShiftREq},
{">", IDShiftR},
{"=", IDGreaterEq},
{"", IDGreaterThan},
},
'{': {
{"{", IDOpenDoubleCurly},
{"", IDOpenCurly},
},
'}': {
{"}", IDCloseDoubleCurly},
{"", IDCloseCurly},
},
'~': {
{"mod<<=", IDTildeModShiftLEq},
{"mod<<", IDTildeModShiftL},
{"mod+=", IDTildeModPlusEq},
{"mod+", IDTildeModPlus},
{"mod-=", IDTildeModMinusEq},
{"mod-", IDTildeModMinus},
{"mod*=", IDTildeModStarEq},
{"mod*", IDTildeModStar},
{"sat+=", IDTildeSatPlusEq},
{"sat+", IDTildeSatPlus},
{"sat-=", IDTildeSatMinusEq},
{"sat-", IDTildeSatMinus},
},
}
var ambiguousForms = [nBuiltInSymbolicIDs]ID{
IDXBinaryPlus: IDPlus,
IDXBinaryMinus: IDMinus,
IDXBinaryStar: IDStar,
IDXBinarySlash: IDSlash,
IDXBinaryShiftL: IDShiftL,
IDXBinaryShiftR: IDShiftR,
IDXBinaryAmp: IDAmp,
IDXBinaryPipe: IDPipe,
IDXBinaryHat: IDHat,
IDXBinaryPercent: IDPercent,
IDXBinaryTildeModPlus: IDTildeModPlus,
IDXBinaryTildeModMinus: IDTildeModMinus,
IDXBinaryTildeModStar: IDTildeModStar,
IDXBinaryTildeModShiftL: IDTildeModShiftL,
IDXBinaryTildeSatPlus: IDTildeSatPlus,
IDXBinaryTildeSatMinus: IDTildeSatMinus,
IDXBinaryNotEq: IDNotEq,
IDXBinaryLessThan: IDLessThan,
IDXBinaryLessEq: IDLessEq,
IDXBinaryEqEq: IDEqEq,
IDXBinaryGreaterEq: IDGreaterEq,
IDXBinaryGreaterThan: IDGreaterThan,
IDXBinaryAnd: IDAnd,
IDXBinaryOr: IDOr,
IDXBinaryAs: IDAs,
IDXAssociativePlus: IDPlus,
IDXAssociativeStar: IDStar,
IDXAssociativeAmp: IDAmp,
IDXAssociativePipe: IDPipe,
IDXAssociativeHat: IDHat,
IDXAssociativeAnd: IDAnd,
IDXAssociativeOr: IDOr,
IDXUnaryPlus: IDPlus,
IDXUnaryMinus: IDMinus,
IDXUnaryNot: IDNot,
}
func init() {
addXForms(&unaryForms)
addXForms(&binaryForms)
addXForms(&associativeForms)
}
// addXForms modifies table so that, if table[x] == y, then table[y] = y.
//
// For example, for the unaryForms table, the explicit entries are like:
//
// IDPlus: IDXUnaryPlus,
//
// and this function implicitly addes entries like:
//
// IDXUnaryPlus: IDXUnaryPlus,
func addXForms(table *[nBuiltInSymbolicIDs]ID) {
implicitEntries := [nBuiltInSymbolicIDs]bool{}
for _, y := range table {
if y != 0 {
implicitEntries[y] = true
}
}
for y, implicit := range implicitEntries {
if implicit {
table[y] = ID(y)
}
}
}
var binaryForms = [nBuiltInSymbolicIDs]ID{
IDPlusEq: IDXBinaryPlus,
IDMinusEq: IDXBinaryMinus,
IDStarEq: IDXBinaryStar,
IDSlashEq: IDXBinarySlash,
IDShiftLEq: IDXBinaryShiftL,
IDShiftREq: IDXBinaryShiftR,
IDAmpEq: IDXBinaryAmp,
IDPipeEq: IDXBinaryPipe,
IDHatEq: IDXBinaryHat,
IDPercentEq: IDXBinaryPercent,
IDTildeModPlusEq: IDXBinaryTildeModPlus,
IDTildeModMinusEq: IDXBinaryTildeModMinus,
IDTildeModStarEq: IDXBinaryTildeModStar,
IDTildeModShiftLEq: IDXBinaryTildeModShiftL,
IDTildeSatPlusEq: IDXBinaryTildeSatPlus,
IDTildeSatMinusEq: IDXBinaryTildeSatMinus,
IDPlus: IDXBinaryPlus,
IDMinus: IDXBinaryMinus,
IDStar: IDXBinaryStar,
IDSlash: IDXBinarySlash,
IDShiftL: IDXBinaryShiftL,
IDShiftR: IDXBinaryShiftR,
IDAmp: IDXBinaryAmp,
IDPipe: IDXBinaryPipe,
IDHat: IDXBinaryHat,
IDPercent: IDXBinaryPercent,
IDTildeModPlus: IDXBinaryTildeModPlus,
IDTildeModMinus: IDXBinaryTildeModMinus,
IDTildeModStar: IDXBinaryTildeModStar,
IDTildeModShiftL: IDXBinaryTildeModShiftL,
IDTildeSatPlus: IDXBinaryTildeSatPlus,
IDTildeSatMinus: IDXBinaryTildeSatMinus,
IDNotEq: IDXBinaryNotEq,
IDLessThan: IDXBinaryLessThan,
IDLessEq: IDXBinaryLessEq,
IDEqEq: IDXBinaryEqEq,
IDGreaterEq: IDXBinaryGreaterEq,
IDGreaterThan: IDXBinaryGreaterThan,
IDAnd: IDXBinaryAnd,
IDOr: IDXBinaryOr,
IDAs: IDXBinaryAs,
}
var associativeForms = [nBuiltInSymbolicIDs]ID{
IDPlus: IDXAssociativePlus,
IDStar: IDXAssociativeStar,
IDAmp: IDXAssociativeAmp,
IDPipe: IDXAssociativePipe,
IDHat: IDXAssociativeHat,
// TODO: IDTildeModPlus, IDTildeSatPlus?
IDAnd: IDXAssociativeAnd,
IDOr: IDXAssociativeOr,
}
var unaryForms = [nBuiltInSymbolicIDs]ID{
IDPlus: IDXUnaryPlus,
IDMinus: IDXUnaryMinus,
IDNot: IDXUnaryNot,
}
var isTightLeft = [...]bool{
IDSemicolon: true,
IDCloseParen: true,
IDOpenBracket: true,
IDCloseBracket: true,
IDDot: true,
IDComma: true,
IDExclam: true,
IDQuestion: true,
IDColon: true,
}
var isTightRight = [...]bool{
IDOpenParen: true,
IDOpenBracket: true,
IDDot: true,
IDExclam: true,
}