lots of exercises in java... from https://github.com/exercism/java

Token.java 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import java.util.Arrays;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import java.util.stream.Collectors;
  5. class Token {
  6. static class OpDefToken extends Token {
  7. static OpDefToken opDefTokenFromString(final String string) {
  8. final String trimmedLine = string.substring(2, string.length() - 2);
  9. final int newOpEnd = trimmedLine.indexOf(" ");
  10. if (newOpEnd == -1) {
  11. throw new IllegalArgumentException("Incomplete operation definition");
  12. }
  13. final Token newOpToken = Token.fromString(trimmedLine.substring(0, newOpEnd)).get(0);
  14. if (!(newOpToken instanceof OpToken)) {
  15. throw new IllegalArgumentException("Cannot redefine numbers");
  16. }
  17. final List<Token> newOpDefTokens = Token.fromString(trimmedLine.substring(newOpEnd + 1));
  18. return new OpDefToken(((OpToken) newOpToken).getOp(), newOpDefTokens);
  19. }
  20. private final String newOp;
  21. private final List<Token> newOpDefTokens;
  22. private OpDefToken(final String newOp, final List<Token> newOpDefTokens) {
  23. this.newOp = newOp;
  24. this.newOpDefTokens = newOpDefTokens;
  25. }
  26. String getNewOp() {
  27. return newOp;
  28. }
  29. List<Token> getNewOpDefTokens() {
  30. return newOpDefTokens;
  31. }
  32. }
  33. static class OpToken extends Token {
  34. private final String op;
  35. OpToken(final String op) {
  36. this.op = op;
  37. }
  38. String getOp() {
  39. return op;
  40. }
  41. }
  42. static class IntToken extends Token {
  43. private final int rawValue;
  44. IntToken(final int rawValue) {
  45. this.rawValue = rawValue;
  46. }
  47. int getRawValue() {
  48. return rawValue;
  49. }
  50. }
  51. static List<Token> fromString(final String string) {
  52. if (string.startsWith(":")) {
  53. return Collections.singletonList(OpDefToken.opDefTokenFromString(string));
  54. } else if (string.matches("[A-z+/*\\-]+(?:-[A-z+/*\\-]+)*")) {
  55. return Collections.singletonList(new OpToken(string.toLowerCase()));
  56. } else if (string.matches("\\d+")) {
  57. return Collections.singletonList(new IntToken(Integer.parseInt(string)));
  58. } else {
  59. return Arrays.stream(string.split(" "))
  60. .map(Token::fromString)
  61. .flatMap(List::stream)
  62. .collect(Collectors.toList());
  63. }
  64. }
  65. }