Syntax.java 6.6 KB

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