1 /// Author: Aziz Köksal 2 /// License: GPL3 3 /// $(Maturity high) 4 module dil.ast.Precedence; 5 6 import dil.ast.NodesEnum; 7 8 /// Enumeration of precedence values. 9 enum PREC 10 { 11 None, 12 Expression, 13 Assignment, 14 Conditional, 15 LogicalOr, 16 LogicalAnd, 17 BinaryOr, 18 BinaryXor, 19 BinaryAnd, 20 Relational, 21 Shifting, 22 Addition, 23 Multiplication, 24 Exponentiation, 25 Unary, 26 Primary, 27 } 28 29 /// A table that maps a NodeKind to a precedence value. 30 static immutable PREC[NodeKind.max+1] precTable = [ 31 NodeKind.CondExpr: PREC.Conditional, 32 NodeKind.CommaExpr: PREC.Expression, 33 NodeKind.OrOrExpr: PREC.LogicalOr, 34 NodeKind.AndAndExpr: PREC.LogicalAnd, 35 NodeKind.OrExpr: PREC.BinaryOr, 36 NodeKind.XorExpr: PREC.BinaryXor, 37 NodeKind.AndExpr: PREC.BinaryAnd, 38 NodeKind.EqualExpr: PREC.Relational, 39 NodeKind.IdentityExpr: PREC.Relational, 40 NodeKind.RelExpr: PREC.Relational, 41 NodeKind.InExpr: PREC.Relational, 42 NodeKind.LShiftExpr: PREC.Shifting, 43 NodeKind.RShiftExpr: PREC.Shifting, 44 NodeKind.URShiftExpr: PREC.Shifting, 45 NodeKind.PlusExpr: PREC.Addition, 46 NodeKind.MinusExpr: PREC.Addition, 47 NodeKind.CatExpr: PREC.Addition, 48 NodeKind.MulExpr: PREC.Multiplication, 49 NodeKind.DivExpr: PREC.Multiplication, 50 NodeKind.ModExpr: PREC.Multiplication, 51 NodeKind.PowExpr: PREC.Exponentiation, 52 NodeKind.RangeExpr: PREC.Assignment, 53 NodeKind.AssignExpr: PREC.Assignment, 54 NodeKind.LShiftAssignExpr: PREC.Assignment, 55 NodeKind.RShiftAssignExpr: PREC.Assignment, 56 NodeKind.URShiftAssignExpr: PREC.Assignment, 57 NodeKind.OrAssignExpr: PREC.Assignment, 58 NodeKind.AndAssignExpr: PREC.Assignment, 59 NodeKind.PlusAssignExpr: PREC.Assignment, 60 NodeKind.MinusAssignExpr: PREC.Assignment, 61 NodeKind.DivAssignExpr: PREC.Assignment, 62 NodeKind.MulAssignExpr: PREC.Assignment, 63 NodeKind.ModAssignExpr: PREC.Assignment, 64 NodeKind.XorAssignExpr: PREC.Assignment, 65 NodeKind.CatAssignExpr: PREC.Assignment, 66 NodeKind.PowAssignExpr: PREC.Assignment, 67 NodeKind.AddressExpr: PREC.Unary, 68 NodeKind.PreIncrExpr: PREC.Primary, 69 NodeKind.PreDecrExpr: PREC.Primary, 70 NodeKind.PostIncrExpr: PREC.Primary, 71 NodeKind.PostDecrExpr: PREC.Primary, 72 NodeKind.DerefExpr: PREC.Unary, 73 NodeKind.SignExpr: PREC.Unary, 74 NodeKind.NotExpr: PREC.Unary, 75 NodeKind.CompExpr: PREC.Unary, 76 NodeKind.CallExpr: PREC.Unary, 77 NodeKind.NewExpr: PREC.Unary, 78 NodeKind.NewClassExpr: PREC.Unary, 79 NodeKind.DeleteExpr: PREC.Unary, 80 NodeKind.CastExpr: PREC.Unary, 81 NodeKind.IndexExpr: PREC.Unary, 82 NodeKind.SliceExpr: PREC.Unary, 83 NodeKind.ModuleScopeExpr: PREC.Primary, 84 NodeKind.IdentifierExpr: PREC.Primary, 85 NodeKind.SpecialTokenExpr: PREC.Primary, 86 NodeKind.TmplInstanceExpr: PREC.Primary, 87 NodeKind.ThisExpr: PREC.Primary, 88 NodeKind.SuperExpr: PREC.Primary, 89 NodeKind.NullExpr: PREC.Primary, 90 NodeKind.DollarExpr: PREC.Primary, 91 NodeKind.BoolExpr: PREC.Primary, 92 NodeKind.IntExpr: PREC.Primary, 93 NodeKind.FloatExpr: PREC.Primary, 94 NodeKind.ComplexExpr: PREC.Addition, 95 NodeKind.CharExpr: PREC.Primary, 96 NodeKind.StringExpr: PREC.Primary, 97 NodeKind.ArrayLiteralExpr: PREC.Primary, 98 NodeKind.AArrayLiteralExpr: PREC.Primary, 99 NodeKind.AssertExpr: PREC.Primary, 100 NodeKind.MixinExpr: PREC.Primary, 101 NodeKind.ImportExpr: PREC.Primary, 102 NodeKind.TypeofExpr: PREC.Primary, 103 NodeKind.TypeDotIdExpr: PREC.Primary, 104 NodeKind.TypeidExpr: PREC.Primary, 105 NodeKind.IsExpr: PREC.Primary, 106 NodeKind.ParenExpr: PREC.Primary, 107 NodeKind.FuncLiteralExpr: PREC.Primary, 108 NodeKind.LambdaExpr: PREC.Primary, 109 NodeKind.TraitsExpr: PREC.Primary, 110 NodeKind.VoidInitExpr: PREC.Primary, 111 NodeKind.ArrayInitExpr: PREC.Primary, 112 NodeKind.StructInitExpr: PREC.Primary, 113 NodeKind.AsmTypeExpr: PREC.Unary, 114 NodeKind.AsmOffsetExpr: PREC.Unary, 115 NodeKind.AsmSegExpr: PREC.Unary, 116 NodeKind.AsmPostBracketExpr: PREC.Unary, 117 NodeKind.AsmBracketExpr: PREC.Primary, 118 NodeKind.AsmLocalSizeExpr: PREC.Primary, 119 NodeKind.AsmRegisterExpr: PREC.Primary, 120 ]; 121 122 /// Returns the precedence value for a NodeKind. 123 PREC precOf(NodeKind k) 124 { 125 return precTable[k]; 126 }