Beispiel #1
0
        public static TypeDefinitionNode Type(string name, params TypeLabel[] labels)
        {
            var node = new TypeDefinitionNode {
                Name = name
            };

            foreach (var curr in labels)
            {
                node.Entries.Add(curr);
            }
            return(node);
        }
Beispiel #2
0
        /// <summary>
        /// Declares a new type.
        /// </summary>
        private void declareType(TypeDefinitionNode node)
        {
            if (node.Name == "_")
            {
                Error(CompilerMessages.UnderscoreName);
            }

            var mainType = CreateType(node.Name, prepare: false);

            mainType.Kind = TypeEntityKind.Type;

            foreach (var curr in node.Entries)
            {
                var tagName   = curr.Name;
                var labelType = CreateType(tagName, node.Name, isSealed: true, defaultCtor: false, prepare: false);
                labelType.Kind = TypeEntityKind.TypeLabel;

                var ctor = labelType.CreateConstructor(prepare: false);
                ctor.Kind = TypeContentsKind.AutoGenerated;
                if (curr.IsTagged)
                {
                    var tagField = labelType.CreateField("Tag", curr.TagType, prepare: false);
                    tagField.Kind = TypeContentsKind.UserDefined;

                    var args = new HashList <FunctionArgument> {
                        { "value", new FunctionArgument("value", curr.TagType) }
                    };

                    var staticCtor = MainType.CreateMethod(tagName, tagName, new string[0], isStatic: true, prepare: false);
                    staticCtor.Kind = TypeContentsKind.AutoGenerated;

                    ctor.Arguments = staticCtor.Arguments = args;
                    ctor.Body.Add(
                        Expr.SetMember(Expr.This(), "Tag", Expr.Get("value"))
                        );

                    staticCtor.Body.Add(
                        Expr.New(tagName, Expr.Get("value"))
                        );
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// type_def                                    = "type" identifier INDENT type_stmt { type_stmt } DEDENT
        /// </summary>
        private TypeDefinitionNode parseTypeDef()
        {
            if (!check(LexemType.Type))
                return null;

            var node = new TypeDefinitionNode();

            node.Name = ensure(LexemType.Identifier, ParserMessages.TypeIdentifierExpected).Value;
            ensure(LexemType.Indent, ParserMessages.TypeIndentExpected);

            var field = bind(parseTypeStmt);
            node.Entries.Add(field);

            while (!check(LexemType.Dedent))
            {
                ensure(LexemType.NewLine, ParserMessages.TypeSeparatorExpected);
                field = bind(parseTypeStmt);
                node.Entries.Add(field);
            }

            return node;
        }
Beispiel #4
0
 private void Visit(TypeDefinitionNode node)
 {
     Console.WriteLine($"Define Type: {node.Name}");
     Visit(node.TypeBody);
 }
Beispiel #5
0
        /// <summary>
        /// Declares a new type.
        /// </summary>
        private void declareType(TypeDefinitionNode node)
        {
            if (node.Name == "_")
                Error(CompilerMessages.UnderscoreName);

            var mainType = CreateType(node.Name, prepare: false);
            mainType.Kind = TypeEntityKind.Type;

            foreach (var curr in node.Entries)
            {
                var tagName = curr.Name;
                var labelType = CreateType(tagName, node.Name, isSealed: true, defaultCtor: false, prepare: false);
                labelType.Kind = TypeEntityKind.TypeLabel;

                var ctor = labelType.CreateConstructor(prepare: false);
                ctor.Kind = TypeContentsKind.AutoGenerated;
                if (curr.IsTagged)
                {
                    var tagField = labelType.CreateField("Tag", curr.TagType, prepare: false);
                    tagField.Kind = TypeContentsKind.UserDefined;

                    var args = new HashList<FunctionArgument> { { "value", new FunctionArgument("value", curr.TagType) } };

                    var staticCtor = MainType.CreateMethod(tagName, tagName, new string[0], isStatic: true, prepare: false);
                    staticCtor.Kind = TypeContentsKind.AutoGenerated;

                    ctor.Arguments = staticCtor.Arguments = args;
                    ctor.Body.Add(
                        Expr.SetMember(Expr.This(), "Tag", Expr.Get("value"))
                    );

                    staticCtor.Body.Add(
                        Expr.New(tagName, Expr.Get("value"))
                    );
                }
            }
        }