Parser.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package de.jplag.chars;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.nio.charset.StandardCharsets;
  5. import de.jplag.AbstractParser;
  6. import de.jplag.TokenConstants;
  7. import de.jplag.TokenList;
  8. public class Parser extends AbstractParser implements TokenConstants {
  9. private TokenList struct;
  10. public TokenList parse(File dir, String files[]) {
  11. struct = new TokenList();
  12. errors = 0;
  13. for (String file : files) {
  14. getErrorConsumer().print(null, "Parsing file " + file);
  15. if (!parseFile(dir, file))
  16. errors++;
  17. struct.addToken(new CharToken(FILE_END, file, this));
  18. }
  19. if (errors == 0)
  20. errorConsumer.print(null, "OK");
  21. else
  22. errorConsumer.print(null, errors + " ERROR" + (errors > 1 ? "S" : ""));
  23. this.parseEnd();
  24. return struct;
  25. }
  26. private boolean parseFile(File dir, String file) {
  27. char[] buffer = new char[4096];
  28. int type;
  29. int length;
  30. int offset = 0;
  31. try {
  32. FileReader reader = new FileReader(new File(dir, file), StandardCharsets.UTF_8);
  33. do {
  34. length = reader.read(buffer);
  35. for (int i = 0; i < length; i++) {
  36. if (buffer[i] <= 127 && (type = mapping[buffer[i]]) > 1) {
  37. struct.addToken(new CharToken(type, file, offset + i, buffer[i], this));
  38. }
  39. }
  40. offset += length;
  41. } while (length != -1);
  42. // close file
  43. reader.close();
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. return false;
  47. }
  48. return true;
  49. }
  50. private int[] mapping = {-1, // 0 (nul)
  51. -1, // 1 (soh)
  52. -1, // 2 (stx)
  53. -1, // 3 (etx)
  54. -1, // 4 (eot)
  55. -1, // 5 (enq)
  56. -1, // 6 (ack)
  57. -1, // 7 (bel)
  58. -1, // 8 (bs)
  59. -1, // 9 (ht)
  60. -1, // 10 (nl)
  61. -1, // 11 (vt)
  62. -1, // 12 (np)
  63. -1, // 13 (cr)
  64. -1, // 14 (so)
  65. -1, // 15 (si)
  66. -1, // 16 (dle)
  67. -1, // 17 (dc1)
  68. -1, // 18 (dc2)
  69. -1, // 19 (dc3)
  70. -1, // 20 (dc4)
  71. -1, // 21 (nak)
  72. -1, // 22 (syn)
  73. -1, // 23 (etb)
  74. -1, // 24 (can)
  75. -1, // 25 (em)
  76. -1, // 26 (sub)
  77. -1, // 27 (esc)
  78. -1, // 28 (fs)
  79. -1, // 29 (gs)
  80. -1, // 30 (rs)
  81. -1, // 31 (us)
  82. -1, // 32 (sp)
  83. -1, // 33 !
  84. -1, // 34 "
  85. -1, // 35 #
  86. -1, // 36 $
  87. -1, // 37 %
  88. -1, // 38 &
  89. -1, // 39 '
  90. -1, // 40 (
  91. -1, // 41 )
  92. -1, // 42 *
  93. -1, // 43 +
  94. -1, // 44 ,
  95. -1, // 45 -
  96. -1, // 46 .
  97. -1, // 47 /
  98. 27, // 48 0
  99. 28, // 49 1
  100. 29, // 50 2
  101. 30, // 51 3
  102. 31, // 52 4
  103. 32, // 53 5
  104. 33, // 54 6
  105. 34, // 55 7
  106. 35, // 56 8
  107. 36, // 57 9
  108. -1, // 58 :
  109. -1, // 59 ;
  110. -1, // 60 <
  111. -1, // 61 =
  112. -1, // 62 >
  113. -1, // 63 ?
  114. -1, // 64 @
  115. 2, // 65 A
  116. 3, // 66 B
  117. 4, // 67 C
  118. 5, // 68 D
  119. 6, // 69 E
  120. 7, // 70 F
  121. 8, // 71 G
  122. 9, // 72 H
  123. 10, // 73 I
  124. 11, // 74 J
  125. 12, // 75 K
  126. 13, // 76 L
  127. 14, // 77 M
  128. 15, // 78 N
  129. 16, // 79 O
  130. 17, // 80 P
  131. 18, // 81 Q
  132. 19, // 82 R
  133. 20, // 83 S
  134. 21, // 84 T
  135. 22, // 85 U
  136. 23, // 86 V
  137. 24, // 87 W
  138. 25, // 88 X
  139. 26, // 89 Y
  140. 27, // 90 Z
  141. -1, // 91 [
  142. -1, // 92 \
  143. -1, // 93 ]
  144. -1, // 94 ^
  145. -1, // 95 _
  146. -1, // 96 `
  147. 2, // 97 a
  148. 3, // 98 b
  149. 4, // 99 c
  150. 5, // 100 d
  151. 6, // 101 e
  152. 7, // 102 f
  153. 8, // 103 g
  154. 9, // 104 h
  155. 10, // 105 i
  156. 11, // 106 j
  157. 12, // 107 k
  158. 13, // 108 l
  159. 14, // 109 m
  160. 15, // 110 n
  161. 16, // 111 o
  162. 17, // 112 p
  163. 18, // 113 q
  164. 19, // 114 r
  165. 20, // 115 s
  166. 21, // 116 t
  167. 22, // 117 u
  168. 23, // 118 v
  169. 24, // 119 w
  170. 25, // 120 x
  171. 26, // 121 y
  172. 27, // 122 z
  173. -1, // 123 {
  174. -1, // 124 |
  175. -1, // 125 }
  176. -1, // 126 ~
  177. -1, // 127 (del)
  178. };
  179. }