Example #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++;
            }
        }
Example #2
0
 public Node List()
 {
     var list_node = new ListLiteralNode();
     Expect(TokenCategory.CURLY_OPEN);
     var nodes = Optional(simpleLiterals, () =>
                 {
                     list_node.Add(Node.fromToken(Expect(simpleLiterals)));
                     return ZeroOrMore(TokenCategory.COMMA, SimpleLiteral, true);
                 });
     list_node.Add(nodes);
     Expect(TokenCategory.CURLY_CLOSE);
     return list_node;
 }
Example #3
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());
        }
Example #4
0
        public Node List()
        {
            var listLiteral = new ListLiteralNode();

            if (CurrentToken == TokenCategory.KEY_OPEN)
            {
                Expect(TokenCategory.KEY_OPEN);
                var litList = SimpleLiteral();
                while (CurrentToken == TokenCategory.COMMA)
                {
                    var commaNode = new Identifier()
                    {
                        AnchorToken = Expect(TokenCategory.COMMA)
                    };
                    commaNode.Add(litList);
                    commaNode.Add(SimpleLiteral());

                    litList = commaNode;
                }
                listLiteral.Add(litList);
                Expect(TokenCategory.KEY_CLOSE);
            }
            if (CurrentToken == TokenCategory.BRACKETS_OPEN)
            {
                Expect(TokenCategory.BRACKETS_OPEN);
                if (CurrentToken != TokenCategory.IDENTIFIER)
                {
                    var litList = SimpleLiteral();
                    while (CurrentToken == TokenCategory.COMMA)
                    {
                        var commaNode = new Identifier()
                        {
                            AnchorToken = Expect(TokenCategory.COMMA)
                        };
                        commaNode.Add(litList);
                        commaNode.Add(SimpleLiteral());

                        litList = commaNode;
                    }
                    listLiteral.Add(litList);
                }
                else
                {
                    var expList = Expression();
                    while (CurrentToken == TokenCategory.COMMA)
                    {
                        var commaNode = new Identifier()
                        {
                            AnchorToken = Expect(TokenCategory.COMMA)
                        };
                        commaNode.Add(expList);
                        commaNode.Add(Expression());

                        expList = commaNode;
                    }
                    listLiteral.Add(expList);
                }

                Expect(TokenCategory.BRACKETS_CLOSE);
            }

            return(listLiteral);
        }