Re-order some token.ID numbers
diff --git a/lang/token/list.go b/lang/token/list.go index 076f2b7..147616e 100644 --- a/lang/token/list.go +++ b/lang/token/list.go
@@ -183,12 +183,12 @@ // - Zero is invalid. // - [ 0x01, 0x0F] are squiggly punctuation, such as "(", ")" and ";". // - [ 0x10, 0x2F] are squiggly assignments, such as "=" and "+=". -// - [ 0x30, 0x4F] are operators, such as "+", "==" and "not". -// - [ 0x50, 0x7F] are x-ops (disambiguation forms): unary vs binary "+". -// - [ 0x80, 0x9F] are keywords, such as "if" and "return". -// - [ 0xA0, 0xAF] are type modifiers, such as "ptr" and "slice". -// - [ 0xB0, 0xBF] are literals, such as "false" and "true". -// - [ 0xC0, 0xFF] are reserved. +// - [ 0x30, 0x5F] are operators, such as "+", "==" and "not". +// - [ 0x60, 0x9F] are x-ops (disambiguation forms): unary vs binary "+". +// - [ 0xA0, 0xBF] are keywords, such as "if" and "return". +// - [ 0xC0, 0xCF] are type modifiers, such as "ptr" and "slice". +// - [ 0xD0, 0xEF] are literals, such as "false" and "true". +// - [ 0xE0, 0xFF] are reserved. // - [0x100, 0x3FF] are identifiers, such as "bool", "u32" and "read_u8". // // "Squiggly" means a sequence of non-alpha-numeric characters, such as "+" and @@ -196,7 +196,7 @@ // forms range in [0x50, 0x7F], but vice versa does not necessarily hold. For // example, the "and" operator is not "squiggly" but it is within [0x01, 0x4F]. const ( - nBuiltInSymbolicIDs = ID(0x80) // 128 + nBuiltInSymbolicIDs = ID(0xA0) // 160 nBuiltInIDs = ID(0x400) // 1024 ) @@ -231,165 +231,173 @@ minAssign = 0x10 maxAssign = 0x2F - IDPlusEq = ID(0x10) - IDMinusEq = ID(0x11) - IDStarEq = ID(0x12) - IDSlashEq = ID(0x13) - IDShiftLEq = ID(0x14) - IDShiftREq = ID(0x15) - IDAmpEq = ID(0x16) - IDPipeEq = ID(0x17) - IDHatEq = ID(0x18) - IDPercentEq = ID(0x19) - IDTildeModShiftLEq = ID(0x1A) - IDTildeModPlusEq = ID(0x1B) - IDTildeModMinusEq = ID(0x1C) - IDTildeSatPlusEq = ID(0x1D) - IDTildeSatMinusEq = ID(0x1E) + IDPlusEq = ID(0x10) + IDMinusEq = ID(0x11) + IDStarEq = ID(0x12) + IDSlashEq = ID(0x13) + IDShiftLEq = ID(0x14) + IDShiftREq = ID(0x15) + IDAmpEq = ID(0x16) + IDPipeEq = ID(0x17) + IDHatEq = ID(0x18) + IDPercentEq = ID(0x19) - IDEq = ID(0x20) - IDEqQuestion = ID(0x21) + IDTildeModPlusEq = ID(0x20) + IDTildeModMinusEq = ID(0x21) + IDTildeModShiftLEq = ID(0x24) + + IDTildeSatPlusEq = ID(0x28) + IDTildeSatMinusEq = ID(0x29) + + IDEq = ID(0x2E) + IDEqQuestion = ID(0x2F) ) const ( minOp = 0x30 minAmbiguousOp = 0x30 - maxAmbiguousOp = 0x4F - minXOp = 0x50 - maxXOp = 0x7F - maxOp = 0x7F + maxAmbiguousOp = 0x5F + minXOp = 0x60 + maxXOp = 0x9F + maxOp = 0x9F - IDPlus = ID(0x30) - IDMinus = ID(0x31) - IDStar = ID(0x32) - IDSlash = ID(0x33) - IDShiftL = ID(0x34) - IDShiftR = ID(0x35) - IDAmp = ID(0x36) - IDPipe = ID(0x37) - IDHat = ID(0x38) - IDPercent = ID(0x39) - IDTildeModShiftL = ID(0x3A) - IDTildeModPlus = ID(0x3B) - IDTildeModMinus = ID(0x3C) - IDTildeSatPlus = ID(0x3D) - IDTildeSatMinus = ID(0x3E) + IDPlus = ID(0x30) + IDMinus = ID(0x31) + IDStar = ID(0x32) + IDSlash = ID(0x33) + IDShiftL = ID(0x34) + IDShiftR = ID(0x35) + IDAmp = ID(0x36) + IDPipe = ID(0x37) + IDHat = ID(0x38) + IDPercent = ID(0x39) - IDNotEq = ID(0x40) - IDLessThan = ID(0x41) - IDLessEq = ID(0x42) - IDEqEq = ID(0x43) - IDGreaterEq = ID(0x44) - IDGreaterThan = ID(0x45) + IDTildeModPlus = ID(0x40) + IDTildeModMinus = ID(0x41) + IDTildeModShiftL = ID(0x44) - IDAnd = ID(0x48) - IDOr = ID(0x49) - IDNot = ID(0x4A) - IDAs = ID(0x4B) + IDTildeSatPlus = ID(0x48) + IDTildeSatMinus = ID(0x49) + + IDNotEq = ID(0x50) + IDLessThan = ID(0x51) + IDLessEq = ID(0x52) + IDEqEq = ID(0x53) + IDGreaterEq = ID(0x54) + IDGreaterThan = ID(0x55) + + IDAnd = ID(0x58) + IDOr = ID(0x59) + IDAs = ID(0x5A) + + IDNot = ID(0x5F) // 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. - IDXUnaryPlus = ID(0x50) - IDXUnaryMinus = ID(0x51) - IDXUnaryNot = ID(0x52) + IDXBinaryPlus = ID(0x60) + IDXBinaryMinus = ID(0x61) + IDXBinaryStar = ID(0x62) + IDXBinarySlash = ID(0x63) + IDXBinaryShiftL = ID(0x64) + IDXBinaryShiftR = ID(0x65) + IDXBinaryAmp = ID(0x66) + IDXBinaryPipe = ID(0x67) + IDXBinaryHat = ID(0x68) + IDXBinaryPercent = ID(0x69) - IDXBinaryPlus = ID(0x58) - IDXBinaryMinus = ID(0x59) - IDXBinaryStar = ID(0x5A) - IDXBinarySlash = ID(0x5B) - IDXBinaryShiftL = ID(0x5C) - IDXBinaryShiftR = ID(0x5D) - IDXBinaryAmp = ID(0x5E) - IDXBinaryPipe = ID(0x5F) - IDXBinaryHat = ID(0x60) - IDXBinaryPercent = ID(0x61) - IDXBinaryTildeModShiftL = ID(0x62) - IDXBinaryTildeModPlus = ID(0x63) - IDXBinaryTildeModMinus = ID(0x64) - IDXBinaryTildeSatPlus = ID(0x65) - IDXBinaryTildeSatMinus = ID(0x66) - IDXBinaryNotEq = ID(0x67) - IDXBinaryLessThan = ID(0x68) - IDXBinaryLessEq = ID(0x69) - IDXBinaryEqEq = ID(0x6A) - IDXBinaryGreaterEq = ID(0x6B) - IDXBinaryGreaterThan = ID(0x6C) - IDXBinaryAnd = ID(0x6D) - IDXBinaryOr = ID(0x6E) - IDXBinaryAs = ID(0x6F) + IDXBinaryTildeModPlus = ID(0x70) + IDXBinaryTildeModMinus = ID(0x71) + IDXBinaryTildeModShiftL = ID(0x74) - IDXAssociativePlus = ID(0x70) - IDXAssociativeStar = ID(0x71) - IDXAssociativeAmp = ID(0x72) - IDXAssociativePipe = ID(0x73) - IDXAssociativeHat = ID(0x74) - IDXAssociativeAnd = ID(0x75) - IDXAssociativeOr = ID(0x76) + IDXBinaryTildeSatPlus = ID(0x78) + IDXBinaryTildeSatMinus = ID(0x79) + + IDXBinaryNotEq = ID(0x80) + IDXBinaryLessThan = ID(0x81) + IDXBinaryLessEq = ID(0x82) + IDXBinaryEqEq = ID(0x83) + IDXBinaryGreaterEq = ID(0x84) + IDXBinaryGreaterThan = ID(0x85) + + IDXBinaryAnd = ID(0x88) + IDXBinaryOr = ID(0x89) + IDXBinaryAs = ID(0x8A) + + IDXAssociativePlus = ID(0x90) + IDXAssociativeStar = ID(0x91) + IDXAssociativeAmp = ID(0x92) + IDXAssociativePipe = ID(0x93) + IDXAssociativeHat = ID(0x94) + IDXAssociativeAnd = ID(0x95) + IDXAssociativeOr = ID(0x96) + + IDXUnaryPlus = ID(0x9C) + IDXUnaryMinus = ID(0x9D) + IDXUnaryNot = ID(0x9F) ) const ( - minKeyword = 0x80 - maxKeyword = 0x9F + minKeyword = 0xA0 + maxKeyword = 0xBF - // TODO: sort these by name, when the list has stabilized. - IDFunc = ID(0x80) - IDAssert = ID(0x81) - IDWhile = ID(0x82) - IDIf = ID(0x83) - IDElse = ID(0x84) - IDReturn = ID(0x85) - IDBreak = ID(0x86) - IDContinue = ID(0x87) - IDStruct = ID(0x88) - IDUse = ID(0x89) - IDVar = ID(0x8A) - IDPre = ID(0x8B) - IDInv = ID(0x8C) - IDPost = ID(0x8D) - IDVia = ID(0x8E) - IDPub = ID(0x8F) - IDPri = ID(0x90) - IDConst = ID(0x91) - IDIterate = ID(0x92) - IDYield = ID(0x93) - IDIOBind = ID(0x94) - IDIOLimit = ID(0x95) + IDAssert = ID(0xA0) + IDBreak = ID(0xA1) + IDConst = ID(0xA2) + IDContinue = ID(0xA3) + IDElse = ID(0xA4) + IDFunc = ID(0xA5) + IDIOBind = ID(0xA6) + IDIOLimit = ID(0xA7) + IDIf = ID(0xA8) + IDInv = ID(0xA9) + IDIterate = ID(0xAA) + IDPost = ID(0xAB) + IDPre = ID(0xAC) + IDPri = ID(0xAD) + IDPub = ID(0xAE) + IDReturn = ID(0xAF) + IDStruct = ID(0xB0) + IDUse = ID(0xB1) + IDVar = ID(0xB2) + IDVia = ID(0xB3) + IDWhile = ID(0xB4) + IDYield = ID(0xB5) ) const ( - minTypeModifier = 0xA0 - maxTypeModifier = 0xAF + minTypeModifier = 0xC0 + maxTypeModifier = 0xCF - IDArray = ID(0xA0) - IDNptr = ID(0xA1) - IDPtr = ID(0xA2) - IDSlice = ID(0xA3) - IDTable = ID(0xA4) + IDArray = ID(0xC0) + IDNptr = ID(0xC1) + IDPtr = ID(0xC2) + IDSlice = ID(0xC3) + IDTable = ID(0xC4) ) const ( - minBuiltInLiteral = 0xB0 - minBuiltInNumLiteral = 0xC0 - maxBuiltInNumLiteral = 0xCF - maxBuiltInLiteral = 0xCF + minBuiltInLiteral = 0xD0 + minBuiltInNumLiteral = 0xE0 + maxBuiltInNumLiteral = 0xEF + maxBuiltInLiteral = 0xEF - IDFalse = ID(0xB0) - IDTrue = ID(0xB1) - IDNothing = ID(0xB2) - IDNullptr = ID(0xB3) - IDOk = ID(0xB4) + IDFalse = ID(0xD0) + IDTrue = ID(0xD1) + IDNothing = ID(0xD2) + IDNullptr = ID(0xD3) + IDOk = ID(0xD4) - ID0 = ID(0xC0) - ID1 = ID(0xC1) - ID2 = ID(0xC2) - ID4 = ID(0xC3) - ID8 = ID(0xC4) - ID16 = ID(0xC5) - ID32 = ID(0xC6) - ID64 = ID(0xC7) - ID128 = ID(0xC8) - ID256 = ID(0xC9) + ID0 = ID(0xE0) + ID1 = ID(0xE1) + ID2 = ID(0xE2) + ID4 = ID(0xE3) + ID8 = ID(0xE4) + ID16 = ID(0xE5) + ID32 = ID(0xE6) + ID64 = ID(0xE7) + ID128 = ID(0xE8) + ID256 = ID(0xE9) ) const ( @@ -621,40 +629,44 @@ IDColon: ":", IDSemicolon: ";", - IDPlusEq: "+=", - IDMinusEq: "-=", - IDStarEq: "*=", - IDSlashEq: "/=", - IDShiftLEq: "<<=", - IDShiftREq: ">>=", - IDAmpEq: "&=", - IDPipeEq: "|=", - IDHatEq: "^=", - IDPercentEq: "%=", - IDTildeModShiftLEq: "~mod<<=", + IDPlusEq: "+=", + IDMinusEq: "-=", + IDStarEq: "*=", + IDSlashEq: "/=", + IDShiftLEq: "<<=", + IDShiftREq: ">>=", + IDAmpEq: "&=", + IDPipeEq: "|=", + IDHatEq: "^=", + IDPercentEq: "%=", + IDTildeModPlusEq: "~mod+=", IDTildeModMinusEq: "~mod-=", - IDTildeSatPlusEq: "~sat+=", - IDTildeSatMinusEq: "~sat-=", + IDTildeModShiftLEq: "~mod<<=", + + IDTildeSatPlusEq: "~sat+=", + IDTildeSatMinusEq: "~sat-=", IDEq: "=", IDEqQuestion: "=?", - IDPlus: "+", - IDMinus: "-", - IDStar: "*", - IDSlash: "/", - IDShiftL: "<<", - IDShiftR: ">>", - IDAmp: "&", - IDPipe: "|", - IDHat: "^", - IDPercent: "%", - IDTildeModShiftL: "~mod<<", + IDPlus: "+", + IDMinus: "-", + IDStar: "*", + IDSlash: "/", + IDShiftL: "<<", + IDShiftR: ">>", + IDAmp: "&", + IDPipe: "|", + IDHat: "^", + IDPercent: "%", + IDTildeModPlus: "~mod+", IDTildeModMinus: "~mod-", - IDTildeSatPlus: "~sat+", - IDTildeSatMinus: "~sat-", + IDTildeModShiftL: "~mod<<", + + IDTildeSatPlus: "~sat+", + IDTildeSatMinus: "~sat-", IDNotEq: "<>", IDLessThan: "<", @@ -665,31 +677,32 @@ IDAnd: "and", IDOr: "or", - IDNot: "not", IDAs: "as", - IDFunc: "func", + IDNot: "not", + IDAssert: "assert", - IDWhile: "while", - IDIf: "if", - IDElse: "else", - IDReturn: "return", IDBreak: "break", + IDConst: "const", IDContinue: "continue", + IDElse: "else", + IDFunc: "func", + IDIOBind: "io_bind", + IDIOLimit: "io_limit", + IDIf: "if", + IDInv: "inv", + IDIterate: "iterate", + IDPost: "post", + IDPre: "pre", + IDPri: "pri", + IDPub: "pub", + IDReturn: "return", IDStruct: "struct", IDUse: "use", IDVar: "var", - IDPre: "pre", - IDInv: "inv", - IDPost: "post", IDVia: "via", - IDPub: "pub", - IDPri: "pri", - IDConst: "const", - IDIterate: "iterate", + IDWhile: "while", IDYield: "yield", - IDIOBind: "io_bind", - IDIOLimit: "io_limit", IDArray: "array", IDNptr: "nptr", @@ -1039,10 +1052,6 @@ } var ambiguousForms = [nBuiltInSymbolicIDs]ID{ - IDXUnaryPlus: IDPlus, - IDXUnaryMinus: IDMinus, - IDXUnaryNot: IDNot, - IDXBinaryPlus: IDPlus, IDXBinaryMinus: IDMinus, IDXBinaryStar: IDStar, @@ -1053,9 +1062,9 @@ IDXBinaryPipe: IDPipe, IDXBinaryHat: IDHat, IDXBinaryPercent: IDPercent, - IDXBinaryTildeModShiftL: IDTildeModShiftL, IDXBinaryTildeModPlus: IDTildeModPlus, IDXBinaryTildeModMinus: IDTildeModMinus, + IDXBinaryTildeModShiftL: IDTildeModShiftL, IDXBinaryTildeSatPlus: IDTildeSatPlus, IDXBinaryTildeSatMinus: IDTildeSatMinus, IDXBinaryNotEq: IDNotEq, @@ -1075,6 +1084,10 @@ IDXAssociativeHat: IDHat, IDXAssociativeAnd: IDAnd, IDXAssociativeOr: IDOr, + + IDXUnaryPlus: IDPlus, + IDXUnaryMinus: IDMinus, + IDXUnaryNot: IDNot, } func init() { @@ -1103,12 +1116,6 @@ } } -var unaryForms = [nBuiltInSymbolicIDs]ID{ - IDPlus: IDXUnaryPlus, - IDMinus: IDXUnaryMinus, - IDNot: IDXUnaryNot, -} - var binaryForms = [nBuiltInSymbolicIDs]ID{ IDPlusEq: IDXBinaryPlus, IDMinusEq: IDXBinaryMinus, @@ -1120,9 +1127,9 @@ IDPipeEq: IDXBinaryPipe, IDHatEq: IDXBinaryHat, IDPercentEq: IDXBinaryPercent, - IDTildeModShiftLEq: IDXBinaryTildeModShiftL, IDTildeModPlusEq: IDXBinaryTildeModPlus, IDTildeModMinusEq: IDXBinaryTildeModMinus, + IDTildeModShiftLEq: IDXBinaryTildeModShiftL, IDTildeSatPlusEq: IDXBinaryTildeSatPlus, IDTildeSatMinusEq: IDXBinaryTildeSatMinus, @@ -1136,9 +1143,9 @@ IDPipe: IDXBinaryPipe, IDHat: IDXBinaryHat, IDPercent: IDXBinaryPercent, - IDTildeModShiftL: IDXBinaryTildeModShiftL, IDTildeModPlus: IDXBinaryTildeModPlus, IDTildeModMinus: IDXBinaryTildeModMinus, + IDTildeModShiftL: IDXBinaryTildeModShiftL, IDTildeSatPlus: IDXBinaryTildeSatPlus, IDTildeSatMinus: IDXBinaryTildeSatMinus, @@ -1164,6 +1171,12 @@ IDOr: IDXAssociativeOr, } +var unaryForms = [nBuiltInSymbolicIDs]ID{ + IDPlus: IDXUnaryPlus, + IDMinus: IDXUnaryMinus, + IDNot: IDXUnaryNot, +} + var isTightLeft = [...]bool{ IDSemicolon: true,