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 }