Parser.java 4.8 KB

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