hlslOpMap.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //
  2. // Copyright (C) 2016 Google, Inc.
  3. //
  4. // All rights reserved.
  5. //
  6. // Redistribution and use in source and binary forms, with or without
  7. // modification, are permitted provided that the following conditions
  8. // are met:
  9. //
  10. // Redistributions of source code must retain the above copyright
  11. // notice, this list of conditions and the following disclaimer.
  12. //
  13. // Redistributions in binary form must reproduce the above
  14. // copyright notice, this list of conditions and the following
  15. // disclaimer in the documentation and/or other materials provided
  16. // with the distribution.
  17. //
  18. // Neither the name of Google, Inc., nor the names of its
  19. // contributors may be used to endorse or promote products derived
  20. // from this software without specific prior written permission.
  21. //
  22. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  25. // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  26. // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  27. // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  28. // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  29. // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  30. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  32. // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33. // POSSIBILITY OF SUCH DAMAGE.
  34. //
  35. // Map from physical token form (e.g. '-') to logical operator
  36. // form (e.g., binary subtract or unary negate).
  37. #include "hlslOpMap.h"
  38. namespace glslang {
  39. // Map parsing tokens that could be assignments into assignment operators.
  40. TOperator HlslOpMap::assignment(EHlslTokenClass op)
  41. {
  42. switch (op) {
  43. case EHTokAssign: return EOpAssign;
  44. case EHTokMulAssign: return EOpMulAssign;
  45. case EHTokDivAssign: return EOpDivAssign;
  46. case EHTokAddAssign: return EOpAddAssign;
  47. case EHTokModAssign: return EOpModAssign;
  48. case EHTokLeftAssign: return EOpLeftShiftAssign;
  49. case EHTokRightAssign: return EOpRightShiftAssign;
  50. case EHTokAndAssign: return EOpAndAssign;
  51. case EHTokXorAssign: return EOpExclusiveOrAssign;
  52. case EHTokOrAssign: return EOpInclusiveOrAssign;
  53. case EHTokSubAssign: return EOpSubAssign;
  54. default:
  55. return EOpNull;
  56. }
  57. }
  58. // Map parsing tokens that could be binary operations into binary operators.
  59. TOperator HlslOpMap::binary(EHlslTokenClass op)
  60. {
  61. switch (op) {
  62. case EHTokPlus: return EOpAdd;
  63. case EHTokDash: return EOpSub;
  64. case EHTokStar: return EOpMul;
  65. case EHTokSlash: return EOpDiv;
  66. case EHTokPercent: return EOpMod;
  67. case EHTokRightOp: return EOpRightShift;
  68. case EHTokLeftOp: return EOpLeftShift;
  69. case EHTokAmpersand: return EOpAnd;
  70. case EHTokVerticalBar: return EOpInclusiveOr;
  71. case EHTokCaret: return EOpExclusiveOr;
  72. case EHTokEqOp: return EOpEqual;
  73. case EHTokNeOp: return EOpNotEqual;
  74. case EHTokLeftAngle: return EOpLessThan;
  75. case EHTokRightAngle: return EOpGreaterThan;
  76. case EHTokLeOp: return EOpLessThanEqual;
  77. case EHTokGeOp: return EOpGreaterThanEqual;
  78. case EHTokOrOp: return EOpLogicalOr;
  79. case EHTokXorOp: return EOpLogicalXor;
  80. case EHTokAndOp: return EOpLogicalAnd;
  81. default:
  82. return EOpNull;
  83. }
  84. }
  85. // Map parsing tokens that could be unary operations into unary operators.
  86. // These are just the ones that can appear in front of its operand.
  87. TOperator HlslOpMap::preUnary(EHlslTokenClass op)
  88. {
  89. switch (op) {
  90. case EHTokPlus: return EOpAdd; // means no-op, but still a unary op was present
  91. case EHTokDash: return EOpNegative;
  92. case EHTokBang: return EOpLogicalNot;
  93. case EHTokTilde: return EOpBitwiseNot;
  94. case EHTokIncOp: return EOpPreIncrement;
  95. case EHTokDecOp: return EOpPreDecrement;
  96. default: return EOpNull; // means not a pre-unary op
  97. }
  98. }
  99. // Map parsing tokens that could be unary operations into unary operators.
  100. // These are just the ones that can appear behind its operand.
  101. TOperator HlslOpMap::postUnary(EHlslTokenClass op)
  102. {
  103. switch (op) {
  104. case EHTokDot: return EOpIndexDirectStruct;
  105. case EHTokLeftBracket: return EOpIndexIndirect;
  106. case EHTokIncOp: return EOpPostIncrement;
  107. case EHTokDecOp: return EOpPostDecrement;
  108. case EHTokColonColon: return EOpScoping;
  109. default: return EOpNull; // means not a post-unary op
  110. }
  111. }
  112. // Map operators into their level of precedence.
  113. PrecedenceLevel HlslOpMap::precedenceLevel(TOperator op)
  114. {
  115. switch (op) {
  116. case EOpLogicalOr:
  117. return PlLogicalOr;
  118. case EOpLogicalXor:
  119. return PlLogicalXor;
  120. case EOpLogicalAnd:
  121. return PlLogicalAnd;
  122. case EOpInclusiveOr:
  123. return PlBitwiseOr;
  124. case EOpExclusiveOr:
  125. return PlBitwiseXor;
  126. case EOpAnd:
  127. return PlBitwiseAnd;
  128. case EOpEqual:
  129. case EOpNotEqual:
  130. return PlEquality;
  131. case EOpLessThan:
  132. case EOpGreaterThan:
  133. case EOpLessThanEqual:
  134. case EOpGreaterThanEqual:
  135. return PlRelational;
  136. case EOpRightShift:
  137. case EOpLeftShift:
  138. return PlShift;
  139. case EOpAdd:
  140. case EOpSub:
  141. return PlAdd;
  142. case EOpMul:
  143. case EOpDiv:
  144. case EOpMod:
  145. return PlMul;
  146. default:
  147. return PlBad;
  148. }
  149. }
  150. } // end namespace glslang