void parseEnum() { Token identifier = parseData.tokens[parseData.cursor + 1]; if (identifier.type != TT.IDENTIFIER) { throw Jolly.unexpected(identifier); } Token brace = parseData.tokens[parseData.cursor + 2]; if (brace.type != TT.BRACE_OPEN) { throw Jolly.unexpected(brace); } parseData.cursor += 3; AST_Struct enumNode = new AST_Struct(token.location); // Use struct node for now DataType_Enum enumType = new DataType_Enum(); SymbolTable enumTable = new SymbolTable(scope); // enumNode.inherits = inherits; enumNode.nodeType = NT.ENUM; enumNode.symbol = enumTable; enumNode.text = enumType.name = identifier.text; enumNode.result = enumTable.declaration = new IR { irType = NT.ENUM, dType = enumType, dKind = ValueKind.STATIC_TYPE }; scope.addChild(identifier.text, enumTable); parseData.ast.Add(enumNode); int startNodeCount = parseData.ast.Count; var parser = new ExpressionParser(parseData, TT.BRACE_CLOSE, enumTable, DefineMode.EXPRESSION, brace.partnerIndex) .parse(false); AST_Node[] memberNodes = (parser.getValue() as AST_Tuple)?.values.ToArray() ?? new AST_Node[] { parser.getValue() }; enumNode.memberCount = parseData.ast.Count - startNodeCount; int nextValue = 0; foreach (var memberNode in memberNodes) { if (memberNode.nodeType != NT.NAME) { throw Jolly.unexpected(memberNode); } var symbol = new Symbol(enumTable) { declaration = new IR_Literal { dType = enumType, data = nextValue++ } }; enumTable.addChild(((AST_Symbol)memberNode).text, symbol); } }
void parseStruct() { Token name = parseData.tokens[parseData.cursor += 1]; if (name.type != TT.IDENTIFIER) { throw Jolly.unexpected(token); } Token next = parseData.tokens[parseData.cursor += 1]; AST_Struct structNode = new AST_Struct(token.location); DataType_Struct structType = new DataType_Struct(); SymbolTable structTable = new SymbolTable(scope); structNode.index = parseData.ast.Count; parseData.ast.Add(structNode); int startNodeCount = parseData.ast.Count; if (next.type == TT.LESS) { parseData.cursor += 1; new ExpressionParser(parseData, TT.GREATER, structTable, DefineMode.TEMPLATE, end) .parse(false); next = parseData.tokens[parseData.cursor += 1]; // Skip greater than } if (next.type == TT.COLON) { parseData.cursor += 1; structNode.inherits = new ExpressionParser(parseData, TT.BRACE_OPEN, structTable, DefineMode.EXPRESSION, end) .parse(false) .getValue(); next = parseData.tokens[parseData.cursor]; } if (next.type != TT.BRACE_OPEN) { throw Jolly.unexpected(next); } structNode.symbol = structTable; structNode.text = structType.name = name.text; structNode.result = structTable.declaration = new IR { irType = NT.STRUCT, dType = structType, dKind = ValueKind.STATIC_TYPE }; scope.addChild(name.text, structTable); parseData.cursor += 1; new ScopeParser(parseData, next.partnerIndex, structTable) .parse(ScopeParseMethod.STRUCT); structNode.memberCount = parseData.ast.Count - startNodeCount; structType.members = new DataType[structType.memberMap.Count]; }