Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.53 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. interface Token {}
  5.  
  6. class T_Semicolon implements Token {} // represents ;
  7. class T_LeftBracket implements Token {} // represents (
  8. class T_RightBracket implements Token {} // represents )
  9. class T_EqualDefines implements Token {} // represents =
  10. class T_Equal implements Token {} // represents ==
  11. class T_LessThan implements Token {} // represents <
  12. class T_GreaterThan implements Token {} // represents >
  13. class T_LessEq implements Token {} // represents <=
  14. class T_GreaterEq implements Token {} // represents >=
  15. class T_Comma implements Token {} // represents ,
  16. class T_LeftCurlyBracket implements Token {} // represents {
  17. class T_RightCurlyBracket implements Token {} // represents }
  18. class T_Assign implements Token {} // represents :=
  19. class T_Plus implements Token {} // represents +
  20. class T_Times implements Token {} // represents *
  21. class T_Minus implements Token {} // represents -
  22. class T_Div implements Token {} // represents /
  23. class T_Identifier implements Token { // represents names like x, i, n, numberOfNodes ...
  24. public String s;
  25. public T_Identifier ( String _s ) { s = _s; } }
  26. class T_Integer implements Token { // represents non-negative numbers like 0, 1, 2, 3, ...
  27. public int n;
  28. public T_Integer ( int _n ) { n = _n; } }
  29. class T_Def implements Token {} // represents def
  30. class T_Skip implements Token {} // represents skip
  31. class T_If implements Token {} // represents if
  32. class T_Then implements Token {} // represents then
  33. class T_Else implements Token {} // represents else
  34. class T_While implements Token {} // represents while
  35. class T_Do implements Token {} // represents do
  36. class T_Repeat implements Token {} // represents repeat
  37. class T_Until implements Token {} // represents until
  38. class T_Break implements Token {} // represents break
  39. class T_Continue implements Token {} // represents continue
  40.  
  41. // The next two token classes are auxiliary. They do NOT represent
  42. // language syntax. They may be used in lexer construction, but they
  43. // do not have to be used in the implementation. If you use them, make
  44. // sure they do not appear in the token list that your lexer returns.
  45. // DO NOT REMOVE THEIR CLASS DEFINITIONS FROM YOUR SUBMISSION EVEN IF
  46. // YOU DONT USE THEM.
  47.  
  48. class T_EOF implements Token {}
  49. class T_Error implements Token {
  50. public String msg;
  51. public T_Error ( String _msg ) { msg = _msg; } }
  52.  
  53. // Note that we are using one class per token here. This is good for
  54. // conceptual clarity, but objects instantiating the classes take up a
  55. // lot of memory in Java. For this reason, an industrial strength
  56. // lexer would probably take a different approach and represent token
  57. // by Enums.
  58. /**
  59. *
  60. * @author gs366
  61. */
  62. class LexicalException extends Exception {
  63. public String msg;
  64. public LexicalException ( String _msg ) { msg = _msg; } }
  65.  
  66. class Task2Exception extends Exception {
  67. public String msg;
  68. public Task2Exception ( String _msg ) { msg = _msg; } }
  69.  
  70. interface Lexer {
  71. public List<Token> lex ( String input ) throws LexicalException, Task2Exception; }
  72.  
  73. class Task2other {
  74. public static Lexer create() {
  75. return new Lexer() {
  76. @Override
  77. public List<Token> lex(String input) throws LexicalException, Task2Exception {
  78. String digits = "[0-9]+"; //regular expression for digits
  79. String specials = ";()=<>,{}:+*-/"; //special notations
  80. String identifiers = "[a-z]\\w*"; //regular expression for identifiers
  81. String temp_token = "";
  82. List<Token> tokensList = new ArrayList<>(); //list of tokens
  83. ArrayList<String> token_input = new ArrayList<>(); //list of tokens in input
  84. ArrayList<Character> input_chars = new ArrayList<>(); //list of characters in the input
  85. for(char chars: input.toCharArray()) { //returns an Array of chars after converting a String into sequence of characters
  86. input_chars.add(chars);
  87. }
  88. try {
  89. //this analyses the input and then splits it into tokens
  90. for(char c: input_chars) {
  91. if(specials.indexOf(c) != -1) {
  92. if(c == '=' || c == '<' || c == '>' || c == ':') {
  93. switch (temp_token) {
  94. case "":
  95. temp_token = temp_token + c;
  96. break;
  97. case "=":
  98. case "<":
  99. case ">":
  100. case ":":
  101. temp_token = temp_token + c;
  102. token_input.add(temp_token);
  103. temp_token = "";
  104. break;
  105. default:
  106. token_input.add(temp_token);
  107. token_input.add(Character.toString(c));
  108. break;
  109. }
  110. } else {
  111. if(temp_token.equals("")) {
  112. token_input.add(Character.toString(c));
  113. } else {
  114. token_input.add(temp_token);
  115. temp_token = "";
  116. token_input.add(Character.toString(c));
  117. }
  118. }
  119. } else if(c == ' ') {
  120. if(!temp_token.equals("")) {
  121. token_input.add(temp_token);
  122. temp_token = "";
  123. }
  124. } else {
  125. if(c != ' ') {
  126. temp_token += c;
  127. }
  128. }
  129. }
  130. if(!temp_token.equals("")) {
  131. token_input.add(temp_token);
  132. }
  133. } catch(Exception e) {
  134. throw new Task2Exception("");
  135. }
  136.  
  137. //for each token in the tokenised input create a token object of relevant class for the final list of tokens
  138. for(String token: token_input) {
  139. Token t = null;
  140. if(token.equals(";")) {
  141. t = new T_Semicolon();
  142. }
  143. else if(token.equals("(")) {
  144. t = new T_LeftBracket();
  145. }
  146. else if(token.equals(")")) {
  147. t = new T_RightBracket();
  148. }
  149. else if(token.equals("=")) {
  150. t = new T_EqualDefines();
  151. }
  152. else if(token.equals("==")) {
  153. t = new T_Equal();
  154. }
  155. else if(token.equals("<")) {
  156. t = new T_LessThan();
  157. }
  158. else if(token.equals(">")) {
  159. t = new T_GreaterThan();
  160. }
  161. else if(token.equals("<=")) {
  162. t = new T_LessEq();
  163. }
  164. else if(token.equals(">=")) {
  165. t = new T_GreaterEq();
  166. }
  167. else if(token.equals(",")) {
  168. t = new T_Comma();
  169. }
  170. else if(token.equals("{")) {
  171. t = new T_LeftCurlyBracket();
  172. }
  173. else if(token.equals("}")) {
  174. t = new T_RightCurlyBracket();
  175. }
  176. else if(token.equals(":=")) {
  177. t = new T_Assign();
  178. }
  179. else if(token.equals("+")) {
  180. t = new T_Plus();
  181. }
  182. else if(token.equals("*")) {
  183. t = new T_Times();
  184. }
  185. else if(token.equals("-")) {
  186. t = new T_Minus();
  187. }
  188. else if(token.equals("/")) {
  189. t = new T_Div();
  190. }
  191. else if(token.matches(digits)) {
  192. t = new T_Integer(Integer.parseInt(token));
  193. }
  194. else if(token.matches(identifiers)) {
  195. t = new T_Identifier(token);
  196. }
  197. else if(token.equals("def")) {
  198. t = new T_Def();
  199. }
  200. else if(token.equals("if")) {
  201. t = new T_If();
  202. }
  203. else if(token.equals("then")) {
  204. t = new T_Then();
  205. }
  206. else if(token.equals("else")) {
  207. t = new T_Else();
  208. }
  209. else if(token.equals("skip")) {
  210. t = new T_Skip();
  211. }
  212. else if(token.equals("while")) {
  213. t = new T_While();
  214. }
  215. else if(token.equals("do")) {
  216. t = new T_Do();
  217. }
  218. else if(token.equals("repeat")) {
  219. t = new T_Repeat();
  220. }
  221. else if(token.equals("until")) {
  222. t = new T_Until();
  223. }
  224. else if(token.equals("break")) {
  225. t = new T_Break();
  226. }
  227. else if(token.equals("continue")) {
  228. t = new T_Continue();
  229. }
  230. else {
  231. throw new LexicalException("");
  232. }
  233. tokensList.add(t);
  234.  
  235. if(t instanceof T_Identifier || t instanceof T_Integer) {
  236. System.out.println(t.getClass().getSimpleName() + "(" + token + ")");
  237. }
  238. else {
  239. System.out.println(t.getClass().getSimpleName());
  240. }
  241. }
  242. return tokensList;
  243. }
  244. };
  245. }
  246.  
  247. public static void main(String[] args) throws LexicalException, Task2Exception {
  248. String str = "g{(99;def)+}"; //pass
  249. String strTwo = "until def if then"; //pass
  250. String strThree = "g (;"; //pass
  251. String strFour = "g;{ def if ;";//only accepts the 'g'
  252. String strFive = "G"; // fails which it should
  253. String strSix = "gG_"; // pass
  254. create().lex(strFour);
  255. }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement