Exemplo n.º 1
0
        public void Visit(ListLiteralNode node)
        {
            builder.AppendLine($"\t\tldc.i4 {node.Count()}");
            string listType    = "";
            string elementType = "";

            if (node[0] is IntLiteralNode)
            {
                listType    = "int32";
                elementType = "i4";
            }
            else if (node[0] is BoolLiteralNode)
            {
                listType    = "bool";
                elementType = "i4";
            }
            else if (node[0] is StringLiteralNode)
            {
                listType    = "string";
                elementType = "ref";
            }
            builder.AppendLine($"\t\tnewarr {listType}");
            int index = 0;

            foreach (var n in node)
            {
                builder.AppendLine("\t\tdup");
                builder.AppendLine($"\t\tldc.i4 {index}");
                Visit((dynamic)n);

                builder.AppendLine($"\t\tstelem.{elementType}");
                index++;
            }
        }
Exemplo n.º 2
0
        public Type Visit(ListLiteralNode node)
        {
            if (node.Count() == 0)
            {
                return(Type.LIST);
            }
            Type first = Visit((dynamic)node[0]);

            foreach (var n in node)
            {
                Type t = Visit((dynamic)n);
                if (t != first)
                {
                    throw new SemanticError("All elements of a list should be the same tipe, "
                                            + $"expected {first} but got {t}", n.AnchorToken);
                }
            }
            return(first.ToListType());
        }