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

http://github.com/nddrylliog/ooc · Java · 143 lines · 125 code · 18 blank · 0 comment · 48 complexity · 95e2656cc9970654dc81d504b6af63dd MD5 · raw file

  1. package org.ooc.frontend.parser;
  2. import org.ooc.frontend.model.Expression;
  3. import org.ooc.frontend.model.Module;
  4. import org.ooc.frontend.model.Node;
  5. import org.ooc.frontend.model.NodeList;
  6. import org.ooc.frontend.model.Type;
  7. import org.ooc.frontend.model.VariableDecl;
  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 VariableDeclParser {
  14. public static Node parseMulti(Module module, SourceReader sReader, TokenReader reader) {
  15. int mark = reader.mark();
  16. Token tName = reader.peek();
  17. if(!tName.isNameToken()) {
  18. reader.reset(mark);
  19. return null;
  20. }
  21. Token declStartToken = reader.peek();
  22. NodeList<VariableDecl> decls = new NodeList<VariableDecl>(declStartToken);
  23. Token atomStartToken;
  24. while((atomStartToken = reader.peek()).isNameToken()) {
  25. String name = reader.read().get(sReader);
  26. Expression expr = null;
  27. if(reader.peek().type == TokenType.ASSIGN) {
  28. reader.skip();
  29. expr = ExpressionParser.parse(module, sReader, reader, true);
  30. if(expr == null) {
  31. throw new CompilationFailedError(sReader.getLocation(reader.prev()),
  32. "Expected expression as an initializer to a variable declaration.");
  33. }
  34. } else if(reader.peek().type == TokenType.DECL_ASSIGN) {
  35. reader.skip();
  36. boolean isConst = false, isStatic = false;
  37. while(true) {
  38. Token kw = reader.peek();
  39. if(kw.type == TokenType.CONST_KW) {
  40. reader.skip();
  41. isConst = true;
  42. } else if(kw.type == TokenType.STATIC_KW) {
  43. reader.skip();
  44. isStatic = true;
  45. } else break;
  46. }
  47. expr = ExpressionParser.parse(module, sReader, reader);
  48. if(expr == null) {
  49. throw new CompilationFailedError(sReader.getLocation(reader.prev()),
  50. "Expected expression as an initializer to a variable declaration.");
  51. }
  52. VariableDecl vdfe = new VariableDecl(null, name, expr, atomStartToken, module);
  53. vdfe.setConst(isConst);
  54. vdfe.setStatic(isStatic);
  55. return vdfe;
  56. }
  57. VariableDecl vd = new VariableDecl(null, name, expr, atomStartToken, module);
  58. decls.add(vd);
  59. if(reader.peek().type != TokenType.COMMA) break;
  60. reader.skip();
  61. reader.skipWhitespace();
  62. }
  63. if(reader.read().type != TokenType.COLON) {
  64. reader.reset(mark);
  65. return null;
  66. }
  67. boolean isStatic = false;
  68. boolean isProto = false;
  69. String externName = null;
  70. String unmangledName = null;
  71. while(true) {
  72. Token t = reader.peek();
  73. if(t.type == TokenType.STATIC_KW) {
  74. isStatic = true;
  75. reader.skip();
  76. } else if(t.type == TokenType.PROTO_KW) {
  77. isProto = true;
  78. reader.skip();
  79. } else if(t.type == TokenType.EXTERN_KW) {
  80. externName = ExternParser.parse(sReader, reader);
  81. } else if(t.type == TokenType.UNMANGLED_KW) {
  82. unmangledName = UnmangledParser.parse(sReader, reader);
  83. } else {
  84. break;
  85. }
  86. }
  87. Type type = TypeParser.parse(module, sReader, reader);
  88. if(type == null) {
  89. reader.reset(mark);
  90. return null;
  91. }
  92. if(decls.size() == 1 && decls.getFirst().getExpression() == null) {
  93. if(reader.peek().type == TokenType.ASSIGN) {
  94. reader.skip();
  95. Expression expr = ExpressionParser.parse(module, sReader, reader);
  96. if(expr == null) {
  97. throw new CompilationFailedError(sReader.getLocation(reader.prev()),
  98. "Expected expression as an initializer to a variable declaration.");
  99. }
  100. decls.getFirst().setExpression(expr);
  101. }
  102. }
  103. for(VariableDecl decl : decls) {
  104. decl.setType(type);
  105. decl.setStatic(isStatic);
  106. decl.setProto(isProto);
  107. decl.setExternName(externName);
  108. decl.setUnmangledName(unmangledName);
  109. }
  110. if(decls.size() == 1) {
  111. return decls.getFirst();
  112. }
  113. return decls;
  114. }
  115. public static VariableDecl parseSingle(Module module, SourceReader sReader,
  116. TokenReader reader) {
  117. int mark = reader.mark();
  118. Node node = parseMulti(module, sReader, reader);
  119. if(node == null || !(node instanceof VariableDecl)) {
  120. reader.reset(mark);
  121. return null;
  122. }
  123. return (VariableDecl) node;
  124. }
  125. }