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

http://github.com/nddrylliog/ooc · Java · 72 lines · 56 code · 16 blank · 0 comment · 22 complexity · 2358aed532d077da4f33eb6deb8a1fa2 MD5 · raw file

  1. package org.ooc.frontend.parser;
  2. import org.ooc.frontend.model.Block;
  3. import org.ooc.frontend.model.Conditional;
  4. import org.ooc.frontend.model.Else;
  5. import org.ooc.frontend.model.Expression;
  6. import org.ooc.frontend.model.FlowControl;
  7. import org.ooc.frontend.model.For;
  8. import org.ooc.frontend.model.Foreach;
  9. import org.ooc.frontend.model.Module;
  10. import org.ooc.frontend.model.Return;
  11. import org.ooc.frontend.model.Statement;
  12. import org.ooc.frontend.model.VersionBlock;
  13. import org.ooc.frontend.model.FlowControl.Mode;
  14. import org.ooc.frontend.model.tokens.TokenReader;
  15. import org.ooc.frontend.model.tokens.Token.TokenType;
  16. import org.ubi.CompilationFailedError;
  17. import org.ubi.SourceReader;
  18. public class StatementParser {
  19. public static Statement parse(Module module, SourceReader sReader, TokenReader reader) {
  20. int mark = reader.mark();
  21. Foreach foreach = ForParser.parseForeach(module, sReader, reader);
  22. if(foreach != null) return foreach;
  23. For for1 = ForParser.parseRegularFor(module, sReader, reader);
  24. if(for1 != null) return for1;
  25. Conditional conditional = ConditionalParser.parse(module, sReader, reader);
  26. if(conditional != null) return conditional;
  27. if(reader.peek().type == TokenType.ELSE_KW) {
  28. Else else1 = new Else(reader.read());
  29. ControlStatementFiller.fill(module, sReader, reader, else1.getBody());
  30. return else1;
  31. }
  32. if(reader.peek().type == TokenType.BREAK_KW) return new FlowControl(Mode.BREAK, reader.read());
  33. if(reader.peek().type == TokenType.CONTINUE_KW) return new FlowControl(Mode.CONTINUE, reader.read());
  34. VersionBlock verBlock = VersionBlockParser.parse(module, sReader, reader);
  35. if(verBlock != null) return verBlock;
  36. Return ret = ReturnParser.parse(module, sReader, reader);
  37. if(ret != null) return ret;
  38. Expression expression = ExpressionParser.parse(module, sReader, reader);
  39. if(expression != null) return expression;
  40. if(reader.peek().type == TokenType.OPEN_BRACK) {
  41. Block block = new Block(reader.peek());
  42. reader.skip();
  43. while(reader.peek().type != TokenType.CLOS_BRACK) {
  44. if(!LineParser.fill(module, sReader, reader, block.getBody())) {
  45. throw new CompilationFailedError(sReader.getLocation(reader.peek()),
  46. "Expected lines or '}' in block, but got "+reader.peek());
  47. }
  48. reader.skipWhitespace();
  49. }
  50. reader.skip(); // skip the closing bracket.
  51. return block;
  52. }
  53. reader.reset(mark);
  54. return null;
  55. }
  56. }