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

http://github.com/nddrylliog/ooc · Java · 91 lines · 73 code · 18 blank · 0 comment · 19 complexity · ac714c151d2eb9db4508d24033c1d774 MD5 · raw file

  1. package org.ooc.frontend.parser;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.ooc.frontend.model.Include;
  5. import org.ooc.frontend.model.NodeList;
  6. import org.ooc.frontend.model.Include.Define;
  7. import org.ooc.frontend.model.Include.Mode;
  8. import org.ooc.frontend.model.tokens.Token;
  9. import org.ooc.frontend.model.tokens.TokenReader;
  10. import org.ooc.frontend.model.tokens.Token.TokenType;
  11. import org.ubi.CompilationFailedError;
  12. import org.ubi.SourceReader;
  13. public class IncludeParser {
  14. public static boolean fill(SourceReader sReader, TokenReader reader, NodeList<Include> includes) throws CompilationFailedError {
  15. Token startToken = reader.peek();
  16. if(startToken.type != TokenType.INCLUDE_KW) return false;
  17. reader.skip();
  18. StringBuilder sb = new StringBuilder();
  19. List<Define> defines = new ArrayList<Define>();
  20. while(true) {
  21. Token token = reader.read();
  22. if(token.type == TokenType.LINESEP) {
  23. addInclude(includes, sb.toString(), defines, startToken);
  24. break;
  25. }
  26. if(token.type == TokenType.COMMA) {
  27. addInclude(includes, sb.toString(), defines, startToken);
  28. sb.setLength(0);
  29. defines.clear();
  30. } else if(token.type == TokenType.PIPE) {
  31. readDefines(sReader, reader, defines);
  32. } else {
  33. sb.append(token.get(sReader));
  34. }
  35. }
  36. return true;
  37. }
  38. protected static void readDefines(SourceReader sReader, TokenReader reader,
  39. List<Define> defines) throws CompilationFailedError {
  40. if(reader.read().type != TokenType.OPEN_PAREN) {
  41. throw new CompilationFailedError(null, "Expected opening parenthesis to begin include defines, but got "
  42. +reader.prev().type);
  43. }
  44. while(true){
  45. Define define = new Define();
  46. define.name = reader.read().get(sReader);
  47. if(reader.peek().type == TokenType.ASSIGN) {
  48. reader.skip();
  49. define.value = reader.read().get(sReader);
  50. }
  51. defines.add(define);
  52. if(reader.peek().type != TokenType.COMMA) {
  53. break;
  54. }
  55. reader.skip();
  56. }
  57. if(reader.read().type != TokenType.CLOS_PAREN) {
  58. throw new CompilationFailedError(null, "Expected closing parenthesis to end include defines but got "
  59. +reader.prev().type);
  60. }
  61. }
  62. protected static void addInclude(NodeList<Include> includes, String contentParam, List<Define> defines, Token startToken) {
  63. String content = contentParam;
  64. Mode mode = Mode.PATHY;
  65. if(content.startsWith("./")) {
  66. content = content.substring(2);
  67. mode = Mode.LOCAL;
  68. }
  69. Include include = new Include(content, mode, startToken);
  70. include.getDefines().addAll(defines);
  71. includes.add(include);
  72. }
  73. }