// <-- STRUCT NAME GenericDecl LINE StructBody END private void Struct(Namespace namespaceObj) { Consume(TokenType.Struct); var name = Consume(TokenType.Name); var typeParams = TypeParams(); Consume(TokenType.Line); var fields = StructFields(); Consume(TokenType.End); var structure = new Struct(name.Position, name.StringValue, fields); if (typeParams.Count == 0) { namespaceObj.Structs.Add(structure); } else { namespaceObj.GenericStructs.Add(new GenericStruct(structure, typeParams)); } }
// <-- UNION NAME GenericDecl LINE UnionBody END private void Union(Namespace namespaceObj) { Consume(TokenType.Union); var name = Consume(TokenType.Name); var typeParams = TypeParams(); Consume(TokenType.Line); var cases = UnionCases(); Consume(TokenType.End); var union = new Union(name.Position, name.StringValue, cases); if (typeParams.Count == 0) { namespaceObj.Unions.Add(union); } else { namespaceObj.GenericUnions.Add(new GenericUnion(union, typeParams)); } }
// <-- OPERATOR FunctionDefinition private void Operator(Namespace namespaceObj) { var token = Consume(TokenType.Operator); FunctionDefinition(namespaceObj, token.StringValue, token.Position); }
// <-- ((Namespace | Function | Struct | Union) LINE)* private List<object> NamespaceContents(Namespace namespaceObj) { List<object> contents = new List<object>(); while (true) { if (CurrentIs(TokenType.Namespace)) namespaceObj.Namespaces.Add(Namespace()); else if (CurrentIs(TokenType.Name)) Function(namespaceObj); else if (CurrentIs(TokenType.Operator)) Operator(namespaceObj); else if (CurrentIs(TokenType.Struct)) Struct(namespaceObj); else if (CurrentIs(TokenType.Union)) Union(namespaceObj); else break; if (!ConsumeIf(TokenType.Line)) break; } return contents; }
// <-- NAMESPACE Name LINE NamespaceBody END private Namespace Namespace() { Consume(TokenType.Namespace); var name = Consume(TokenType.Name).StringValue; Consume(TokenType.Line); var namespaceObj = new Namespace(name); var contents = NamespaceContents(namespaceObj); Consume(TokenType.End); return namespaceObj; }
// <-- GenericDecl FnArgsDecl Block private void FunctionDefinition(Namespace namespaceObj, string name, Position position) { var typeParams = TypeParams(); var paramNames = new List<string>(); var funcType = FnArgsDecl(paramNames); var body = Block(); var function = new Function(position, name, funcType, paramNames, body); if (typeParams.Count == 0) { namespaceObj.Functions.Add(function); } else { namespaceObj.GenericFunctions.Add(new GenericFunction(function, typeParams)); } }
// <-- OPERATOR FunctionDefinition private void Operator(Namespace namespaceObj) { var token = Consume(TokenType.Operator); FunctionDefinition(namespaceObj, token.StringValue, token.Position); }