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++; } }
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; }
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()); }
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); }