Syntax.java 6.8 KB

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