PageRenderTime 40ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/src/alice/tuprologx/ide/PrologTokenMarker.java

http://tuprolog.googlecode.com/
Java | 431 lines | 352 code | 27 blank | 52 comment | 20 complexity | 982cdb8c5ac6cea9be1a9c080c8cdf06 MD5 | raw file
Possible License(s): LGPL-3.0
  1. package alice.tuprologx.ide;
  2. import alice.util.jedit.*;
  3. import javax.swing.text.Segment;
  4. public class PrologTokenMarker extends TokenMarker
  5. {
  6. public PrologTokenMarker()
  7. {
  8. this(true,getKeywords());
  9. }
  10. public PrologTokenMarker(boolean cpp,KeywordMap keywords)
  11. {
  12. this.cpp = cpp;
  13. this.keywords = keywords;
  14. }
  15. public byte markTokensImpl(byte token, Segment line, int lineIndex)
  16. {
  17. char[] array = line.array;
  18. int offset = line.offset;
  19. lastOffset = offset;
  20. lastKeyword = offset;
  21. int length = line.count + offset;
  22. boolean backslash = false;
  23. loop: for(int i = offset; i < length; i++)
  24. {
  25. int i1 = (i+1);
  26. char c = array[i];
  27. if(c == '\\')
  28. {
  29. backslash = !backslash;
  30. continue;
  31. }
  32. switch(token)
  33. {
  34. case Token.NULL:
  35. switch(c)
  36. {
  37. case '%':
  38. if (backslash)
  39. backslash = false;
  40. doKeyword(line,i,c);
  41. addToken(i - lastOffset,token);
  42. addToken(length - i,Token.COMMENT1);
  43. lastOffset = lastKeyword = length;
  44. break loop;
  45. /* a future use for constraints?
  46. case '#':
  47. if(backslash)
  48. backslash = false;
  49. else {
  50. if(doKeyword(line,i,c))
  51. break;
  52. addToken(i - lastOffset,token);
  53. addToken(length - i,Token.LABEL);
  54. lastOffset = lastKeyword = length;
  55. break loop;
  56. }
  57. break;
  58. */
  59. case '"':
  60. doKeyword(line,i,c);
  61. if(backslash)
  62. backslash = false;
  63. else
  64. {
  65. addToken(i - lastOffset,token);
  66. token = Token.LITERAL1;
  67. lastOffset = lastKeyword = i;
  68. }
  69. break;
  70. case '\'':
  71. doKeyword(line,i,c);
  72. if(backslash)
  73. backslash = false;
  74. else
  75. {
  76. addToken(i - lastOffset,token);
  77. token = Token.LITERAL1;
  78. lastOffset = lastKeyword = i;
  79. }
  80. break;
  81. case '[':
  82. doKeyword(line,i,c);
  83. if(backslash)
  84. backslash = false;
  85. else
  86. {
  87. addToken(i - lastOffset,token);
  88. token = Token.LITERAL2;
  89. lastOffset = lastKeyword = i;
  90. }
  91. break;
  92. /*
  93. case ':':
  94. if(lastKeyword == offset)
  95. {
  96. if(doKeyword(line,i,c))
  97. break;
  98. backslash = false;
  99. addToken(i1 - lastOffset,Token.LABEL);
  100. lastOffset = lastKeyword = i1;
  101. }
  102. else if(doKeyword(line,i,c))
  103. break;
  104. break;
  105. */
  106. case '/':
  107. backslash = false;
  108. doKeyword(line,i,c);
  109. if(length - i > 1)
  110. {
  111. switch(array[i1])
  112. {
  113. /* COMMENT2! */
  114. case '*':
  115. addToken(i - lastOffset,token);
  116. lastOffset = lastKeyword = i;
  117. if(length - i > 2 && array[i+2] == '*')
  118. token = Token.COMMENT2;
  119. else
  120. token = Token.COMMENT1;
  121. break;
  122. /*
  123. case '/':
  124. addToken(i - lastOffset,token);
  125. addToken(length - i,Token.COMMENT1);
  126. lastOffset = lastKeyword = length;
  127. break loop;
  128. */
  129. }
  130. }
  131. break;
  132. default:
  133. backslash = false;
  134. if(!Character.isLetterOrDigit(c)
  135. && c != '_' && c != '!')
  136. doKeyword(line,i,c);
  137. break;
  138. }
  139. break;
  140. case Token.COMMENT1:
  141. /* COMMENT2! */
  142. case Token.COMMENT2:
  143. backslash = false;
  144. if(c == '*' && length - i > 1)
  145. {
  146. if(array[i1] == '/')
  147. {
  148. i++;
  149. addToken((i+1) - lastOffset,token);
  150. token = Token.NULL;
  151. lastOffset = lastKeyword = i+1;
  152. }
  153. }
  154. break;
  155. case Token.LITERAL1:
  156. if(backslash)
  157. backslash = false;
  158. else if(c == '"')
  159. {
  160. addToken(i1 - lastOffset,token);
  161. token = Token.NULL;
  162. lastOffset = lastKeyword = i1;
  163. }
  164. else if(c == '\'')
  165. {
  166. addToken(i1 - lastOffset,token);
  167. token = Token.NULL;
  168. lastOffset = lastKeyword = i1;
  169. }
  170. break;
  171. case Token.LITERAL2:
  172. if(backslash)
  173. backslash = false;
  174. else if(c == ']')
  175. {
  176. addToken(i1 - lastOffset,Token.LITERAL2);
  177. token = Token.NULL;
  178. lastOffset = lastKeyword = i1;
  179. }
  180. break;
  181. default:
  182. throw new InternalError("Invalid state: "
  183. + token);
  184. }
  185. }
  186. if(token == Token.NULL)
  187. doKeyword(line,length,'\0');
  188. switch(token)
  189. {
  190. case Token.LITERAL1:
  191. case Token.LITERAL2:
  192. addToken(length - lastOffset,Token.INVALID);
  193. token = Token.NULL;
  194. break;
  195. case Token.KEYWORD2:
  196. addToken(length - lastOffset,token);
  197. if(!backslash)
  198. token = Token.NULL;
  199. default:
  200. addToken(length - lastOffset,token);
  201. break;
  202. }
  203. return token;
  204. }
  205. public static KeywordMap getKeywords()
  206. {
  207. if(libraryKeywords == null)
  208. {
  209. libraryKeywords = new KeywordMap(false);
  210. /* Predicates from BasicLibrary */
  211. libraryKeywords.add("abolish", Token.KEYWORD2);
  212. libraryKeywords.add("add_theory", Token.KEYWORD2);
  213. libraryKeywords.add("agent", Token.KEYWORD2);
  214. libraryKeywords.add("arg", Token.KEYWORD2);
  215. libraryKeywords.add("append", Token.KEYWORD2);
  216. libraryKeywords.add("assert", Token.KEYWORD2);
  217. libraryKeywords.add("asserta", Token.KEYWORD2);
  218. libraryKeywords.add("assertz", Token.KEYWORD2);
  219. libraryKeywords.add("atom", Token.KEYWORD2);
  220. libraryKeywords.add("atomic", Token.KEYWORD2);
  221. libraryKeywords.add("bagof", Token.KEYWORD2);
  222. libraryKeywords.add("call", Token.KEYWORD2);
  223. libraryKeywords.add("clause", Token.KEYWORD2);
  224. libraryKeywords.add("compound", Token.KEYWORD2);
  225. libraryKeywords.add("constant", Token.KEYWORD2);
  226. libraryKeywords.add("copy_term", Token.KEYWORD2);
  227. libraryKeywords.add("current_op", Token.KEYWORD2);
  228. libraryKeywords.add("current_prolog_flag", Token.KEYWORD2);
  229. libraryKeywords.add("delete", Token.KEYWORD2);
  230. libraryKeywords.add("element", Token.KEYWORD2);
  231. libraryKeywords.add("findall", Token.KEYWORD2);
  232. libraryKeywords.add("float", Token.KEYWORD2);
  233. libraryKeywords.add("functor", Token.KEYWORD2);
  234. libraryKeywords.add("get_theory", Token.KEYWORD2);
  235. libraryKeywords.add("ground", Token.KEYWORD2);
  236. libraryKeywords.add("integer", Token.KEYWORD2);
  237. libraryKeywords.add("length", Token.KEYWORD2);
  238. libraryKeywords.add("list", Token.KEYWORD2);
  239. libraryKeywords.add("member", Token.KEYWORD2);
  240. libraryKeywords.add("nonvar", Token.KEYWORD2);
  241. libraryKeywords.add("nospy", Token.KEYWORD1);
  242. libraryKeywords.add("not", Token.KEYWORD2);
  243. libraryKeywords.add("num_atom", Token.KEYWORD2);
  244. libraryKeywords.add("number", Token.KEYWORD2);
  245. libraryKeywords.add("once", Token.KEYWORD2);
  246. libraryKeywords.add("quicksort", Token.KEYWORD2);
  247. libraryKeywords.add("repeat", Token.KEYWORD1);
  248. libraryKeywords.add("retract", Token.KEYWORD2);
  249. libraryKeywords.add("retract_bt", Token.KEYWORD2);
  250. libraryKeywords.add("retract_nb", Token.KEYWORD2);
  251. libraryKeywords.add("reverse", Token.KEYWORD2);
  252. libraryKeywords.add("set_prolog_flag", Token.KEYWORD2);
  253. libraryKeywords.add("set_theory", Token.KEYWORD2);
  254. libraryKeywords.add("setof", Token.KEYWORD2);
  255. libraryKeywords.add("spy", Token.KEYWORD2);
  256. libraryKeywords.add("text_concat", Token.KEYWORD2);
  257. libraryKeywords.add("text_term", Token.KEYWORD2);
  258. libraryKeywords.add("unify_with_occurs_check", Token.KEYWORD2);
  259. libraryKeywords.add("var", Token.KEYWORD2);
  260. /*Castagna 16/09*/
  261. libraryKeywords.add("trace", Token.KEYWORD2);
  262. libraryKeywords.add("notrace", Token.KEYWORD1);
  263. /**/
  264. /* Predicates from ISOLibrary */
  265. libraryKeywords.add("atom_length", Token.KEYWORD2);
  266. libraryKeywords.add("atom_chars", Token.KEYWORD2);
  267. libraryKeywords.add("atom_codes", Token.KEYWORD2);
  268. libraryKeywords.add("atom_concat", Token.KEYWORD2);
  269. libraryKeywords.add("bound", Token.KEYWORD2);
  270. libraryKeywords.add("char_code", Token.KEYWORD2);
  271. libraryKeywords.add("number_chars", Token.KEYWORD2);
  272. libraryKeywords.add("number_codes", Token.KEYWORD2);
  273. libraryKeywords.add("sub_atom", Token.KEYWORD2);
  274. // mathematical functions
  275. libraryKeywords.add("abs", Token.KEYWORD2);
  276. libraryKeywords.add("atan", Token.KEYWORD2);
  277. libraryKeywords.add("ceiling", Token.KEYWORD2);
  278. libraryKeywords.add("cos", Token.KEYWORD2);
  279. libraryKeywords.add("div", Token.KEYWORD2);
  280. libraryKeywords.add("exp", Token.KEYWORD2);
  281. libraryKeywords.add("float_fractional_part", Token.KEYWORD2);
  282. libraryKeywords.add("float_integer_part", Token.KEYWORD2);
  283. libraryKeywords.add("floor", Token.KEYWORD2);
  284. libraryKeywords.add("log", Token.KEYWORD2);
  285. libraryKeywords.add("mod", Token.KEYWORD2);
  286. libraryKeywords.add("rem", Token.KEYWORD2);
  287. libraryKeywords.add("round", Token.KEYWORD2);
  288. libraryKeywords.add("sign", Token.KEYWORD2);
  289. libraryKeywords.add("sin", Token.KEYWORD2);
  290. libraryKeywords.add("sqrt", Token.KEYWORD2);
  291. libraryKeywords.add("truncate", Token.KEYWORD2);
  292. /* Predicates from IOLibrary */
  293. libraryKeywords.add("agent_file", Token.KEYWORD2);
  294. libraryKeywords.add("consult", Token.KEYWORD2);
  295. libraryKeywords.add("get", Token.KEYWORD2);
  296. libraryKeywords.add("get0", Token.KEYWORD2);
  297. libraryKeywords.add("nl", Token.KEYWORD1);
  298. libraryKeywords.add("put", Token.KEYWORD2);
  299. libraryKeywords.add("rand_float", Token.KEYWORD2);
  300. libraryKeywords.add("rand_int", Token.KEYWORD2);
  301. libraryKeywords.add("read", Token.KEYWORD2);
  302. libraryKeywords.add("see", Token.KEYWORD2);
  303. libraryKeywords.add("seeing", Token.KEYWORD2);
  304. libraryKeywords.add("seen", Token.KEYWORD1);
  305. libraryKeywords.add("solve_file", Token.KEYWORD2);
  306. libraryKeywords.add("tab", Token.KEYWORD2);
  307. libraryKeywords.add("tell", Token.KEYWORD2);
  308. libraryKeywords.add("telling", Token.KEYWORD2);
  309. libraryKeywords.add("text_from_file", Token.KEYWORD2);
  310. libraryKeywords.add("told", Token.KEYWORD1);
  311. libraryKeywords.add("write", Token.KEYWORD2);
  312. /* Predicates from JavaLibrary */
  313. libraryKeywords.add("as", Token.KEYWORD2);
  314. libraryKeywords.add("destroy_object", Token.KEYWORD2);
  315. libraryKeywords.add("java_array_get", Token.KEYWORD2);
  316. libraryKeywords.add("java_array_get_boolean", Token.KEYWORD2);
  317. libraryKeywords.add("java_array_get_byte", Token.KEYWORD2);
  318. libraryKeywords.add("java_array_get_char", Token.KEYWORD2);
  319. libraryKeywords.add("java_array_get_double", Token.KEYWORD2);
  320. libraryKeywords.add("java_array_get_float", Token.KEYWORD2);
  321. libraryKeywords.add("java_array_get_int", Token.KEYWORD2);
  322. libraryKeywords.add("java_array_get_long", Token.KEYWORD2);
  323. libraryKeywords.add("java_array_get_short", Token.KEYWORD2);
  324. libraryKeywords.add("java_array_length", Token.KEYWORD2);
  325. libraryKeywords.add("java_array_set", Token.KEYWORD2);
  326. libraryKeywords.add("java_array_set_boolean", Token.KEYWORD2);
  327. libraryKeywords.add("java_array_set_byte", Token.KEYWORD2);
  328. libraryKeywords.add("java_array_set_char", Token.KEYWORD2);
  329. libraryKeywords.add("java_array_set_double", Token.KEYWORD2);
  330. libraryKeywords.add("java_array_set_float", Token.KEYWORD2);
  331. libraryKeywords.add("java_array_set_int", Token.KEYWORD2);
  332. libraryKeywords.add("java_array_set_long", Token.KEYWORD2);
  333. libraryKeywords.add("java_array_set_short", Token.KEYWORD2);
  334. libraryKeywords.add("java_call", Token.KEYWORD2);
  335. libraryKeywords.add("java_class", Token.KEYWORD2);
  336. libraryKeywords.add("java_object", Token.KEYWORD2);
  337. libraryKeywords.add("java_object_bt", Token.KEYWORD2);
  338. libraryKeywords.add("java_object_nb", Token.KEYWORD2);
  339. libraryKeywords.add("java_object_string", Token.KEYWORD2);
  340. libraryKeywords.add("returns", Token.KEYWORD2);
  341. /* other 0-arity predicates not belonging to any particular library */
  342. libraryKeywords.add("!", Token.KEYWORD1);
  343. libraryKeywords.add("at_the_end_of_stream", Token.KEYWORD1);
  344. libraryKeywords.add("fail", Token.KEYWORD1);
  345. libraryKeywords.add("halt", Token.KEYWORD1);
  346. libraryKeywords.add("is", Token.KEYWORD1);
  347. libraryKeywords.add("true", Token.KEYWORD1);
  348. // singleton variable
  349. libraryKeywords.add("_", Token.KEYWORD3);
  350. /* ReSpecT keywords from...? */
  351. /*
  352. libraryKeywords.add("reaction",Token.KEYWORD1);
  353. libraryKeywords.add("out",Token.KEYWORD3);
  354. libraryKeywords.add("in",Token.KEYWORD3);
  355. libraryKeywords.add("rd",Token.KEYWORD3);
  356. libraryKeywords.add("inp",Token.KEYWORD3);
  357. libraryKeywords.add("rdp",Token.KEYWORD3);
  358. libraryKeywords.add("out_r",Token.KEYWORD2);
  359. libraryKeywords.add("in_r",Token.KEYWORD2);
  360. libraryKeywords.add("no_r",Token.KEYWORD2);
  361. libraryKeywords.add("rd_r",Token.KEYWORD2);
  362. libraryKeywords.add("current_op",Token.KEYWORD2);
  363. libraryKeywords.add("current_agent",Token.KEYWORD2);
  364. libraryKeywords.add("current_tc",Token.KEYWORD2);
  365. libraryKeywords.add("pre",Token.KEYWORD2);
  366. libraryKeywords.add("post",Token.KEYWORD2);
  367. libraryKeywords.add("success",Token.KEYWORD2);
  368. libraryKeywords.add("failure",Token.KEYWORD2);
  369. // extensions
  370. libraryKeywords.add("current_time",Token.KEYWORD2);
  371. libraryKeywords.add("is",Token.KEYWORD2);
  372. libraryKeywords.add("spawn",Token.KEYWORD2);
  373. libraryKeywords.add("java",Token.LITERAL1);
  374. libraryKeywords.add("prolog",Token.LITERAL1);
  375. libraryKeywords.add("out_tc",Token.KEYWORD2);
  376. libraryKeywords.add("include",Token.LABEL);
  377. */
  378. }
  379. return libraryKeywords;
  380. }
  381. // private members
  382. private static KeywordMap libraryKeywords;
  383. @SuppressWarnings("unused")
  384. private boolean cpp;
  385. private KeywordMap keywords;
  386. private int lastOffset;
  387. private int lastKeyword;
  388. private boolean doKeyword(Segment line, int i, char c)
  389. {
  390. int i1 = i+1;
  391. int len = i - lastKeyword;
  392. byte id = keywords.lookup(line,lastKeyword,len);
  393. if(id != Token.NULL)
  394. {
  395. if(lastKeyword != lastOffset)
  396. addToken(lastKeyword - lastOffset,Token.NULL);
  397. addToken(len,id);
  398. lastOffset = i;
  399. }
  400. lastKeyword = i1;
  401. return false;
  402. }
  403. }