Guest User

Untitled

a guest
Jul 22nd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. package pal;
  2.  
  3. public class LexAnal {
  4. String line = null;
  5. int index = 0;
  6. int marker = 0;
  7. String error = "";
  8. String name = "";
  9. String propval = "";
  10. static int EOF = -1;
  11.  
  12. static final int R1 = 1, R2 = 2, R3 = 3, R4 = 4, R5 = 5, R6 = 6;
  13.  
  14. LexAnal(String line) {
  15. line = line.replaceAll("\\(\\\\(?=\\d)", "\u0008");
  16. line = line.replaceAll("\\\\\\.", "\u0001");
  17. line = line.replaceAll("\\\\\\*", "\u0002");
  18. line = line.replaceAll("\\\\\\+", "\u0003");
  19. line = line.replaceAll("\\\\\\(", "\u0004");
  20. line = line.replaceAll("\\\\\\)", "\u0005");
  21. line = line.replaceAll("\\\\\\|", "\u0006");
  22. line = line.replaceAll("\\\\\\\\", "\u0007");
  23. this.line = line;
  24. }
  25.  
  26. protected static boolean isdigit(char X) {
  27. return (X >= '0' && X <= '9');
  28. }
  29.  
  30. protected static boolean isSpecialChar(char X) {
  31. return ((X == '.') || (X == '*') || (X == '+'));
  32. }
  33.  
  34. protected static boolean isReducedASCII(char X) {
  35. return ((X >= 0x01 && X <= 0x0FF) && (X != '\u0008') && (X != '.') && (X != '*') && (X != '+') && (X != '(')
  36. && (X != ')') && (X != '|') && (X != '\\'));
  37. }
  38.  
  39. // set marker and read next character
  40. private int getChar() {
  41. if (index >= line.length())
  42. return EOF;
  43. marker = index;
  44. return line.charAt(index++);
  45. }
  46.  
  47. // set pointer one char back (to marked position)
  48. private void pushBackChar() {
  49. index = marker;
  50. }
  51.  
  52. public void getToken() throws Exception {
  53. char[] tmp = new char[1];
  54. int myChar = 0;
  55. int state = R1;
  56. // String prop = "";
  57. name = "";
  58. propval = "";
  59.  
  60. // read chars and create tokens
  61. try {
  62. do {
  63. // ///////////////////////////////////////////////////////////
  64. myChar = getChar();
  65. if (myChar == EOF && state != R1)
  66. return;
  67. else if (myChar == EOF) {
  68. name = "finished";
  69. return;
  70. }
  71. // throw new Exception("finished");
  72.  
  73. switch (state) {
  74.  
  75. case R1:
  76. if (myChar == '(') { // rule 2
  77. name = "oBracket";
  78. state = R1;
  79. return;
  80. }
  81. if (myChar == ')') { // rule 2
  82. name = "cBracket";
  83. state = R1;
  84. return;
  85. }
  86. if (myChar == 0x08) { // rule 4
  87. name = "brefNum";
  88. state = R2;
  89. pushBackChar();
  90. break;
  91. }
  92. if (isReducedASCII((char) myChar)) { // rule 5
  93. name = "redASCII";
  94. state = R3;
  95. pushBackChar();
  96. break;
  97. }
  98. if (isSpecialChar((char) myChar)) { // rule 6
  99. name = "specChar";
  100. tmp[0] = (char) myChar;
  101. propval = "" + new String(tmp);
  102. state = R1;
  103. return;
  104. }
  105. if (myChar == '|') {
  106. name = "or";
  107. state = R1;
  108. return;
  109. } else {
  110. throw new Exception("bad char");
  111. }
  112.  
  113. case R2:
  114. if (isdigit((char) myChar)) {
  115. tmp[0] = (char) myChar;
  116. propval = propval + new String(tmp);
  117. break;
  118. } else if (myChar == ')') {
  119. state = R1;
  120. return;
  121. } else {
  122. new Exception("lexerror");
  123. }
  124. break;
  125.  
  126. case R3:
  127. if (isReducedASCII((char) myChar)) {
  128. tmp[0] = (char) myChar;
  129. propval = propval + new String(tmp);
  130. break;
  131. } else {
  132. pushBackChar();
  133. state = R1;
  134. return;
  135. }
  136. }
  137. // ///////////////////////////////////////////////////////////
  138. } while (true);
  139.  
  140. } catch (Exception e) {
  141. if (e.getMessage().equals("finished"))
  142. throw new Exception("finished");
  143. tmp[0]=(char)myChar;
  144. error = "Found \"" + new String(tmp) + "\" expected something else";
  145. System.out.println(error);
  146. throw new Exception("lexerror");
  147. }
  148. }
  149.  
  150. public static void main(String[] args) {
  151. // LexAnal la = new LexAnal("\\. \\. \\| j\\\\ \\+ \\(");
  152. // LexAnal la = new LexAnal("((xdss|y)+)=(\\2)");
  153. LexAnal la = new LexAnal("***");
  154. // LexAnal la = new LexAnal("(((\\(1\\))))");
  155. try {
  156. while (true) {
  157. la.getToken();
  158. System.out.println(String.format("%s %s", la.name, la.propval));
  159. if(la.name.equals("finished")){
  160. break;
  161. }
  162. }
  163. } catch (Exception e) {
  164. System.out.println(e.getMessage());
  165. }
  166.  
  167. }
  168. }
Add Comment
Please, Sign In to add comment