/src/org/ooc/frontend/parser/MatchParser.java

http://github.com/nddrylliog/ooc · Java · 73 lines · 57 code · 15 blank · 1 comment · 12 complexity · 022195398022a6e7702f5a90eb9b4ca9 MD5 · raw file

  1. package org.ooc.frontend.parser;
  2. import org.ooc.frontend.model.Case;
  3. import org.ooc.frontend.model.Expression;
  4. import org.ooc.frontend.model.Match;
  5. import org.ooc.frontend.model.Module;
  6. import org.ooc.frontend.model.tokens.Token;
  7. import org.ooc.frontend.model.tokens.TokenReader;
  8. import org.ooc.frontend.model.tokens.Token.TokenType;
  9. import org.ubi.CompilationFailedError;
  10. import org.ubi.SourceReader;
  11. public class MatchParser {
  12. public static Match parse(Module module, SourceReader sReader, TokenReader reader) {
  13. Token startToken = reader.peek();
  14. if(startToken.type != TokenType.MATCH_KW) return null;
  15. reader.skip();
  16. Expression expr = ExpressionParser.parse(module, sReader, reader, true);
  17. reader.skipWhitespace();
  18. if(reader.peek().type != TokenType.OPEN_BRACK) {
  19. throw new CompilationFailedError(sReader.getLocation(reader.peek()), "Expected a '{' after match.");
  20. }
  21. reader.skip();
  22. Match match = new Match(expr, startToken);
  23. while(true) {
  24. reader.skipWhitespace();
  25. Token token = reader.peek();
  26. if(token.type == TokenType.CLOS_BRACK) {
  27. reader.skip();
  28. break;
  29. }
  30. boolean isFallthrough = false;
  31. if(token.type == TokenType.FALLTHR_KW) {
  32. isFallthrough = true;
  33. reader.skip();
  34. reader.skipWhitespace();
  35. token = reader.peek();
  36. }
  37. if(token.type == TokenType.CASE_KW) {
  38. reader.skip();
  39. Expression caseExpr = ExpressionParser.parse(module, sReader, reader, true);
  40. reader.skipWhitespace();
  41. if(reader.peek().type != TokenType.DOUBLE_ARROW) {
  42. throw new CompilationFailedError(sReader.getLocation(token), "Unexpected token "+reader.peek()
  43. +" Expected a '=>' after a case.");
  44. }
  45. reader.skip();
  46. Case case1 = new Case(caseExpr, match, isFallthrough, token);
  47. while(LineParser.fill(module, sReader, reader, case1.getBody())) {
  48. // well, continue as long as we can find lines
  49. }
  50. match.getCases().add(case1);
  51. continue;
  52. }
  53. throw new CompilationFailedError(sReader.getLocation(token), "Unexpected token "+token
  54. +" Expected either a '}' or a case.");
  55. }
  56. return match;
  57. }
  58. }