Syntax.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package me.hammerle.snuviscript.code;
  2. public enum Syntax
  3. {
  4. UNKNOWN(" ", 0, 0),
  5. INC("++", 2, 1),
  6. POST_INC("p++", 2, 1),
  7. DEC("--", 2, 1),
  8. POST_DEC("p--", 2, 1),
  9. INVERT("!", 2, 1),
  10. BIT_INVERT("~", 2, 1),
  11. MUL("*", 3),
  12. DIV("/", 3),
  13. MOD("%", 3),
  14. ADD("+", 4),
  15. SUB("-", 4),
  16. UNARY_SUB(" ", 0, 1),
  17. LEFT_SHIFT("<<", 6),
  18. RIGHT_SHIFT(">>", 6),
  19. SMALLER("<", 7),
  20. SMALLER_EQUAL("<=", 7),
  21. GREATER(">", 7),
  22. GREATER_EQUAL(">=", 7),
  23. EQUAL("==", 8),
  24. NOT_EQUAL("!=", 8),
  25. BIT_AND("&", 9),
  26. BIT_XOR("^", 10),
  27. BIT_OR("|", 11),
  28. AND("&&", 12),
  29. OR("||", 13),
  30. SET("=", 15),
  31. ADD_SET("+=", 15),
  32. SUB_SET("-=", 15),
  33. MUL_SET("*=", 15),
  34. DIV_SET("/=", 15),
  35. MOD_SET("%=", 15),
  36. LEFT_SHIFT_SET("<<=", 15),
  37. RIGHT_SHIFT_SET(">>=", 15),
  38. BIT_AND_SET("&=", 15),
  39. BIT_XOR_SET("^=", 15),
  40. BIT_OR_SET("|=", 15);
  41. public static Syntax getSyntax(String s)
  42. {
  43. int size = s.length();
  44. if(size > 0)
  45. {
  46. switch(s.charAt(0))
  47. {
  48. case '~':
  49. if(size == 1)
  50. {
  51. return BIT_INVERT;
  52. }
  53. break;
  54. case '*':
  55. if(size == 1)
  56. {
  57. return MUL;
  58. }
  59. else if(size == 2 && s.charAt(1) == '=')
  60. {
  61. return MUL_SET;
  62. }
  63. break;
  64. case '/':
  65. if(size == 1)
  66. {
  67. return DIV;
  68. }
  69. else if(size == 2 && s.charAt(1) == '=')
  70. {
  71. return DIV_SET;
  72. }
  73. break;
  74. case '+':
  75. if(size == 1)
  76. {
  77. return ADD;
  78. }
  79. else if(size == 2)
  80. {
  81. switch(s.charAt(1))
  82. {
  83. case '=': return ADD_SET;
  84. case '+': return POST_INC;
  85. }
  86. }
  87. break;
  88. case '-':
  89. if(size == 1)
  90. {
  91. return SUB;
  92. }
  93. else if(size == 2)
  94. {
  95. switch(s.charAt(1))
  96. {
  97. case '=': return SUB_SET;
  98. case '-': return POST_DEC;
  99. }
  100. }
  101. break;
  102. case '^':
  103. if(size == 1)
  104. {
  105. return BIT_XOR;
  106. }
  107. else if(size == 2 && s.charAt(1) == '=')
  108. {
  109. return BIT_XOR_SET;
  110. }
  111. break;
  112. case '<':
  113. if(size == 1)
  114. {
  115. return SMALLER;
  116. }
  117. else if(size == 2)
  118. {
  119. switch(s.charAt(1))
  120. {
  121. case '<': return LEFT_SHIFT;
  122. case '=': return SMALLER_EQUAL;
  123. }
  124. }
  125. else if(size == 3 && s.charAt(1) == '<' && s.charAt(2) == '=')
  126. {
  127. return LEFT_SHIFT_SET;
  128. }
  129. break;
  130. case '>':
  131. if(size == 1)
  132. {
  133. return GREATER;
  134. }
  135. else if(size == 2)
  136. {
  137. switch(s.charAt(1))
  138. {
  139. case '>': return RIGHT_SHIFT;
  140. case '=': return GREATER_EQUAL;
  141. }
  142. }
  143. else if(size == 3 && s.charAt(1) == '>' && s.charAt(2) == '=')
  144. {
  145. return RIGHT_SHIFT_SET;
  146. }
  147. break;
  148. case '!':
  149. if(size == 1)
  150. {
  151. return INVERT;
  152. }
  153. else if(size == 2 && s.charAt(1) == '=')
  154. {
  155. return NOT_EQUAL;
  156. }
  157. break;
  158. case '=':
  159. if(size == 1)
  160. {
  161. return SET;
  162. }
  163. else if(size == 2 && s.charAt(1) == '=')
  164. {
  165. return EQUAL;
  166. }
  167. break;
  168. case '&':
  169. if(size == 1)
  170. {
  171. return BIT_AND;
  172. }
  173. else if(size == 2)
  174. {
  175. switch(s.charAt(1))
  176. {
  177. case '&': return AND;
  178. case '=': return BIT_AND_SET;
  179. }
  180. }
  181. break;
  182. case '|':
  183. if(size == 1)
  184. {
  185. return BIT_OR;
  186. }
  187. else if(size == 2)
  188. {
  189. switch(s.charAt(1))
  190. {
  191. case '|': return OR;
  192. case '=': return BIT_OR_SET;
  193. }
  194. }
  195. break;
  196. case '%':
  197. if(size == 1)
  198. {
  199. return MOD;
  200. }
  201. else if(size == 2 && s.charAt(1) == '=')
  202. {
  203. return MOD_SET;
  204. }
  205. break;
  206. }
  207. }
  208. return UNKNOWN;
  209. }
  210. private int weight;
  211. private String function;
  212. private byte pars;
  213. Syntax(String function, int weight, int pars)
  214. {
  215. this.weight = weight;
  216. this.function = function;
  217. this.pars = (byte) pars;
  218. }
  219. Syntax(String function, int weight)
  220. {
  221. this(function, weight, 2);
  222. }
  223. public String getFunction()
  224. {
  225. return function;
  226. }
  227. public int getWeight()
  228. {
  229. return weight;
  230. }
  231. public byte getParameters()
  232. {
  233. return pars;
  234. }
  235. }